Binary file bin/data/roadstops.grf has changed
--- a/config.lib Wed Feb 14 10:46:38 2007 +0000
+++ b/config.lib Sat Feb 17 11:12:50 2007 +0000
@@ -52,11 +52,12 @@
with_iconv="1"
with_midi=""
with_midi_arg=""
+ with_libtimidity="1"
with_freetype="1"
with_fontconfig="1"
with_psp_config="1"
- save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip lipo os revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir custom_lang_dir second_data_dir enable_install enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_osx_sysroot enable_universal enable_osx_g5 with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_freetype with_fontconfig with_psp_config CC CXX CFLAGS LDFLAGS"
+ save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip lipo os revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir custom_lang_dir second_data_dir enable_install enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_osx_sysroot enable_universal enable_osx_g5 with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_libtimidity with_freetype with_fontconfig with_psp_config CC CXX CFLAGS LDFLAGS"
}
detect_params() {
@@ -184,6 +185,10 @@
--without-libpng) with_png="0";;
--with-libpng=*) with_png="$optarg";;
+ --with-libtimidity) with_libtimidity="2";;
+ --without-libtimidity) with_libtimidity="0";;
+ --with-libtimidity=*) with_libtimidity="$optarg";;
+
--with-freetype) with_freetype="2";;
--without-freetype) with_freetype="0";;
--with-freetype=*) with_freetype="$optarg";;
@@ -421,6 +426,7 @@
detect_fontconfig
detect_iconv
detect_pspconfig
+ detect_libtimidity
if [ "$with_direct_music" = "1" ] || [ "$with_direct_music" = "2" ]; then
if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then
@@ -776,6 +782,15 @@
CFLAGS="$CFLAGS -DWIN32_ENABLE_DIRECTMUSIC_SUPPORT"
fi
+ if [ -n "$libtimidity" ]; then
+ if [ "$enable_static" != "0" ]; then
+ LIBS="$LIBS $libtimidity"
+ else
+ LIBS="$LIBS -ltimidity"
+ fi
+ CFLAGS="$CFLAGS -DLIBTIMIDITY"
+ fi
+
if [ "$with_iconv" != "0" ]; then
CFLAGS="$CFLAGS -DWITH_ICONV"
LIBS="$LIBS -liconv"
@@ -1273,65 +1288,78 @@
log 1 "checking COCOA... found"
}
-detect_zlib() {
+detect_library() {
+ # $1 - config-param ($with_zlib value)
+ # $2 - library name ('zlib', sets $zlib)
+ # $3 - static library name (libz.a)
+ # $4 - header name (zlib.h)
+
# 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_zlib" = "0" ]; then
- log 1 "checking zlib... disabled"
+ if [ "$1" = "0" ]; then
+ log 1 "checking $2... disabled"
- zlib=""
+ eval "$2=\"\""
return 0
fi
- log 2 "detecting zlib"
+ log 2 "detecting $2"
- if [ "$with_zlib" = "1" ] || [ "$with_zlib" = "" ] || [ "$with_zlib" = "2" ]; then
- zlib=`ls -1 /usr/include/*.h 2>/dev/null | grep "\/zlib.h$"`
- if [ -z "$zlib" ]; then
- log 2 " trying /usr/include/zlib.h... no"
- zlib=`ls -1 /usr/local/include/*.h 2>/dev/null | grep "\/zlib.h$"`
+ if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then
+ eval "$2=`ls -1 /usr/include/*.h 2>/dev/null | grep \"\/$4\$\"`"
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 2 " trying /usr/include/$4... no"
+ eval "$2=`ls -1 /usr/local/include/*.h 2>/dev/null | grep \"\/$4\$\"`"
fi
- if [ -z "$zlib" ]; then
- log 2 " trying /usr/local/include/zlib.h... no"
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 2 " trying /usr/local/include/$4... no"
fi
- if [ -n "$zlib" ] && [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then
- log 2 " trying $zlib... found"
+ eval "res=\$$2"
+ if [ -n "$res" ] && [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then
+ eval "res=\$$2"
+ log 2 " trying $res... found"
# Now find the static lib, if needed
- zlib=`ls /lib/*.a 2>/dev/null | grep "\/libz.a$"`
- if [ -z "$zlib" ]; then
- log 2 " trying /lib/libz.a... no"
- zlib=`ls /usr/lib/*.a 2>/dev/null | grep "\/libz.a$"`
+ eval "$2=`ls /lib/*.a 2>/dev/null | grep \"\/$3\$\"`"
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 2 " trying /lib/$3... no"
+ eval "$2=`ls /usr/lib/*.a 2>/dev/null | grep \"\/$3\$\"`"
fi
- if [ -z "$zlib" ]; then
- log 2 " trying /usr/lib/libz.a... no"
- zlib=`ls /usr/local/lib/*.a 2>/dev/null | grep "\/libz.a$"`
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 2 " trying /usr/lib/$3... no"
+ eval "$2=`ls /usr/local/lib/*.a 2>/dev/null | grep \"\/$3\$\"`"
fi
- if [ -z "$zlib" ]; then
- log 2 " trying /usr/local/lib/libz.a... no"
- log 1 "configure: error: zlib couldn't be found"
- log 1 "configure: error: you requested a static link, but I can't find zlib.a"
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 2 " trying /usr/local/lib/$3... no"
+ log 1 "configure: error: $2 couldn't be found"
+ log 1 "configure: error: you requested a static link, but I can't find $3"
exit 1
fi
fi
else
# Make sure it exists
- if [ -f "$with_zlib" ]; then
- zlib=`ls $with_zlib 2>/dev/null`
+ if [ -f "$1" ]; then
+ eval "$2=`ls $1 2>/dev/null`"
else
- zlib=`ls $with_zlib/libz.a 2>/dev/null`
+ eval "$2=`ls $1/$3 2>/dev/null`"
fi
fi
- if [ -z "$zlib" ]; then
- log 1 "checking zlib... not found"
- if [ "$with_zlib" = "2" ]; then
- log 1 "configure: error: zlib couldn't be found"
+ eval "res=\$$2"
+ if [ -z "$res" ]; then
+ log 1 "checking $2... not found"
+ if [ "$1" = "2" ]; then
+ log 1 "configure: error: $2 couldn't be found"
exit 1
- elif [ "$with_zlib" != "1" ]; then
- log 1 "configure: error: zlib couldn't be found"
- log 1 "configure: error: you supplied '$with_zlib', but it seems invalid"
+ elif [ "$1" != "1" ]; then
+ log 1 "configure: error: $2 couldn't be found"
+ log 1 "configure: error: you supplied '$1', but it seems invalid"
exit 1
fi
@@ -1339,9 +1367,18 @@
return 0
fi
- log 2 " trying $zlib... found"
+ eval "res=\$$2"
+ log 2 " trying $res... found"
- log 1 "checking zlib... found"
+ log 1 "checking $2... found"
+}
+
+detect_zlib() {
+ detect_library "$with_zlib" "zlib" "libz.a" "zlib.h"
+}
+
+detect_libtimidity() {
+ detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "timidity.h"
}
detect_png() {
--- a/configure Wed Feb 14 10:46:38 2007 +0000
+++ b/configure Sat Feb 17 11:12:50 2007 +0000
@@ -82,6 +82,7 @@
if ($0 == "WINCE" && "'$os'" != "WINCE") { next; }
if ($0 == "MSVC" && "'$os'" != "MSVC") { next; }
if ($0 == "DIRECTMUSIC" && "'$with_direct_music'" == "0") { next; }
+ if ($0 == "LIBTIMIDITY" && "'$libtimidity'" == "" ) { next; }
skip += 1;
--- a/docs/landscape.html Wed Feb 14 10:46:38 2007 +0000
+++ b/docs/landscape.html Sat Feb 17 11:12:50 2007 +0000
@@ -1,351 +1,426 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
+
<head>
-<meta name="Author" content="Marcin Grzegorczyk">
-<meta name="Description" content="Structure of OpenTTD (OTTD) landscape arrays">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<title>OpenTTD Landscape Internals</title>
+ <meta name="Author" content="Marcin Grzegorczyk">
+ <meta name="Description" content="Structure of OpenTTD (OTTD) landscape arrays">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>OpenTTD Landscape Internals</title>
+</head>
-</head>
<body>
-<h3><a name="Landscape">Landscape</a></h3>
-<p> Seven attributes (counting "type_height") hold the informations
- about a tile. These attributes are referred to as "<span style="font-weight: bold;">type_height</span>",
+ <h3><a name="Landscape">Landscape</a></h3>
+ <p>Seven attributes (counting "type_height") hold the informations about a tile.<BR>
+ These attributes are referred to as
+ "<span style="font-weight: bold;">type_height</span>",
"<span style="font-weight: bold;">m1</span>", "<span style="font-weight: bold;">m2</span>",
"<span style="font-weight: bold;">m3</span>", "<span style="font-weight: bold;">m4</span>",
- "<span style="font-weight: bold;">m5</span>" and "<span style="font-weight: bold;">m6</span>".
+ "<span style="font-weight: bold;">m5</span>" and "<span style="font-weight: bold;">m6</span>".<BR>
The most important value is the class of a tile, stored in the upper 4 bits
of the type_height array. The lower 4 bits are used to encode the height and
- slope data. For a graphical representation of the tile-layout have a look at
- <a href="landscape_grid.html">Landscape grid</a> page. </p>
-
-<p><a name="OwnershipInfo">The owner of a tile</a>, as frequently associated with attribute m1, can be either players (human or AI) or "Game entities".
-They are identified using:
-<ul>
- <li>00 = current player</li>
- <li>01..08 = AI or network players</li>
- <li>0F = a town owns the tile</li>
- <li>10 = nobody owns the tile</li>
- <li>11 = "water" owns the tile</li>
- <li>FF = spectator in MP or in scenario editor</li>
-</ul>
-
-<p>OTTD's class-specific periodic tile processing routine is called once every +256 ticks for each tile.</p>
-
-<table border=1 cellpadding=3>
-<tr><th align=left>Class</th><th align=left>Meaning & details of encoding</th></tr>
-
-<tr><td valign=top nowrap><a name="Class0"><tt> 0 </tt></a></td><td>
-<ul>
-<li>m5 bits 4..0: tile type:
-<table>
-<tr><td nowrap valign=top><tt>00</tt> </td><td align=left>bare land</td></tr>
-<tr><td nowrap valign=top><tt>01</tt> </td><td align=left>1/3 grass</td></tr>
-<tr><td nowrap valign=top><tt>02</tt> </td><td align=left>2/3 grass</td></tr>
-<tr><td nowrap valign=top><tt>03</tt> </td><td align=left>full grass</td></tr>
-<tr><td nowrap valign=top><tt>07</tt> </td><td align=left>rough land</td></tr>
-<tr><td nowrap valign=top><tt>0B</tt> </td><td align=left>rocks</td></tr>
-<tr><td nowrap valign=top><tt>0F</tt> </td><td align=left>fields; type of fields in m3 bits 3..0 (legal values: 0 through 9)<br>
- m2: Index into the array of industries (farms), INVALID_INDUSTRY (0xFFFF) if farm has been removed </td>
-</tr>
-<tr><td nowrap valign=top><tt>10</tt> </td><td align=left>1/4 snow</td></tr>
-<tr><td nowrap valign=top><tt>11</tt> </td><td align=left>2/4 snow</td></tr>
-<tr><td nowrap valign=top><tt>12</tt> </td><td align=left>3/4 snow</td></tr>
-<tr><td nowrap valign=top><tt>13</tt> </td><td align=left>full snow</td></tr>
-<tr><td nowrap valign=top><tt>15</tt> </td><td align=left>partial desert</td></tr>
-<tr><td nowrap valign=top><tt>17</tt> </td><td align=left>full desert</td></tr>
-</table>
-</li>
-<li>m5 bits 7..5: update counter, incremented on every periodic processing for tile types other than <tt>03</tt>, <tt>07</tt>, <tt>0B</tt> and <tt>10</tt> and above, on wraparound the tile is updated (for fields, the type of fields in m3 is increased, for other types the tile type in m5 is increased)
-<br>(for snow and desert, these bits are not used, tile is updated on every periodic processing)
-</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the tile (normally <tt>10</tt>)
-</li>
-<li>m4 bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none); bits 4..2: same for the SE border
-</li>
-</ul>
-</td></tr>
-
-<tr><td valign=top nowrap><a name="Class1"><tt> 1 </tt></a></td><td>
-m5 bit 7 clear: railway track
-<ul>
-<li>m5 bits 0..5: track layout: bit set = track present:
-<table>
-<tr><td nowrap valign=top>bit 0: </td><td align=left>in the X direction</td></tr>
-<tr><td nowrap valign=top>bit 1: </td><td align=left>in the Y direction</td></tr>
-<tr><td nowrap valign=top>bit 2: </td><td align=left>in the north corner (direction W-E)</td></tr>
-<tr><td nowrap valign=top>bit 3: </td><td align=left>in the south corner (direction W-E)</td></tr>
-<tr><td nowrap valign=top>bit 4: </td><td align=left>in the west corner (direction N-S)</td></tr>
-<tr><td nowrap valign=top>bit 5: </td><td align=left>in the east corner (direction N-S)</td></tr>
-</table></li>
-<li>m5 bit 6 set = with signals:
-<ul>
-<li>m3 bits 7..4: bit set = signal present:
-<ul>
-<li>For track in the X direction:
-<table>
-<tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the SW direction</td></tr>
-<tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the NE direction</td></tr>
-</table></li>
-<li>For track in the Y direction:
-<table>
-<tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the NW direction</td></tr>
-<tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the SE direction</td></tr>
-</table></li>
-<li>For tracks in the W-E direction:
-<table>
-<tr><td nowrap valign=top>bit 4: </td><td align=left>signal in the W direction on the track in the S corner</td></tr>
-<tr><td nowrap valign=top>bit 5: </td><td align=left>signal in the E direction on the track in the S corner</td></tr>
-<tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the W direction on the track in the N corner</td></tr>
-<tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the E direction on the track in the N corner</td></tr>
-</table></li>
-<li>For tracks in the N-S direction:
-<table>
-<tr><td nowrap valign=top>bit 4: </td><td align=left>signal in the S direction on the track in the E corner</td></tr>
-<tr><td nowrap valign=top>bit 5: </td><td align=left>signal in the N direction on the track in the E corner</td></tr>
-<tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the S direction on the track in the W corner</td></tr>
-<tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the N direction on the track in the W corner</td></tr>
-</table></li>
-</ul></li>
-<li>m2 bits 7..4: bit clear = signal shows red; same bits as in m3</li>
-<li>OpenTTD bits in m4:
-<table>
-<tr><td nowrap valign=top>bits 1..0: </td><td align=left>type of signal:</td></tr>
-<tr><td nowrap valign=top><tt>00</tt>: </td><td align=left>normal signals</td></tr>
-<tr><td nowrap valign=top><tt>01</tt>: </td><td align=left>pre-signals</td></tr>
-<tr><td nowrap valign=top><tt>10</tt>: </td><td align=left>exit-signals</td></tr>
-<tr><td nowrap valign=top><tt>11</tt>: </td><td align=left>combo-signals</td></tr>
-<tr><td nowrap valign=top>bit 2: </td><td align=left>set = semaphore signals, clear = light signals</td></tr>
-</table></li>
-</ul></li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the track
-</li>
-<li>m2 bits 0..3:
-<table>
-<tr><td nowrap valign=top><tt>0</tt> </td><td align=left>on bare land</td></tr>
-<tr><td nowrap valign=top><tt>1</tt> </td><td align=left>on grass, no fences</td></tr>
-<tr><td nowrap valign=top><tt>2</tt> </td><td align=left>fence on the NW side</td></tr>
-<tr><td nowrap valign=top><tt>3</tt> </td><td align=left>fence on the SE side</td></tr>
-<tr><td nowrap valign=top><tt>4</tt> </td><td align=left>fences on the NW and SE sides</td></tr>
-<tr><td nowrap valign=top><tt>5</tt> </td><td align=left>fence on the NE side</td></tr>
-<tr><td nowrap valign=top><tt>6</tt> </td><td align=left>fence on the SW side</td></tr>
-<tr><td nowrap valign=top><tt>7</tt> </td><td align=left>fences on the NE and SW sides</td></tr>
-<tr><td nowrap valign=top><tt>8</tt> </td><td align=left>fence on the E side (track in the W corner)</td></tr>
-<tr><td nowrap valign=top><tt>9</tt> </td><td align=left>fence on the W side (track in the E corner)</td></tr>
-<tr><td nowrap valign=top><tt>A</tt> </td><td align=left>fence on the S side (track in the N corner)</td></tr>
-<tr><td nowrap valign=top><tt>B</tt> </td><td align=left>fence on the N side (track in the S corner)</td></tr>
-<tr><td nowrap valign=top><tt>C</tt> </td><td align=left>on snow or desert</td></tr>
-</table></li>
-<li>m3 bits 0..3 = <a name="TrackType">track type</a>: <tt>0</tt> - conventional railway, <tt>1</tt> - electrified railway, <tt>2</tt> - monorail, <tt>3</tt> - maglev
-</ul>
-m5 bits 7 and 6 set: railway depot / checkpoints
-<ul>
-<li>m5 value C0..C3: railway depot
-<br>m5 bits 1..0 - direction: exit towards: <tt>00</tt> = NE, <tt>01</tt> = SE, <tt>02</tt> = SW, <tt>03</tt> = NW</li>
-<li>m5 value C4..C5: checkpoint
-<br>bit 0: clear = in X direction, set = in Y direction
-<br>
-<br>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the depot / checkpoint</li>
-<li>m2: For waypoints, index into the array of waypoints.</li>
-<li>m3 bits 0..3 = <a href="#TrackType">track type</a></li>
-<li>m4 bits 0..3 = ground type, as per m2 bits 0..3 for railway tiles.</li>
-</ul>
-</td></tr>
+ slope data.<BR>
+ For a graphical representation of the tile-layout have a look at
+ <a href="landscape_grid.html">Landscape grid</a> page.
+ </p>
-<tr><td valign=top nowrap><a name="Class2"><tt> 2 </tt></a></td><td>
-m5 bits 7..4 clear: road
-<ul>
-<li>m5 bits 3..0: road layout: bit set = road piece present:
-<table>
-<tr><td nowrap valign=top>bit 0: </td><td align=left>NW piece</td></tr>
-<tr><td nowrap valign=top>bit 1: </td><td align=left>SW piece</td></tr>
-<tr><td nowrap valign=top>bit 2: </td><td align=left>SE piece</td></tr>
-<tr><td nowrap valign=top>bit 3: </td><td align=left>NE piece</td></tr>
-</table></li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the road</li>
-<li>m2: Index into the array of towns, 0 for non-town roads</li>
-<li>m4 bits 0..3: counter for the roadworks</li>
-<li>m4 bits 4..6: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> - paved, <tt>3</tt> - with streetlights, <tt>5</tt> - tree-lined, <tt>6</tt> - on grass with road works, <tt>7</tt> - paved with road works</li>
-<li>m4 bit 7 set = on snow or desert</li>
-</ul>
-m5 bit 4 set, bits 7..5 clear: level crossing
-<ul>
-<li>m5 bit 3: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular)</li>
-<li>m5 bit 2: set if crossing lights are on</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the railway track</li>
-<li>m2: Index into the array of towns, 0 for non-town roads</li>
-<li>m3 bits 0..7: <a href="#OwnershipInfo">owner</a> of the road</li>
-<li>m4 bits 3..0: <a href="#TrackType">track type</a></li>
-<li>m4 bits 4..6: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> or higher - paved</li>
-<li>m4 bit 7 set = on snow or desert</li>
-</ul>
-m5 bit 5 set: road depot
-<ul>
-<li>m5 bits 3..0 - direction: exit towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the depot</li>
-<li>m4 bit 7 set = on snow or desert (not displayed, but set internally)</li>
-</ul>
-</td></tr>
+ <p>The <a name="OwnershipInfo">owner of a tile</a>, as frequently associated with attribute m1,
+ can be either players (human or AI) or "Game entities".
+ They are identified using:
+ <table>
+ <tr><td><tt>00</tt> </td><td align=left>current player</td></tr>
+ <tr><td><tt>01..08</tt> </td><td align=left>AI or network players</td></tr>
+ <tr><td><tt>0F</tt> </td><td align=left>a town owns the tile</td></tr>
+ <tr><td><tt>10</tt> </td><td align=left>nobody owns the tile</td></tr>
+ <tr><td><tt>11</tt> </td><td align=left>"water" owns the tile</td></tr>
+ <tr><td><tt>FF</tt> </td><td align=left>spectator in MP or in scenario editor</td></tr>
+ </table></p>
-<tr><td valign=top nowrap><a name="Class3"><tt> 3 </tt></a></td><td>
-Town building
-<ul>
-<li>m2: Index into the array of towns</li>
-<li>m4: <a name="HouseTypes">town building type</a>:
-<p><small>Note: In the climate list, 'sub-arctic' means below the snow line, and 'snow' means above the snow line in the sub-arctic climate.</small></p>
-<table>
-<tr><th align=left>Type </th><th align=left>Size </th><th align=left>Climates </th><th align=left>Description</th></tr>
-<tr><td nowrap valign=top><tt>00</tt> </td><td>1×1</td><td>temperate</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>01</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block</td></tr>
-<tr><td nowrap valign=top><tt>02</tt> </td><td>1×1</td><td>temperate</td><td align=left>small block of flats</td></tr>
-<tr><td nowrap valign=top><tt>03</tt> </td><td>1×1</td><td>temperate</td><td align=left>church</td></tr>
-<tr><td nowrap valign=top><tt>04</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>large office block</td></tr>
-<tr><td nowrap valign=top><tt>05</tt> </td><td>1×1</td><td>snow</td><td align=left>large office block</td></tr>
-<tr><td nowrap valign=top><tt>06</tt> </td><td>1×1</td><td>temperate</td><td align=left>town houses</td></tr>
-<tr><td nowrap valign=top><tt>07</tt>..<tt>08</tt> </td><td>1×2</td><td>temperate</td><td align=left>hotel</td></tr>
-<tr><td nowrap valign=top><tt>09</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical </td><td align=left>statue</td></tr>
-<tr><td nowrap valign=top><tt>0A</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>fountain</td></tr>
-<tr><td nowrap valign=top><tt>0B</tt> </td><td>1×1</td><td>temperate</td><td align=left>park (with a pond)</td></tr>
-<tr><td nowrap valign=top><tt>0C</tt> </td><td>1×1</td><td>temperate</td><td align=left>park (with an alley)</td></tr>
-<tr><td nowrap valign=top><tt>0D</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block</td></tr>
-<tr><td nowrap valign=top><tt>0E</tt>..<tt>10</tt> </td><td>1×1</td><td>temperate</td><td align=left>various types of shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>11</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>modern office building</td></tr>
-<tr><td nowrap valign=top><tt>12</tt> </td><td>1×1</td><td>temperate</td><td align=left>warehouse</td></tr>
-<tr><td nowrap valign=top><tt>13</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block (with spiral stairway on the side)</td></tr>
-<tr><td nowrap valign=top><tt>14</tt>..<tt>17</tt> </td><td>2×2</td><td>temperate</td><td align=left>stadium</td></tr>
-<tr><td nowrap valign=top><tt>18</tt> </td><td>1×1</td><td>temperate</td><td align=left>old houses</td></tr>
-<tr><td nowrap valign=top><tt>19</tt> </td><td>1×1</td><td>temperate</td><td align=left>cottages</td></tr>
-<tr><td nowrap valign=top><tt>1A</tt> </td><td>1×1</td><td>temperate</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>1B</tt> </td><td>1×1</td><td>temperate</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>1C</tt> </td><td>1×1</td><td>temperate</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>1D</tt> </td><td>1×1</td><td>temperate</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>1E</tt> </td><td>1×1</td><td>temperate, sub-tropical</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>1F</tt> </td><td>1×1</td><td>temperate</td><td align=left>theatre</td></tr>
-<tr><td nowrap valign=top><tt>20</tt>..<tt>23</tt> </td><td>2×2</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>stadium (modern style)</td></tr>
-<tr><td nowrap valign=top><tt>24</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>offices (the modern 'vertical tube' style)</td></tr>
-<tr><td nowrap valign=top><tt>25</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>26</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>27</tt> </td><td>1×1</td><td>temperate</td><td align=left>cinema</td></tr>
-<tr><td nowrap valign=top><tt>28</tt>..<tt>2B</tt> </td><td>2×2</td><td>temperate</td><td align=left>shopping mall</td></tr>
-<tr><td nowrap valign=top><tt>2C</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>2D</tt> </td><td>1×1</td><td>snow</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>2E</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>2F</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>30</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>31</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>32</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>33</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>34</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>35</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>36</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>37</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>38</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>39</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>3A</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>3B</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>3C</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>church</td></tr>
-<tr><td nowrap valign=top><tt>3D</tt> </td><td>1×1</td><td>snow</td><td align=left>church</td></tr>
-<tr><td nowrap valign=top><tt>3E</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>3F</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>40</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>41</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>42</tt>..<tt>43</tt> </td><td>1×2</td><td>sub-arctic</td><td align=left>hotel</td></tr>
-<tr><td nowrap valign=top><tt>44</tt>..<tt>45</tt> </td><td>1×2</td><td>snow</td><td align=left>hotel</td></tr>
-<tr><td nowrap valign=top><tt>46</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>47</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>48</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>49</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>4A</tt>..<tt>4B</tt> </td><td>2×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>4C</tt>..<tt>4D</tt> </td><td>2×1</td><td>snow</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>4E</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (with a tree in a corner)</td></tr>
-<tr><td nowrap valign=top><tt>4F</tt>, <tt>50</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses</td></tr>
-<tr><td nowrap valign=top><tt>51</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (suburb-type)</td></tr>
-<tr><td nowrap valign=top><tt>52</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>53</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>church</td></tr>
-<tr><td nowrap valign=top><tt>54</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (with two trees in front)</td></tr>
-<tr><td nowrap valign=top><tt>55</tt>, <tt>56</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>57</tt>..<tt>58</tt> </td><td>2×1</td><td>sub-tropical</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>59</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
-<tr><td nowrap valign=top><tt>5A</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>5B</tt> </td><td>1×1</td><td>toyland</td><td align=left>church</td></tr>
-<tr><td nowrap valign=top><tt>5C</tt>..<tt>61</tt> </td><td>1×1</td><td>toyland</td><td align=left>various types of toyland houses</td></tr>
-<tr><td nowrap valign=top><tt>62</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>63</tt>..<tt>64</tt> </td><td>1×2</td><td>toyland</td><td align=left>houses ('shoe' style)</td></tr>
-<tr><td nowrap valign=top><tt>65</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>66</tt> </td><td>1×1</td><td>toyland</td><td align=left>igloo</td></tr>
-<tr><td nowrap valign=top><tt>67</tt> </td><td>1×1</td><td>toyland</td><td align=left>tepees</td></tr>
-<tr><td nowrap valign=top><tt>68</tt>, <tt>69</tt> </td><td>1×1</td><td>toyland</td><td align=left>shops and offices</td></tr>
-<tr><td nowrap valign=top><tt>6A</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
-<tr><td nowrap valign=top><tt>6B</tt> </td><td>1×1</td><td>toyland</td><td align=left>statue</td></tr>
-<tr><td nowrap valign=top><tt>6C</tt> </td><td>1×1</td><td>toyland</td><td align=left>teapot-house</td></tr>
-<tr><td nowrap valign=top><tt>6D</tt> </td><td>1×1</td><td>toyland</td><td align=left>piggy-bank</td></tr>
-<tr><td colspan=2></td></tr> <!-- spacer -- -- (and I don't mean a walk) -->
-</table></li>
-<li>m3 bits 7..6: stage of construction (<tt>3</tt> = completed)</li>
-<li>m5 bits 2..0: construction counter, for buildings under construction incremented on every periodic tile processing, on wraparound the stage of construction in m3 is increased</li>
-<li>for large office blocks (types <tt>04</tt> and <tt>05</tt>):
-<ul>
-<li>m1 bits 6..0: position of the lift</li>
-<li>m1 bit 7: if set the lift is moving</li>
-<li>m5 bit 7: if set then m5 bits 5..0 hold the destination floor of the lift, which could be 0..6, except 1, so the building has 6 effective floors. This due to the fact that the first floor is 2 'normal' floors high. One 'normal' floor has a height of 6 lift positions.</li>
-</ul></li>
-</ul>
-</td></tr>
+ <p>OTTD's class-specific periodic tile processing routine is called once every +256 ticks for each tile.</p>
-<tr><td valign=top nowrap><a name="Class4"><tt> 4 </tt></a></td><td>
-Trees
-<ul>
-<li>m5 bits 7..6: number of trees minus one</li>
-<li>m5 bits 2..0: growth status: <tt>0</tt>..<tt>2</tt> - one of trees is growing, <tt>3</tt> - all trees are fully grown, <tt>4</tt>..<tt>6</tt> - one of trees is withering</li>
-<li>m3 bits 7..0: type of trees:
-<table>
-<tr><td nowrap valign=top><tt>00</tt>..<tt>0B</tt> </td><td align=left>temperate climate trees</td></tr>
-<tr><td nowrap valign=top><tt>0C</tt>..<tt>13</tt> </td><td align=left>sub-arctic climate trees</td></tr>
-<tr><td nowrap valign=top><tt>14</tt>..<tt>1A</tt> </td><td align=left>rainforest trees</td></tr>
-<tr><td nowrap valign=top><tt>1B</tt> </td><td align=left>cactus plants</td></tr>
-<tr><td nowrap valign=top><tt>1C</tt>..<tt>1F</tt> </td><td align=left>sub-tropical climate, non-rainforest, non-desert trees</td></tr>
-<tr><td nowrap valign=top><tt>20</tt>..<tt>28</tt> </td><td align=left>toyland trees</td></tr>
-</table>
-(note: the actually displayed set of trees depends on both type and number of trees)
-</li>
-<li>m4 bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none)</li>
-<li>m4 bits 4..2: type of hedge on the SE border of the tile (1 through 6, or 0=none)</li>
-<li>m2 bits 5..4:
-<table>
-<tr><td nowrap valign=top><tt>0</tt> </td><td align=left>on grass</td></tr>
-<tr><td nowrap valign=top><tt>1</tt> </td><td align=left>on rough land</td></tr>
-<tr><td nowrap valign=top><tt>2</tt> </td><td align=left>on snow or desert; m2 bits 7..6 - amount of snow or desert (for desert always set to 3 in TTD)
-</td></tr>
-</table></li>
-<li>m2 bits 3..0: update counter, incremented on every periodic processing, on wraparound the growth status is updated (or, if it's <tt>3</tt>, a random action is taken)</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> (normally <tt>10</tt>)</li>
-</ul>
-</td></tr>
+ <table border=1 cellpadding=3>
+ <tr><th align=left>Class</th><th align=left>Meaning & details of encoding</th></tr>
-<tr><td valign=top nowrap><a name="Class5"><tt> 5 </tt></a></td><td>
-Station tile
-<ul>
-<li>m5: tile type:
-<table>
-<tr><td nowrap valign=top><tt>00</tt>..<tt>07</tt> </td><td align=left>railway station
-<br><tt>00</tt>..<tt>01</tt> - open platform, <tt>02</tt>..<tt>03</tt> - open platform with station building, <tt>04</tt>....<tt>07</tt> - roofed platform
-<br>bit 0: clear = in X direction, set = in Y direction
-</td></tr>
-<tr><td nowrap valign=top><tt>08</tt>..<tt>33</tt> </td><td align=left>large airport
-<table>
-<tr><td nowrap valign=top><tt>0B</tt> </td><td align=left>pad 1</td></tr>
-<tr><td nowrap valign=top><tt>16</tt>..<tt>19</tt> </td><td align=left>runway middle</td></tr>
-<tr><td nowrap valign=top><tt>1A</tt> </td><td align=left>runway ending</td></tr>
-<tr><td nowrap valign=top><tt>1C</tt> </td><td align=left>control tower</td></tr>
-<tr><td nowrap valign=top><tt>20</tt> </td><td align=left>hangar</td></tr>
-<tr><td nowrap valign=top><tt>21</tt> </td><td align=left>pad 3</td></tr>
-<tr><td nowrap valign=top><tt>22</tt> </td><td align=left>pad 2</td></tr>
-<tr><td nowrap valign=top><tt>27</tt>..<tt>32</tt> </td><td align=left>radar (animated)</td></tr>
-<tr><td nowrap valign=top><tt>33</tt> </td><td align=left>transmitter</td></tr>
-</table>
-The initial layout of a large airport is (rows in Y direction, columns in X direction):
+ <tr>
+ <td valign=top nowrap><a name="Class0"><tt> 0 </tt></a></td>
+ <td>
+ <ul>
+ <li>m5 bits 4..0: tile type:
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt> </td><td align=left>bare land</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt> </td><td align=left>1/3 grass</td></tr>
+ <tr><td nowrap valign=top><tt>02</tt> </td><td align=left>2/3 grass</td></tr>
+ <tr><td nowrap valign=top><tt>03</tt> </td><td align=left>full grass</td></tr>
+ <tr><td nowrap valign=top><tt>07</tt> </td><td align=left>rough land</td></tr>
+ <tr><td nowrap valign=top><tt>0B</tt> </td><td align=left>rocks</td></tr>
+ <tr><td nowrap valign=top><tt>0F</tt> </td><td align=left>fields; type of fields in m3 bits 3..0 (legal values: 0 through 9)<br>
+ m2: Index into the array of industries (farms), INVALID_INDUSTRY (0xFFFF) if farm has been removed</td></tr>
+ <tr><td nowrap valign=top><tt>10</tt> </td><td align=left>1/4 snow</td></tr>
+ <tr><td nowrap valign=top><tt>11</tt> </td><td align=left>2/4 snow</td></tr>
+ <tr><td nowrap valign=top><tt>12</tt> </td><td align=left>3/4 snow</td></tr>
+ <tr><td nowrap valign=top><tt>13</tt> </td><td align=left>full snow</td></tr>
+ <tr><td nowrap valign=top><tt>15</tt> </td><td align=left>partial desert</td></tr>
+ <tr><td nowrap valign=top><tt>17</tt> </td><td align=left>full desert</td></tr>
+ </table>
+ </li>
+ <li>m5 bits 7..5: update counter, incremented on every periodic processing for tile types,
+ other than <tt>03</tt>, <tt>07</tt>, <tt>0B</tt>, <tt>10</tt> and above.<BR>
+ on wraparound, the tile is updated (for fields, the type of fields in m3 is increased, for other types the tile type in m5 is increased).<BR>
+ For snow and desert, these bits are not used, tile is updated on every periodic processing.
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the tile (normally <tt>10</tt>)</li>
+ <li>m4 bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none); bits 4..2: same for the SE border</li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class1"><tt> 1 </tt></a></td>
+ <td>
+ <ul>
+ <li>m5 bit 7 clear: railway track
+ <ul>
+ <li>m5 bits 0..5: track layout: bit set = track present:
+ <table>
+ <tr><td nowrap valign=top>bit 0: </td><td align=left>in the X direction</td></tr>
+ <tr><td nowrap valign=top>bit 1: </td><td align=left>in the Y direction</td></tr>
+ <tr><td nowrap valign=top>bit 2: </td><td align=left>in the north corner (direction W-E)</td></tr>
+ <tr><td nowrap valign=top>bit 3: </td><td align=left>in the south corner (direction W-E)</td></tr>
+ <tr><td nowrap valign=top>bit 4: </td><td align=left>in the west corner (direction N-S)</td></tr>
+ <tr><td nowrap valign=top>bit 5: </td><td align=left>in the east corner (direction N-S)</td></tr>
+ </table>
+ </li>
+ <li>m5 bit 6 set = with signals:
+ <ul>
+ <li>m3 bits 7..4: bit set = signal present:
+ <ul>
+ <li>For track in the X direction:
+ <table>
+ <tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the SW direction</td></tr>
+ <tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the NE direction</td></tr>
+ </table>
+ </li>
+ <li>For track in the Y direction:
+ <table>
+ <tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the NW direction</td></tr>
+ <tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the SE direction</td></tr>
+ </table>
+ </li>
+ <li>For tracks in the W-E direction:
+ <table>
+ <tr><td nowrap valign=top>bit 4: </td><td align=left>signal in the W direction on the track in the S corner</td></tr>
+ <tr><td nowrap valign=top>bit 5: </td><td align=left>signal in the E direction on the track in the S corner</td></tr>
+ <tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the W direction on the track in the N corner</td></tr>
+ <tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the E direction on the track in the N corner</td></tr>
+ </table>
+ </li>
+ <li>For tracks in the N-S direction:
+ <table>
+ <tr><td nowrap valign=top>bit 4: </td><td align=left>signal in the S direction on the track in the E corner</td></tr>
+ <tr><td nowrap valign=top>bit 5: </td><td align=left>signal in the N direction on the track in the E corner</td></tr>
+ <tr><td nowrap valign=top>bit 6: </td><td align=left>signal in the S direction on the track in the W corner</td></tr>
+ <tr><td nowrap valign=top>bit 7: </td><td align=left>signal in the N direction on the track in the W corner</td></tr>
+ </table>
+ </li>
+ </ul>
+ </li>
+ <li>m2 bits 7..4: bit clear = signal shows red; same bits as in m3</li>
+ <li>OpenTTD bits in m4:
+ <table>
+ <tr><td nowrap valign=top>bits 1..0: </td><td align=left>type of signal:</td></tr>
+ <tr><td nowrap valign=top><tt>00</tt>: </td><td align=left>normal signals</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt>: </td><td align=left>pre-signals</td></tr>
+ <tr><td nowrap valign=top><tt>10</tt>: </td><td align=left>exit-signals</td></tr>
+ <tr><td nowrap valign=top><tt>11</tt>: </td><td align=left>combo-signals</td></tr>
+ <tr><td nowrap valign=top>bit 2: </td><td align=left>set = semaphore signals, clear = light signals</td></tr>
+ </table>
+ </li>
+ </ul>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the track</li>
+ <li>m2 bits 0..3:
+ <table>
+ <tr><td nowrap valign=top><tt>0</tt> </td><td align=left>on bare land</td></tr>
+ <tr><td nowrap valign=top><tt>1</tt> </td><td align=left>on grass, no fences</td></tr>
+ <tr><td nowrap valign=top><tt>2</tt> </td><td align=left>fence on the NW side</td></tr>
+ <tr><td nowrap valign=top><tt>3</tt> </td><td align=left>fence on the SE side</td></tr>
+ <tr><td nowrap valign=top><tt>4</tt> </td><td align=left>fences on the NW and SE sides</td></tr>
+ <tr><td nowrap valign=top><tt>5</tt> </td><td align=left>fence on the NE side</td></tr>
+ <tr><td nowrap valign=top><tt>6</tt> </td><td align=left>fence on the SW side</td></tr>
+ <tr><td nowrap valign=top><tt>7</tt> </td><td align=left>fences on the NE and SW sides</td></tr>
+ <tr><td nowrap valign=top><tt>8</tt> </td><td align=left>fence on the E side (track in the W corner)</td></tr>
+ <tr><td nowrap valign=top><tt>9</tt> </td><td align=left>fence on the W side (track in the E corner)</td></tr>
+ <tr><td nowrap valign=top><tt>A</tt> </td><td align=left>fence on the S side (track in the N corner)</td></tr>
+ <tr><td nowrap valign=top><tt>B</tt> </td><td align=left>fence on the N side (track in the S corner)</td></tr>
+ <tr><td nowrap valign=top><tt>C</tt> </td><td align=left>on snow or desert</td></tr>
+ </table>
+ </li>
+ <li>m3 bits 0..3 = <a name="TrackType">track type</a>:
+ <table>
+ <tr><td><tt>0</tt> </td><td>conventional railway</td></tr>
+ <tr><td><tt>1</tt> </td><td>electrified railway</td></tr>
+ <tr><td><tt>2</tt> </td><td>monorail</td></tr>
+ <tr><td><tt>3</tt> </td><td>maglev</td></tr>
+ </table>
+ </li>
+ </ul>
+ </li>
+ <li>m5 bits 7 and 6 set: railway depot / checkpoints
+ <ul>
+ <li>m5 value C0..C3: railway depot
+ <table>
+ <tr><td colspan=2>m5 bits 1..0</td></tr>
+ <tr><td colspan=2>direction: exit towards:</td></tr>
+ <tr><td><tt>00</tt> </td><td>NE</td></tr>
+ <tr><td><tt>01</tt> </td><td>SE</td></tr>
+ <tr><td><tt>02</tt> </td><td>SW</td></tr>
+ <tr><td><tt>03</tt> </td><td>NW</td></tr>
+ </table>
+ </li>
+ <li>m5 value C4..C5: checkpoint
+ <table>
+ <tr><td colspan=2>bit 0</td></tr>
+ <tr><td>clear</td><td>in X direction</td></tr>
+ <tr><td>set</td><td>in Y direction</td></tr>
+ </table>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the depot / checkpoint</li>
+ <li>m2: For waypoints, index into the array of waypoints.</li>
+ <li>m3 bits 0..3 = <a href="#TrackType">track type</a></li>
+ <li>m4 bits 0..3 = ground type, as per m2 bits 0..3 for railway tiles.</li>
+ </ul>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class2"><tt> 2 </tt></a></td>
+ <td>
+ <ul>
+ <li>m5 bits 7..4 clear: road
+ <ul>
+ <li>m5 bits 3..0: road layout: bit set = road piece present:
+ <table>
+ <tr><td nowrap valign=top>bit 0: </td><td align=left>NW piece</td></tr>
+ <tr><td nowrap valign=top>bit 1: </td><td align=left>SW piece</td></tr>
+ <tr><td nowrap valign=top>bit 2: </td><td align=left>SE piece</td></tr>
+ <tr><td nowrap valign=top>bit 3: </td><td align=left>NE piece</td></tr>
+ </table>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the road</li>
+ <li>m2: Index into the array of towns, 0 for non-town roads</li>
+ <li>m4 bits 0..3: counter for the roadworks</li>
+ <li>m4 bits 4..6:
+ <table>
+ <tr><td><tt>0</tt> </td><td>on bare land</td></tr>
+ <tr><td><tt>1</tt> </td><td>on grass</td></tr>
+ <tr><td><tt>2</tt> </td><td>paved</td></tr>
+ <tr><td><tt>3</tt> </td><td>with streetlights</td></tr>
+ <tr><td><tt>5</tt> </td><td>tree-lined</td></tr>
+ <tr><td><tt>6</tt> </td><td>on grass with road works</td></tr>
+ <tr><td><tt>7</tt> </td><td>paved with road works</td></tr>
+ </table>
+ </li>
+ <li>m4 bit 7 set = on snow or desert</li>
+ </ul>
+ </li>
+ <li>m5 bit 4 set, bits 7..5 clear: level crossing
+ <ul>
+ <li>m5 bit 3: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular)</li>
+ <li>m5 bit 2: set if crossing lights are on</li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the railway track</li>
+ <li>m2: Index into the array of towns, 0 for non-town roads</li>
+ <li>m3 bits 0..7: <a href="#OwnershipInfo">owner</a> of the road</li>
+ <li>m4 bits 3..0: <a href="#TrackType">track type</a></li>
+ <li>m4 bits 4..6: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> or higher - paved</li>
+ <li>m4 bit 7 set = on snow or desert</li>
+ </ul>
+ </li>
+ <li>m5 bit 5 set: road depot
+ <ul>
+ <li>m5 bits 3..0 - direction: exit towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the depot</li>
+ <li>m4 bit 7 set = on snow or desert (not displayed, but set internally)</li>
+ </ul>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class3"><tt> 3 </tt></a></td>
+ <td>Town building
+ <ul>
+ <li>m2: Index into the array of towns</li>
+ <li>m4: <a name="HouseTypes">town building type</a>:<br>
+ <small>Note: In the climate list, 'sub-arctic' means below the snow line, and 'snow' means above the snow line in the sub-arctic climate.</small>
+ <table>
+ <tr><th align=left>Type </th><th align=left>Size </th><th align=left>Climates </th><th align=left>Description</th></tr>
+ <tr><td nowrap valign=top><tt>00</tt> </td><td>1×1</td><td>temperate</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block</td></tr>
+ <tr><td nowrap valign=top><tt>02</tt> </td><td>1×1</td><td>temperate</td><td align=left>small block of flats</td></tr>
+ <tr><td nowrap valign=top><tt>03</tt> </td><td>1×1</td><td>temperate</td><td align=left>church</td></tr>
+ <tr><td nowrap valign=top><tt>04</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>large office block</td></tr>
+ <tr><td nowrap valign=top><tt>05</tt> </td><td>1×1</td><td>snow</td><td align=left>large office block</td></tr>
+ <tr><td nowrap valign=top><tt>06</tt> </td><td>1×1</td><td>temperate</td><td align=left>town houses</td></tr>
+ <tr><td nowrap valign=top><tt>07</tt>..<tt>08</tt> </td><td>1×2</td><td>temperate</td><td align=left>hotel</td></tr>
+ <tr><td nowrap valign=top><tt>09</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical </td><td align=left>statue</td></tr>
+ <tr><td nowrap valign=top><tt>0A</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>fountain</td></tr>
+ <tr><td nowrap valign=top><tt>0B</tt> </td><td>1×1</td><td>temperate</td><td align=left>park (with a pond)</td></tr>
+ <tr><td nowrap valign=top><tt>0C</tt> </td><td>1×1</td><td>temperate</td><td align=left>park (with an alley)</td></tr>
+ <tr><td nowrap valign=top><tt>0D</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block</td></tr>
+ <tr><td nowrap valign=top><tt>0E</tt>..<tt>10</tt> </td><td>1×1</td><td>temperate</td><td align=left>various types of shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>11</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>modern office building</td></tr>
+ <tr><td nowrap valign=top><tt>12</tt> </td><td>1×1</td><td>temperate</td><td align=left>warehouse</td></tr>
+ <tr><td nowrap valign=top><tt>13</tt> </td><td>1×1</td><td>temperate</td><td align=left>office block (with spiral stairway on the side)</td></tr>
+ <tr><td nowrap valign=top><tt>14</tt>..<tt>17</tt> </td><td>2×2</td><td>temperate</td><td align=left>stadium</td></tr>
+ <tr><td nowrap valign=top><tt>18</tt> </td><td>1×1</td><td>temperate</td><td align=left>old houses</td></tr>
+ <tr><td nowrap valign=top><tt>19</tt> </td><td>1×1</td><td>temperate</td><td align=left>cottages</td></tr>
+ <tr><td nowrap valign=top><tt>1A</tt> </td><td>1×1</td><td>temperate</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>1B</tt> </td><td>1×1</td><td>temperate</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>1C</tt> </td><td>1×1</td><td>temperate</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>1D</tt> </td><td>1×1</td><td>temperate</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>1E</tt> </td><td>1×1</td><td>temperate, sub-tropical</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>1F</tt> </td><td>1×1</td><td>temperate</td><td align=left>theatre</td></tr>
+ <tr><td nowrap valign=top><tt>20</tt>..<tt>23</tt> </td><td>2×2</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>stadium (modern style)</td></tr>
+ <tr><td nowrap valign=top><tt>24</tt> </td><td>1×1</td><td>temperate, sub-arctic, sub-tropical</td><td align=left>offices (the modern 'vertical tube' style)</td></tr>
+ <tr><td nowrap valign=top><tt>25</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>26</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>27</tt> </td><td>1×1</td><td>temperate</td><td align=left>cinema</td></tr>
+ <tr><td nowrap valign=top><tt>28</tt>..<tt>2B</tt> </td><td>2×2</td><td>temperate</td><td align=left>shopping mall</td></tr>
+ <tr><td nowrap valign=top><tt>2C</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>2D</tt> </td><td>1×1</td><td>snow</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>2E</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>2F</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>30</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>31</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>32</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>33</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>34</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>35</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>36</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>37</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>38</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>39</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>3A</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>3B</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>3C</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>church</td></tr>
+ <tr><td nowrap valign=top><tt>3D</tt> </td><td>1×1</td><td>snow</td><td align=left>church</td></tr>
+ <tr><td nowrap valign=top><tt>3E</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>3F</tt> </td><td>1×1</td><td>snow</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>40</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>41</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>42</tt>..<tt>43</tt> </td><td>1×2</td><td>sub-arctic</td><td align=left>hotel</td></tr>
+ <tr><td nowrap valign=top><tt>44</tt>..<tt>45</tt> </td><td>1×2</td><td>snow</td><td align=left>hotel</td></tr>
+ <tr><td nowrap valign=top><tt>46</tt> </td><td>1×1</td><td>sub-arctic, sub-tropical</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>47</tt> </td><td>1×1</td><td>snow</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>48</tt> </td><td>1×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>49</tt> </td><td>1×1</td><td>snow</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>4A</tt>..<tt>4B</tt> </td><td>2×1</td><td>sub-arctic</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>4C</tt>..<tt>4D</tt> </td><td>2×1</td><td>snow</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>4E</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (with a tree in a corner)</td></tr>
+ <tr><td nowrap valign=top><tt>4F</tt>, <tt>50</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses</td></tr>
+ <tr><td nowrap valign=top><tt>51</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (suburb-type)</td></tr>
+ <tr><td nowrap valign=top><tt>52</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>53</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>church</td></tr>
+ <tr><td nowrap valign=top><tt>54</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>houses (with two trees in front)</td></tr>
+ <tr><td nowrap valign=top><tt>55</tt>, <tt>56</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>57</tt>..<tt>58</tt> </td><td>2×1</td><td>sub-tropical</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>59</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>flats</td></tr>
+ <tr><td nowrap valign=top><tt>5A</tt> </td><td>1×1</td><td>sub-tropical</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>5B</tt> </td><td>1×1</td><td>toyland</td><td align=left>church</td></tr>
+ <tr><td nowrap valign=top><tt>5C</tt>..<tt>61</tt> </td><td>1×1</td><td>toyland</td><td align=left>various types of toyland houses</td></tr>
+ <tr><td nowrap valign=top><tt>62</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>63</tt>..<tt>64</tt> </td><td>1×2</td><td>toyland</td><td align=left>houses ('shoe' style)</td></tr>
+ <tr><td nowrap valign=top><tt>65</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>66</tt> </td><td>1×1</td><td>toyland</td><td align=left>igloo</td></tr>
+ <tr><td nowrap valign=top><tt>67</tt> </td><td>1×1</td><td>toyland</td><td align=left>tepees</td></tr>
+ <tr><td nowrap valign=top><tt>68</tt>, <tt>69</tt> </td><td>1×1</td><td>toyland</td><td align=left>shops and offices</td></tr>
+ <tr><td nowrap valign=top><tt>6A</tt> </td><td>1×1</td><td>toyland</td><td align=left>tall office block</td></tr>
+ <tr><td nowrap valign=top><tt>6B</tt> </td><td>1×1</td><td>toyland</td><td align=left>statue</td></tr>
+ <tr><td nowrap valign=top><tt>6C</tt> </td><td>1×1</td><td>toyland</td><td align=left>teapot-house</td></tr>
+ <tr><td nowrap valign=top><tt>6D</tt> </td><td>1×1</td><td>toyland</td><td align=left>piggy-bank</td></tr>
+ </table>
+ </li>
+ <li>m3 bits 7..6: stage of construction (<tt>3</tt> = completed)</li>
+ <li>m5 bits 2..0: construction counter, for buildings under construction incremented on every periodic tile processing<br>
+ On wraparound the stage of construction in m3 is increased
+ </li>
+ <li>for large office blocks (types <tt>04</tt> and <tt>05</tt>):
+ <ul>
+ <li>m1 bits 6..0: position of the lift</li>
+ <li>m1 bit 7: if set the lift is moving</li>
+ <li>m5 bit 7: if set then m5 bits 5..0 hold the destination floor of the lift, which could be 0..6, except 1.<br>
+ So the building has 6 effective floors. This is due to the fact that the first floor is 2 'normal' floors high.<br>
+ One 'normal' floor has a height of 6 lift positions.</li>
+ </ul>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class4"><tt> 4 </tt></a></td>
+ <td>Trees
+ <ul>
+ <li>m5 bits 7..6: number of trees minus one</li>
+ <li>m5 bits 2..0: growth status: <tt>0</tt>..<tt>2</tt> - one of trees is growing, <tt>3</tt> - all trees are fully grown, <tt>4</tt>..<tt>6</tt> - one of trees is withering</li>
+ <li>m3 bits 7..0: type of trees:
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt>..<tt>0B</tt> </td><td align=left>temperate climate trees</td></tr>
+ <tr><td nowrap valign=top><tt>0C</tt>..<tt>13</tt> </td><td align=left>sub-arctic climate trees</td></tr>
+ <tr><td nowrap valign=top><tt>14</tt>..<tt>1A</tt> </td><td align=left>rainforest trees</td></tr>
+ <tr><td nowrap valign=top><tt>1B</tt> </td><td align=left>cactus plants</td></tr>
+ <tr><td nowrap valign=top><tt>1C</tt>..<tt>1F</tt> </td><td align=left>sub-tropical climate, non-rainforest, non-desert trees</td></tr>
+ <tr><td nowrap valign=top><tt>20</tt>..<tt>28</tt> </td><td align=left>toyland trees</td></tr>
+ </table>
+ <small>Note: the actually displayed set of trees depends on both type and number of trees</small>
+ </li>
+ <li>m4 bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none)</li>
+ <li>m4 bits 4..2: type of hedge on the SE border of the tile (1 through 6, or 0=none)</li>
+ <li>m2 bits 5..4:
+ <table>
+ <tr><td nowrap valign=top><tt>0</tt> </td><td align=left>on grass</td></tr>
+ <tr><td nowrap valign=top><tt>1</tt> </td><td align=left>on rough land</td></tr>
+ <tr><td nowrap valign=top><tt>2</tt> </td><td align=left>on snow or desert; m2 bits 7..6 - amount of snow or desert (for desert always set to 3 in TTD)</td></tr>
+ </table>
+ </li>
+ <li>m2 bits 3..0: update counter, incremented on every periodic processing.<br>
+ on wraparound the growth status is updated (or, if it's <tt>3</tt>, a random action is taken)</li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> (normally <tt>10</tt>)</li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class5"><tt> 5 </tt></a></td>
+ <td>Station tile
+ <ul>
+ <li>m5: tile type:
+ <table>
+ <tr>
+ <td nowrap valign=top><tt>00</tt>..<tt>07</tt> </td><td align=left>railway station
+ <table>
+ <tr><td><tt>00</tt>..<tt>01</tt> </td><td align=left>open platform</td></tr>
+ <tr><td><tt>02</tt>..<tt>03</tt> </td><td align=left>open platform with station building</td></tr>
+ <tr><td><tt>04</tt>....<tt>07</tt> </td><td align=left>roofed platform</td></tr>
+ <tr><td colspan=2>bit 0: clear = in X direction, set = in Y direction</td></tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td nowrap valign=top><tt>08</tt>..<tt>33</tt> </td><td align=left>large airport
+ <table>
+ <tr><td nowrap valign=top><tt>0B</tt> </td><td align=left>pad 1</td></tr>
+ <tr><td nowrap valign=top><tt>16</tt>..<tt>19</tt> </td><td align=left>runway middle</td></tr>
+ <tr><td nowrap valign=top><tt>1A</tt> </td><td align=left>runway ending</td></tr>
+ <tr><td nowrap valign=top><tt>1C</tt> </td><td align=left>control tower</td></tr>
+ <tr><td nowrap valign=top><tt>20</tt> </td><td align=left>hangar</td></tr>
+ <tr><td nowrap valign=top><tt>21</tt> </td><td align=left>pad 3</td></tr>
+ <tr><td nowrap valign=top><tt>22</tt> </td><td align=left>pad 2</td></tr>
+ <tr><td nowrap valign=top><tt>27</tt>..<tt>32</tt> </td><td align=left>radar (animated)</td></tr>
+ <tr><td nowrap valign=top><tt>33</tt> </td><td align=left>transmitter</td></tr>
+ <tr><td colspan=2>The initial layout of a large airport is (rows in Y direction, columns in X direction):
<pre>
1F 1B 1E 33 26 1A
09 24 0B 0C 0D 16
@@ -354,266 +429,303 @@
09 08 14 13 12 19
20 0A 15 1C 27 1A
</pre>
-</td></tr>
-<tr><td nowrap valign=top><tt>34</tt>..<tt>41</tt> </td><td align=left>small airport
-<table>
-<tr><td nowrap valign=top><tt>3A</tt>..<tt>3D</tt> </td><td align=left>field with the wind meter (animated)</td></tr>
-<tr><td nowrap valign=top><tt>3E</tt> </td><td align=left>runway south ending</td></tr>
-<tr><td nowrap valign=top><tt>3F</tt> </td><td align=left>runway middle</td></tr>
-<tr><td nowrap valign=top><tt>40</tt> </td><td align=left>runway north ending</td></tr>
-<tr><td nowrap valign=top><tt>41</tt> </td><td align=left>hangar</td></tr>
-</table>
-The initial layout of a small airport is (rows in Y direction, columns in X direction):
+ </table>
+ </td></tr>
+
+ <tr><td nowrap valign=top><tt>34</tt>..<tt>41</tt> </td><td align=left>small airport
+ <table>
+ <tr><td nowrap valign=top><tt>3A</tt>..<tt>3D</tt> </td><td align=left>field with the wind meter (animated)</td></tr>
+ <tr><td nowrap valign=top><tt>3E</tt> </td><td align=left>runway south ending</td></tr>
+ <tr><td nowrap valign=top><tt>3F</tt> </td><td align=left>runway middle</td></tr>
+ <tr><td nowrap valign=top><tt>40</tt> </td><td align=left>runway north ending</td></tr>
+ <tr><td nowrap valign=top><tt>41</tt> </td><td align=left>hangar</td></tr>
+ <tr><td colspan=2>The initial layout of a small airport is (rows in Y direction, columns in X direction):
<pre>
36 3A 40
35 39 3F
34 38 3F
41 37 3E
</pre>
-</td></tr>
-<tr><td nowrap valign=top><tt>42</tt> </td><td align=left>heliport</td></tr>
-<tr><td nowrap valign=top><tt>43</tt>..<tt>46</tt> </td><td align=left>lorry loading area;
-exit towards: <tt>43</tt> - NE, <tt>44</tt> - SE, <tt>45</tt> - SW, <tt>46</tt> - NW
-</td></tr>
-<tr><td nowrap valign=top><tt>47</tt>..<tt>4A</tt> </td><td align=left>bus station;
-exit towards: <tt>47</tt> - NE, <tt>48</tt> - SE, <tt>49</tt> - SW, <tt>4A</tt> - NW
-<tr><td nowrap valign=top><tt>4B</tt> </td><td align=left>oilfield</td></tr>
-<tr><td nowrap valign=top><tt>4C</tt>..<tt>51</tt> </td><td align=left>ship dock;
-<tt>4C</tt> - SW coast part, <tt>4D</tt> - NW coast part, <tt>4E</tt> - NE coast part, <tt>4F</tt> - SE coast part, <tt>50</tt> - X direction water part, <tt>51</tt> - Y direction water part
-<tr><td nowrap valign=top><tt>52</tt> </td><td align=left>buoy</td></tr>
-<tr><td nowrap valign=top><tt>53</tt>..<tt>A7</tt> </td><td align=left>used by RichK's larger airports
-</td></tr>
-<tr><td colspan=2></td></tr> <!-- spacer -->
-</table>
-</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the station</li>
-<li>m2: index into the array of stations</li>
-<li>m3 bits 0..3: <a href="#TrackType">track type</a> for railway stations, must be 0 for all the other stations</li>
-<li>m3 bits 4..7: persistent random data for newstations</li>
-<li>m4 = custom station id; 0 means standard graphics</li>
-</ul>
-</td></tr>
-
-<tr><td valign=top nowrap><a name="Class6"><tt> 6 </tt></a></td><td>
-<ul>
-<li>m5: tile type:
-<table>
-<tr><td nowrap valign=top><tt>00</tt> </td><td align=left>water</td></tr>
-<tr><td nowrap valign=top><tt>01</tt> </td><td align=left>coast or riverbank</td></tr>
-<tr><td nowrap valign=top><tt>10</tt>..<tt>1B</tt> </td><td align=left>canal locks
-<table>
-<tr><td nowrap valign=top><tt>10</tt> </td><td align=left>middle part, (SW-NE direction)
-<tr><td nowrap valign=top><tt>11</tt> </td><td align=left>middle part, (NW-SE direction)
-<tr><td nowrap valign=top><tt>12</tt> </td><td align=left>middle part, (NE-SW direction)
-<tr><td nowrap valign=top><tt>13</tt> </td><td align=left>middle part, (SE-NW direction)
-<tr><td nowrap valign=top><tt>14</tt> </td><td align=left>lower part, (SW-NE direction)
-<tr><td nowrap valign=top><tt>15</tt> </td><td align=left>lower part, (NW-SE direction)
-<tr><td nowrap valign=top><tt>16</tt> </td><td align=left>lower part, (NE-SW direction)
-<tr><td nowrap valign=top><tt>17</tt> </td><td align=left>lower part, (SE-NW direction)
-<tr><td nowrap valign=top><tt>18</tt> </td><td align=left>upper part, (SW-NE direction)
-<tr><td nowrap valign=top><tt>19</tt> </td><td align=left>upper part, (NW-SE direction)
-<tr><td nowrap valign=top><tt>1A</tt> </td><td align=left>upper part, (NE-SW direction)
-<tr><td nowrap valign=top><tt>1B</tt> </td><td align=left>upper part, (SE-NW direction)
-</table>
-<tr><td nowrap valign=top><tt>80</tt>..<tt>83</tt> </td><td align=left>ship depots
-<table>
-<tr><td nowrap valign=top><tt>80</tt> </td><td align=left>ship depot, NE part (X direction)
-<tr><td nowrap valign=top><tt>81</tt> </td><td align=left>ship depot, SW part (X direction)
-<tr><td nowrap valign=top><tt>82</tt> </td><td align=left>ship depot, NW part (Y direction)
-<tr><td nowrap valign=top><tt>83</tt> </td><td align=left>ship depot, SE part (Y direction)
-
-</td></tr>
-
-</table>
-</td></tr>
-</table></li>
-<li>m1: <a href="#OwnershipInfo">owner</a> (for water and coasts normally <tt>11</tt>)</li>
-</ul>
-</td></tr>
-
-<tr><td valign=top nowrap><a name="Class7"><tt> 7 </tt></a></td><td>
-Void
-<p>
-Tiles of this class form an invisible, one tile wide border at the south (bottom) edges of the map, so as to protect several algorithms from the consequences of a wraparound at the edges.
-</p>
-</td></tr>
+ </table>
+ </td></tr>
-<tr><td valign=top nowrap><a name="Class8"><tt> 8 </tt></a></td><td>
-Industry tile
-<ul>
-<li>m5: type:
-<br><small>(note: this is not the same as the industry type, which is stored in the array of industries)</small>
-<table>
-<tr><td nowrap valign=top><tt>00</tt>..<tt>06</tt> </td><td align=left>coal mine
-<table>
-<tr><td nowrap valign=top><tt>00</tt> </td><td align=left>wheel tower when not animated</td></tr>
-<tr><td nowrap valign=top><tt>01</tt> </td><td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>07</tt>..<tt>0A</tt> </td><td align=left>power station
-<table>
-<tr><td nowrap valign=top><tt>08</tt> </td><td align=left>chimney</td></tr>
-<tr><td nowrap valign=top><tt>0A</tt> </td><td align=left>transformer; animation progress in m3(valid range <tt>0</tt>..<tt>7</tt>)</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>0B</tt>..<tt>0F</tt> </td><td align=left>sawmill</td></tr>
-<tr><td nowrap valign=top><tt>10</tt>..<tt>11</tt> </td><td align=left>forest
-<table>
-<tr><td nowrap valign=top><tt>11</tt> </td><td align=left>trees cut down</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>12</tt>..<tt>17</tt> </td><td align=left>oil refinery</td></tr>
-<tr><td nowrap valign=top><tt>18</tt>..<tt>1C</tt> </td><td align=left>oil rig</td></tr>
-<tr><td nowrap valign=top><tt>1D</tt>..<tt>20</tt> </td><td align=left>oil wells
-<table>
-<tr><td nowrap valign=top><tt>1D</tt> </td><td align=left>not animated</td></tr>
-<tr><td nowrap valign=top><tt>1E</tt>..<tt>20</tt> </td><td align=left>various stages of animation; progress of animation in m3</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>21</tt>..<tt>26</tt> </td><td align=left>farm</td></tr>
-<tr><td nowrap valign=top><tt>27</tt>..<tt>2A</tt> </td><td align=left>factory (temperate climate)</td></tr>
-<tr><td nowrap valign=top><tt>2B</tt>..<tt>2E</tt> </td><td align=left>printing works</td></tr>
-<tr><td nowrap valign=top><tt>2F</tt>..<tt>33</tt> </td><td align=left>copper ore mine
-<table>
-<tr><td nowrap valign=top><tt>2F</tt> </td><td align=left>wheel tower when not animated</td></tr>
-<tr><td nowrap valign=top><tt>30</tt> </td><td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
-<tr><td nowrap valign=top><tt>31</tt> </td><td align=left>chimney</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>34</tt>..<tt>39</tt> </td><td align=left>steel mill</td></tr>
-<tr><td nowrap valign=top><tt>3A</tt>..<tt>3B</tt> </td><td align=left>bank (temperate climate)</td></tr>
-<tr><td nowrap valign=top><tt>3C</tt>..<tt>3F</tt> </td><td align=left>food processing plant</td></tr>
-<tr><td nowrap valign=top><tt>40</tt>..<tt>47</tt> </td><td align=left>paper mill</td></tr>
-<tr><td nowrap valign=top><tt>48</tt>..<tt>58</tt> </td><td align=left>gold mine
-<table>
-<tr><td nowrap valign=top><tt>4F</tt> </td><td align=left>wheel tower when not animated</td></tr>
-<tr><td nowrap valign=top><tt>58</tt> </td><td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>59</tt>..<tt>5A</tt> </td><td align=left>bank (sub-arctic or sub-tropical climate)</td></tr>
-<tr><td nowrap valign=top><tt>5B</tt>..<tt>63</tt> </td><td align=left>diamond mine</td></tr>
-<tr><td nowrap valign=top><tt>64</tt>..<tt>73</tt> </td><td align=left>iron ore mine</td></tr>
-<tr><td nowrap valign=top><tt>74</tt></td><td align=left>fruit plantation</td></tr>
-<tr><td nowrap valign=top><tt>75</tt></td><td align=left>rubber plantation</td></tr>
-<tr><td nowrap valign=top><tt>76</tt>..<tt>77</tt> </td><td align=left>water supply</td></tr>
-<tr><td nowrap valign=top><tt>78</tt></td><td align=left>water tower</td></tr>
-<tr><td nowrap valign=top><tt>79</tt>..<tt>7C</tt> </td><td align=left>factory (sub-tropical climate)</td></tr>
-<tr><td nowrap valign=top><tt>7D</tt>..<tt>80</tt> </td><td align=left>lumber mill</td></tr>
-<tr><td nowrap valign=top><tt>81</tt>..<tt>82</tt> </td><td align=left>candyfloss forest
-<table>
-<tr><td nowrap valign=top><tt>82</tt> </td><td align=left>candyfloss 'trees' cut down</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>83</tt>..<tt>86</tt> </td><td align=left>sweet factory</td></tr>
-<tr><td nowrap valign=top><tt>87</tt>..<tt>88</tt> </td><td align=left>battery farm
-<table>
-<tr><td nowrap valign=top><tt>88</tt> </td><td align=left>batteries 'reaped'</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>89</tt></td><td align=left>cola wells</td></tr>
-<tr><td nowrap valign=top><tt>8A</tt>..<tt>8D</tt> </td><td align=left>toy shop</td></tr>
-<tr><td nowrap valign=top><tt>8E</tt>..<tt>93</tt> </td><td align=left>toy factory
-<table>
-<tr><td nowrap valign=top><tt>8F</tt> </td>
- <td align=left>Animated part; animation state in m3 (valid range <tt>00</tt>..<tt>31</tt>)<br>
- Tile animation is started (m4 zeroed) on the periodic processing.<br>
- While the animation is in progress, m4 holds the number
- of animation cycles that have already taken place; when
- this number reaches 8 the animation is stopped</td>
- </tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>94</tt>..<tt>9B</tt> </td><td align=left>plastic fountains (various stages of cyclic animation)</td></tr>
-<tr><td nowrap valign=top><tt>9C</tt>..<tt>9F</tt> </td><td align=left>fizzy drink factory</td></tr>
-<tr><td nowrap valign=top><tt>A0</tt>..<tt>A3</tt> </td><td align=left>bubble generator
-<table>
-<tr><td nowrap valign=top><tt>A1</tt> </td><td align=left>generators</td></tr>
-<tr><td nowrap valign=top><tt>A2</tt> </td><td align=left>bubble capture facility; animation state in m3 (valid range <tt>00</tt>..<tt>27</tt>)</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>A4</tt>..<tt>A6</tt> </td><td align=left>toffee quarry
-<table>
-<tr><td nowrap valign=top><tt>A5</tt> </td><td align=left>animated part; animation state in m3 (valid range <tt>00</tt>..<tt>45</tt>)</td></tr>
-</table>
-</td></tr>
-<tr><td nowrap valign=top><tt>A7</tt>..<tt>AE</tt> </td><td align=left>sugar mine
-<table>
-<tr><td nowrap valign=top><tt>AE</tt> </td><td align=left>animated part; animation state in m3 (valid range <tt>00</tt>..<tt>5F</tt>)</td></tr>
-</table>
-</td></tr>
-<tr><td colspan=2></td></tr> <!-- spacer -->
-</table></li>
-<li>m2: index into the array of industries
-</li>
-<li>m1 bit 7: clear = under construction
-<ul>
-<li>m1 bits 4..2: construction counter, for buildings under construction incremented on every periodic tile processing
-</li>
-<li>m1 bits 1..0: stage of construction (<tt>3</tt> = completed), incremented when the construction counter wraps around
-<br>the meaning is different for some animated tiles which are never under construction (types <tt>01</tt>, <tt>1E</tt>..<tt>20</tt>, <tt>30</tt>, <tt>58</tt>; see above)
-</li>
-</ul></li>
-</ul>
-</td></tr>
+ <tr><td nowrap valign=top><tt>42</tt> </td><td align=left>heliport</td></tr>
+ <tr><td nowrap valign=top><tt>43</tt>..<tt>46</tt> </td><td align=left>
+ lorry loading area : exit towards:
+ <table>
+ <tr><td><tt>43</tt> </td><td align=left>NE</td></tr>
+ <tr><td><tt>44</tt> </td><td align=left>SE</td></tr>
+ <tr><td><tt>45</tt> </td><td align=left>SW</td></tr>
+ <tr><td><tt>46</tt> </td><td align=left>NW</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>47</tt>..<tt>4A</tt> </td><td align=left>
+ bus station : exit towards:
+ <table>
+ <tr><td><tt>47</tt> </td><td align=left>NE</td></tr>
+ <tr><td><tt>48</tt> </td><td align=left>SE</td></tr>
+ <tr><td><tt>49</tt> </td><td align=left>SW</td></tr>
+ <tr><td><tt>4A</tt> </td><td align=left>NW</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>4B</tt> </td><td align=left>oilfield</td></tr>
+ <tr><td nowrap valign=top><tt>4C</tt>..<tt>51</tt> </td><td align=left>ship dock
+ <table>
+ <tr><td><tt>4C</tt> </td><td align=left>SW coast part</td></tr>
+ <tr><td><tt>4D</tt> </td><td align=left>NW coast part</td></tr>
+ <tr><td><tt>4E</tt> </td><td align=left>NE coast part</td></tr>
+ <tr><td><tt>4F</tt> </td><td align=left>SE coast part</td></tr>
+ <tr><td><tt>50</tt> </td><td align=left>X direction water part</td></tr>
+ <tr><td><tt>51</tt> </td><td align=left>Y direction water part</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>52</tt> </td><td align=left>buoy</td></tr>
+ <tr><td nowrap valign=top><tt>53</tt>..<tt>A7</tt> </td><td align=left>used by RichK's larger airports</td></tr>
+ </table>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the station</li>
+ <li>m2: index into the array of stations</li>
+ <li>m3 bits 0..3: <a href="#TrackType">track type</a> for railway stations, must be 0 for all the other stations</li>
+ <li>m3 bits 4..7: persistent random data for newstations</li>
+ <li>m4: custom station id; 0 means standard graphics</li>
+ </ul>
+ </td>
+ </tr>
-<tr><td valign=top nowrap><a name="Class9"><tt> 9 </tt></a></td><td>
-m5 bits 7..4 clear: tunnel entrance/exit
-<ul>
-<li>m5 bits 3..2: <tt>0</tt> - railway tunnel, <tt>1</tt> - road tunnel</li>
-<li>m5 bits 1..0 - direction: entrance towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the tunnel</li>
-<li>m3 bits 3..0 = <a href="#TrackType">track type</a> for railway tunnel, must be 0 for road tunnel</li>
-<li>m4 bit 7 set = on snow or desert</li>
-</ul>
-m5 bit 7 set: bridge ramp
-<ul>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the bridge</li>
-<li>m3 bits 3..0 = <a href="#TrackType">type of track</a> on the bridge, must be 0 for road bridge</li>
-<li>m5 bits 3..2: <tt>0</tt> - railway bridge, <tt>1</tt> - road bridge</li>
-<li>m5 bit 0..1: DiagDirection onto the bridge</li>
-<li>m2 bits 7..4: <a name="BridgeType">bridge type</a>:
-<table>
-<tr><th align=left>Type </th><th align=left>Max. speed (mph) </th><th align=left>Description</th></tr>
-<tr><td nowrap valign=top><tt>0</tt> </td><td align=center>20</td><td align=left>wooden</td></tr>
-<tr><td nowrap valign=top><tt>1</tt> </td><td align=center>30</td><td align=left>concrete</td></tr>
-<tr><td nowrap valign=top><tt>2</tt> </td><td align=center>40</td><td align=left>girder, steel</td></tr>
-<tr><td nowrap valign=top><tt>3</tt> </td><td align=center>50</td><td align=left>suspension, concrete</td></tr>
-<tr><td nowrap valign=top><tt>4</tt> </td><td align=center>60</td><td align=left>suspension, steel</td></tr>
-<tr><td nowrap valign=top><tt>5</tt> </td><td align=center>70</td><td align=left>suspension, steel</td></tr>
-<tr><td nowrap valign=top><tt>6</tt> </td><td align=center>100</td><td align=left>cantilever, steel</td></tr>
-<tr><td nowrap valign=top><tt>7</tt> </td><td align=center>130</td><td align=left>cantilever, steel</td></tr>
-<tr><td nowrap valign=top><tt>8</tt> </td><td align=center>150</td><td align=left>cantilever, steel</td></tr>
-<tr><td nowrap valign=top><tt>9</tt> </td><td align=center>160</td><td align=left>girder, steel</td></tr>
-<tr><td nowrap valign=top><tt>A</tt> </td><td align=center>200</td><td align=left>tubular, steel</td></tr>
-</table></li>
-<li>m4 bit 7 set = on snow or desert</li>
-</ul>
-</td></tr>
+ <tr>
+ <td valign=top nowrap><a name="Class6"><tt> 6 </tt></a></td>
+ <td>
+ <ul>
+ <li>m5: tile type:
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt> </td><td align=left>water</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt> </td><td align=left>coast or riverbank</td></tr>
+ <tr><td nowrap valign=top><tt>10</tt>..<tt>1B</tt> </td><td align=left>canal locks
+ <table>
+ <tr><td nowrap valign=top><tt>10</tt> </td><td align=left>middle part, (SW-NE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>11</tt> </td><td align=left>middle part, (NW-SE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>12</tt> </td><td align=left>middle part, (NE-SW direction)</td></tr>
+ <tr><td nowrap valign=top><tt>13</tt> </td><td align=left>middle part, (SE-NW direction)</td></tr>
+ <tr><td nowrap valign=top><tt>14</tt> </td><td align=left>lower part, (SW-NE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>15</tt> </td><td align=left>lower part, (NW-SE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>16</tt> </td><td align=left>lower part, (NE-SW direction)</td></tr>
+ <tr><td nowrap valign=top><tt>17</tt> </td><td align=left>lower part, (SE-NW direction)</td></tr>
+ <tr><td nowrap valign=top><tt>18</tt> </td><td align=left>upper part, (SW-NE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>19</tt> </td><td align=left>upper part, (NW-SE direction)</td></tr>
+ <tr><td nowrap valign=top><tt>1A</tt> </td><td align=left>upper part, (NE-SW direction)</td></tr>
+ <tr><td nowrap valign=top><tt>1B</tt> </td><td align=left>upper part, (SE-NW direction)</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>80</tt>..<tt>83</tt> </td><td align=left>ship depots
+ <table>
+ <tr><td nowrap valign=top><tt>80</tt> </td><td align=left>ship depot, NE part (X direction)</td></tr>
+ <tr><td nowrap valign=top><tt>81</tt> </td><td align=left>ship depot, SW part (X direction)</td></tr>
+ <tr><td nowrap valign=top><tt>82</tt> </td><td align=left>ship depot, NW part (Y direction)</td></tr>
+ <tr><td nowrap valign=top><tt>83</tt> </td><td align=left>ship depot, SE part (Y direction)</td></tr>
+ </table>
+ </td></tr>
+ </table>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> (for water and coasts normally <tt>11</tt>)</li>
+ </ul>
+ </td>
+ </tr>
-<tr><td valign=top nowrap><a name="ClassA"><tt> A </tt></a></td><td>
-<ul>
-<li>m5: tile type:
-<table>
-<tr><td nowrap valign=top><tt>00</tt> </td><td align=left>transmitter</td></tr>
-<tr><td nowrap valign=top><tt>01</tt> </td><td align=left>lighthouse</td></tr>
-<tr><td nowrap valign=top><tt>02</tt> </td><td align=left>company statue</td></tr>
-<tr><td nowrap valign=top><tt>03</tt> </td><td align=left>company-owned land</td></tr>
-<tr><td nowrap valign=top><tt>80</tt>..<tt>93</tt> </td><td align=left>company headquarters (5 sets of 4 tiles each, updated quarterly depending on the company performance)</td></tr>
-</table>
-</li>
-<li>m1: <a href="#OwnershipInfo">owner</a> of the object (for lighthouses and transmitters normally <tt>10</tt>)</li>
-</ul>
-</td></tr>
+ <tr>
+ <td valign=top nowrap><a name="Class7"><tt> 7 </tt></a></td>
+ <td>Void
+ <p>Tiles of this class form an invisible, one tile wide border at the south (bottom) edges of the map,<br>
+ so as to protect several algorithms from the consequences of a wraparound at the edges.
+ </p>
+ </td>
+ </tr>
-<tr><td colspan=2>
-Classes <tt>B</tt> through <tt>F</tt> are reserved. The presence of a tile in one of the reserved classes will crash OTTD.
-</td></tr>
-</table>
+ <tr>
+ <td valign=top nowrap><a name="Class8"><tt> 8 </tt></a></td>
+ <td>Industry tile
+ <ul>
+ <li>m5: type:<br>
+ <small>(note: this is not the same as the industry type, which is stored in the array of industries)</small>
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt>..<tt>06</tt> </td><td align=left>coal mine
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt> </td><td align=left>wheel tower when not animated</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt> </td><td align=left>wheel tower when animated<br>animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>07</tt>..<tt>0A</tt> </td><td align=left>power station
+ <table>
+ <tr><td nowrap valign=top><tt>08</tt> </td><td align=left>chimney</td></tr>
+ <tr><td nowrap valign=top><tt>0A</tt> </td><td align=left>transformer; animation progress in m3(valid range <tt>0</tt>..<tt>7</tt>)</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>0B</tt>..<tt>0F</tt> </td><td align=left>sawmill</td></tr>
+ <tr><td nowrap valign=top><tt>10</tt>..<tt>11</tt> </td><td align=left>forest
+ <table>
+ <tr><td nowrap valign=top><tt>11</tt> </td><td align=left>trees cut down</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>12</tt>..<tt>17</tt> </td><td align=left>oil refinery</td></tr>
+ <tr><td nowrap valign=top><tt>18</tt>..<tt>1C</tt> </td><td align=left>oil rig</td></tr>
+ <tr><td nowrap valign=top><tt>1D</tt>..<tt>20</tt> </td><td align=left>oil wells
+ <table>
+ <tr><td nowrap valign=top><tt>1D</tt> </td><td align=left>not animated</td></tr>
+ <tr><td nowrap valign=top><tt>1E</tt>..<tt>20</tt> </td><td align=left>various stages of animation; progress of animation in m3</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>21</tt>..<tt>26</tt> </td><td align=left>farm</td></tr>
+ <tr><td nowrap valign=top><tt>27</tt>..<tt>2A</tt> </td><td align=left>factory (temperate climate)</td></tr>
+ <tr><td nowrap valign=top><tt>2B</tt>..<tt>2E</tt> </td><td align=left>printing works</td></tr>
+ <tr><td nowrap valign=top><tt>2F</tt>..<tt>33</tt> </td><td align=left>copper ore mine
+ <table>
+ <tr><td nowrap valign=top><tt>2F</tt> </td><td align=left>wheel tower when not animated</td></tr>
+ <tr><td nowrap valign=top><tt>30</tt> </td><td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
+ <tr><td nowrap valign=top><tt>31</tt> </td><td align=left>chimney</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>34</tt>..<tt>39</tt> </td><td align=left>steel mill</td></tr>
+ <tr><td nowrap valign=top><tt>3A</tt>..<tt>3B</tt> </td><td align=left>bank (temperate climate)</td></tr>
+ <tr><td nowrap valign=top><tt>3C</tt>..<tt>3F</tt> </td><td align=left>food processing plant</td></tr>
+ <tr><td nowrap valign=top><tt>40</tt>..<tt>47</tt> </td><td align=left>paper mill</td></tr>
+ <tr><td nowrap valign=top><tt>48</tt>..<tt>58</tt> </td><td align=left>gold mine
+ <table>
+ <tr><td nowrap valign=top><tt>4F</tt> </td><td align=left>wheel tower when not animated</td></tr>
+ <tr><td nowrap valign=top><tt>58</tt> </td><td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>59</tt>..<tt>5A</tt> </td><td align=left>bank (sub-arctic or sub-tropical climate)</td></tr>
+ <tr><td nowrap valign=top><tt>5B</tt>..<tt>63</tt> </td><td align=left>diamond mine</td></tr>
+ <tr><td nowrap valign=top><tt>64</tt>..<tt>73</tt> </td><td align=left>iron ore mine</td></tr>
+ <tr><td nowrap valign=top><tt>74</tt></td><td align=left>fruit plantation</td></tr>
+ <tr><td nowrap valign=top><tt>75</tt></td><td align=left>rubber plantation</td></tr>
+ <tr><td nowrap valign=top><tt>76</tt>..<tt>77</tt> </td><td align=left>water supply</td></tr>
+ <tr><td nowrap valign=top><tt>78</tt></td><td align=left>water tower</td></tr>
+ <tr><td nowrap valign=top><tt>79</tt>..<tt>7C</tt> </td><td align=left>factory (sub-tropical climate)</td></tr>
+ <tr><td nowrap valign=top><tt>7D</tt>..<tt>80</tt> </td><td align=left>lumber mill</td></tr>
+ <tr><td nowrap valign=top><tt>81</tt>..<tt>82</tt> </td><td align=left>candyfloss forest
+ <table>
+ <tr><td nowrap valign=top><tt>82</tt> </td><td align=left>candyfloss 'trees' cut down</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>83</tt>..<tt>86</tt> </td><td align=left>sweet factory</td></tr>
+ <tr><td nowrap valign=top><tt>87</tt>..<tt>88</tt> </td><td align=left>battery farm
+ <table>
+ <tr><td nowrap valign=top><tt>88</tt> </td><td align=left>batteries 'reaped'</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>89</tt></td><td align=left>cola wells</td></tr>
+ <tr><td nowrap valign=top><tt>8A</tt>..<tt>8D</tt> </td><td align=left>toy shop</td></tr>
+ <tr><td nowrap valign=top><tt>8E</tt>..<tt>93</tt> </td><td align=left>toy factory
+ <table>
+ <tr><td nowrap valign=top><tt>8F</tt> </td>
+ <td align=left>Animated part; animation state in m3 (valid range <tt>00</tt>..<tt>31</tt>)<br>
+ Tile animation is started (m4 zeroed) on the periodic processing.<br>
+ While the animation is in progress, m4 holds the number
+ of animation cycles that have already taken place.<br>
+ when this number reaches 8 the animation is stopped.
+ </td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>94</tt>..<tt>9B</tt> </td><td align=left>plastic fountains (various stages of cyclic animation)</td></tr>
+ <tr><td nowrap valign=top><tt>9C</tt>..<tt>9F</tt> </td><td align=left>fizzy drink factory</td></tr>
+ <tr><td nowrap valign=top><tt>A0</tt>..<tt>A3</tt> </td><td align=left>bubble generator
+ <table>
+ <tr><td nowrap valign=top><tt>A1</tt> </td><td align=left>generators</td></tr>
+ <tr><td nowrap valign=top><tt>A2</tt> </td><td align=left>bubble capture facility; animation state in m3 (valid range <tt>00</tt>..<tt>27</tt>)</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>A4</tt>..<tt>A6</tt> </td><td align=left>toffee quarry
+ <table>
+ <tr><td nowrap valign=top><tt>A5</tt> </td><td align=left>animated part; animation state in m3 (valid range <tt>00</tt>..<tt>45</tt>)</td></tr>
+ </table>
+ </td></tr>
+ <tr><td nowrap valign=top><tt>A7</tt>..<tt>AE</tt> </td><td align=left>sugar mine
+ <table>
+ <tr><td nowrap valign=top><tt>AE</tt> </td><td align=left>animated part; animation state in m3 (valid range <tt>00</tt>..<tt>5F</tt>)</td></tr>
+ </table>
+ </td></tr>
+ <tr><td colspan=2> </td></tr> <!-- spacer -->
+ </table></li>
+ <li>m2: index into the array of industries</li>
+ <li>m1 bit 7: clear = under construction
+ <ul>
+ <li>m1 bits 4..2: construction counter, for buildings under construction incremented on every periodic tile processing</li>
+ <li>m1 bits 1..0: stage of construction (<tt>3</tt> = completed), incremented when the construction counter wraps around<br>
+ the meaning is different for some animated tiles which are never under construction (types <tt>01</tt>, <tt>1E</tt>..<tt>20</tt>, <tt>30</tt>, <tt>58</tt>; see above)</li>
+ </ul>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="Class9"><tt> 9 </tt></a></td>
+ <td>
+ <ul>
+ <li>m5 bits 7..4 clear: tunnel entrance/exit
+ <ul>
+ <li>m5 bits 3..2: <tt>0</tt> - railway tunnel, <tt>1</tt> - road tunnel</li>
+ <li>m5 bits 1..0 - direction: entrance towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the tunnel</li>
+ <li>m3 bits 3..0 = <a href="#TrackType">track type</a> for railway tunnel, must be 0 for road tunnel</li>
+ <li>m4 bit 7 set = on snow or desert</li>
+ </ul>
+ </li>
+ <li>m5 bit 7 set: bridge ramp
+ <ul>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the bridge</li>
+ <li>m3 bits 3..0 = <a href="#TrackType">type of track</a> on the bridge, must be 0 for road bridge</li>
+ <li>m5 bits 3..2: <tt>0</tt> - railway bridge, <tt>1</tt> - road bridge</li>
+ <li>m5 bit 0..1: DiagDirection onto the bridge</li>
+ <li>m2 bits 7..4: <a name="BridgeType">bridge type</a>:
+ <table>
+ <tr><th align=left>Type </th><th align=left>Max. speed (mph) </th><th align=left>Description</th></tr>
+ <tr><td nowrap valign=top><tt>0</tt> </td><td align=center>20</td><td align=left>wooden</td></tr>
+ <tr><td nowrap valign=top><tt>1</tt> </td><td align=center>30</td><td align=left>concrete</td></tr>
+ <tr><td nowrap valign=top><tt>2</tt> </td><td align=center>40</td><td align=left>girder, steel</td></tr>
+ <tr><td nowrap valign=top><tt>3</tt> </td><td align=center>50</td><td align=left>suspension, concrete</td></tr>
+ <tr><td nowrap valign=top><tt>4</tt> </td><td align=center>60</td><td align=left>suspension, steel</td></tr>
+ <tr><td nowrap valign=top><tt>5</tt> </td><td align=center>70</td><td align=left>suspension, steel</td></tr>
+ <tr><td nowrap valign=top><tt>6</tt> </td><td align=center>100</td><td align=left>cantilever, steel</td></tr>
+ <tr><td nowrap valign=top><tt>7</tt> </td><td align=center>130</td><td align=left>cantilever, steel</td></tr>
+ <tr><td nowrap valign=top><tt>8</tt> </td><td align=center>150</td><td align=left>cantilever, steel</td></tr>
+ <tr><td nowrap valign=top><tt>9</tt> </td><td align=center>160</td><td align=left>girder, steel</td></tr>
+ <tr><td nowrap valign=top><tt>A</tt> </td><td align=center>200</td><td align=left>tubular, steel</td></tr>
+ </table>
+ </li>
+ <li>m4 bit 7 set = on snow or desert</li>
+ </ul>
+ <li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign=top nowrap><a name="ClassA"><tt> A </tt></a></td>
+ <td>
+ <ul>
+ <li>m5: tile type:
+ <table>
+ <tr><td nowrap valign=top><tt>00</tt> </td><td align=left>transmitter</td></tr>
+ <tr><td nowrap valign=top><tt>01</tt> </td><td align=left>lighthouse</td></tr>
+ <tr><td nowrap valign=top><tt>02</tt> </td><td align=left>company statue</td></tr>
+ <tr><td nowrap valign=top><tt>03</tt> </td><td align=left>company-owned land</td></tr>
+ <tr><td nowrap valign=top><tt>80</tt>..<tt>93</tt> </td><td align=left>company headquarters (5 sets of 4 tiles each, updated quarterly depending on the company performance)</td></tr>
+ </table>
+ </li>
+ <li>m1: <a href="#OwnershipInfo">owner</a> of the object (for lighthouses and transmitters normally <tt>10</tt>)</li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr><td colspan=2>Classes <tt>B</tt> through <tt>F</tt> are reserved. The presence of a tile in one of the reserved classes will crash OTTD.</td></tr>
+ </table>
-<hr>
-Original Copyright © 2003 by Marcin Grzegorczyk for TTDLX.<br>
-Transport Tycoon and Transport Tycoon Deluxe are Copyright © by Chris Sawyer. All the other trademarks are the property of their respective owners.<br>
+ <hr>
+ Original Copyright © 2003 by Marcin Grzegorczyk for TTDLX.<br>
+ Transport Tycoon and Transport Tycoon Deluxe are Copyright © by Chris Sawyer.<br>
+ All the other trademarks are the property of their respective owners.<br>
+</body>
-</body>
</html>
--- a/source.list Wed Feb 14 10:46:38 2007 +0000
+++ b/source.list Sat Feb 17 11:12:50 2007 +0000
@@ -366,12 +366,18 @@
#else
#if WINCE
#else
- music/extmidi.cpp
+ #if PSP
+ #else
+ music/extmidi.cpp
+ #end
#end
#end
#if BEOS
music/bemidi.cpp
#end
+#if LIBTIMIDITY
+ music/libtimidity.cpp
+#end
# Sound
sound/null_s.cpp
--- a/src/ai/default/default.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/ai/default/default.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -3244,7 +3244,6 @@
static void AiStateAirportStuff(Player *p)
{
const Station* st;
- byte acc_planes;
int i;
AiBuildRec *aib;
byte rule;
@@ -3268,16 +3267,11 @@
// Do we own the airport? (Oilrigs aren't owned, though.)
if (st->owner != OWNER_NONE && st->owner != _current_player) continue;
- acc_planes = GetAirport(st->airport_type)->acc_planes;
-
- // Dismiss heliports, unless we are checking an oilrig.
- if (acc_planes == HELICOPTERS_ONLY && (p->ai.build_kind != 1 || i != 1))
+ AirportFTAClass::Flags flags = st->Airport()->flags;
+
+ if (!(flags & (p->ai.build_kind == 1 && i == 0 ? AirportFTAClass::HELICOPTERS : AirportFTAClass::AIRPLANES))) {
continue;
-
- // Dismiss country airports if we are doing the other
- // endpoint of an oilrig route.
- if (acc_planes == AIRCRAFT_ONLY && (p->ai.build_kind == 1 && i == 0))
- continue;
+ }
// Dismiss airports too far away.
if (DistanceMax(st->airport_tile, aib->spec_tile) > aib->rand_rng)
@@ -3298,7 +3292,7 @@
* broken because they will probably need different
* tileoff values etc), no matter that
* IsHangarTile() makes no sense. --pasky */
- if (acc_planes == HELICOPTERS_ONLY) {
+ if (!(flags & AirportFTAClass::AIRPLANES)) {
/* Heliports should have maybe own rulesets but
* OTOH we don't want AI to pick them up when
* looking for a suitable airport type to build.
@@ -3339,19 +3333,13 @@
static bool AiCheckAirportResources(TileIndex tile, const AiDefaultBlockData *p, byte cargo)
{
uint values[NUM_CARGO];
- int rad;
-
- if (_patches.modified_catchment) {
- rad = CA_AIR_LARGE; // I Have NFI what airport the
- } else { // AI is going to build here
- rad = 4;
- }
for (; p->mode == 0; p++) {
TileIndex tile2 = TILE_ADD(tile, ToTileIndexDiff(p->tileoffs));
const AirportFTAClass* airport = GetAirport(p->attr);
uint w = airport->size_x;
uint h = airport->size_y;
+ uint rad = _patches.modified_catchment ? airport->catchment : 4;
if (cargo & 0x80) {
GetProductionAroundTiles(values, tile2, w, h, rad);
@@ -3372,7 +3360,7 @@
for (i = 0; (p = _airport_default_block_data[i]) != NULL; i++) {
// If we are doing a helicopter service, avoid building
// airports where they can't land.
- if (heli && GetAirport(p->attr)->acc_planes == AIRCRAFT_ONLY) continue;
+ if (heli && !(GetAirport(p->attr)->flags & AirportFTAClass::HELICOPTERS)) continue;
*cost = AiDoBuildDefaultAirportBlock(tile, p, 0);
if (!CmdFailed(*cost) && AiCheckAirportResources(tile, p, cargo))
@@ -3475,7 +3463,7 @@
/* XXX - Have the AI pick the hangar terminal in an airport. Eg get airport-type
* and offset to the FIRST depot because the AI picks the st->xy tile */
- tile += ToTileIndexDiff(GetAirport(GetStationByTile(tile)->airport_type)->airport_depots[0]);
+ tile += ToTileIndexDiff(GetStationByTile(tile)->Airport()->airport_depots[0]);
if (CmdFailed(DoCommand(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT))) return;
loco_id = _new_vehicle_id;
--- a/src/ai/trolly/pathfinder.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/ai/trolly/pathfinder.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -372,9 +372,9 @@
extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c
extern uint GetRoadFoundation(Slope tileh, RoadBits bits); // XXX function declaration in .c
extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c
-enum {
+typedef enum BridgeFoundations{
BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
-};
+} BridgeFoundation;
// The most important function: it calculates the g-value
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
--- a/src/aircraft_cmd.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/aircraft_cmd.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -74,22 +74,23 @@
TileIndex vtile = TileVirtXY(v->x_pos, v->y_pos);
FOR_ALL_STATIONS(st) {
- if (st->owner == v->owner && st->facilities & FACIL_AIRPORT &&
- GetAirport(st->airport_type)->nof_depots > 0) {
- uint distance;
+ if (st->owner != v->owner || !(st->facilities & FACIL_AIRPORT)) continue;
- // don't crash the plane if we know it can't land at the airport
- if ((AircraftVehInfo(v->engine_type)->subtype & AIR_FAST) &&
- (st->airport_type == AT_SMALL || st->airport_type == AT_COMMUTER) &&
- !_cheats.no_jetcrash.value)
- continue;
+ const AirportFTAClass *afc = st->Airport();
+ if (afc->nof_depots == 0 || (
+ /* don't crash the plane if we know it can't land at the airport */
+ afc->flags & AirportFTAClass::SHORT_STRIP &&
+ AircraftVehInfo(v->engine_type)->subtype & AIR_FAST &&
+ !_cheats.no_jetcrash.value
+ )) {
+ continue;
+ }
- // v->tile can't be used here, when aircraft is flying v->tile is set to 0
- distance = DistanceSquare(vtile, st->airport_tile);
- if (distance < best || index == INVALID_STATION) {
- best = distance;
- index = st->index;
- }
+ // v->tile can't be used here, when aircraft is flying v->tile is set to 0
+ uint distance = DistanceSquare(vtile, st->airport_tile);
+ if (distance < best || index == INVALID_STATION) {
+ best = distance;
+ index = st->index;
}
}
return index;
@@ -105,7 +106,7 @@
const Station *st = GetStation(order->station);
if (st->owner == v->owner && st->facilities & FACIL_AIRPORT) {
// If an airport doesn't have a hangar, skip it
- if (GetAirport(st->airport_type)->nof_depots != 0)
+ if (st->Airport()->nof_depots != 0)
return true;
}
}
@@ -249,8 +250,8 @@
// Prevent building aircraft types at places which can't handle them
const Station* st = GetStationByTile(tile);
- const AirportFTAClass* apc = GetAirport(st->airport_type);
- if ((avi->subtype & AIR_CTOL ? HELICOPTERS_ONLY : AIRCRAFT_ONLY) == apc->acc_planes) {
+ const AirportFTAClass* apc = st->Airport();
+ if (!(apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS))) {
return CMD_ERROR;
}
@@ -558,7 +559,7 @@
StationID next_airport_index = v->u.air.targetairport;
const Station *st = GetStation(next_airport_index);
/* If the station is not a valid airport or if it has no hangars */
- if (!st->IsValid() || st->airport_tile == 0 || GetAirport(st->airport_type)->nof_depots == 0) {
+ if (!st->IsValid() || st->airport_tile == 0 || st->Airport()->nof_depots == 0) {
StationID station;
// the aircraft has to search for a hangar on its own
@@ -695,7 +696,7 @@
st = GetStation(v->current_order.dest);
// only goto depot if the target airport has terminals (eg. it is airport)
- if (st->IsValid() && st->airport_tile != 0 && GetAirport(st->airport_type)->terminals != NULL) {
+ if (st->IsValid() && st->airport_tile != 0 && st->Airport()->terminals != NULL) {
// printf("targetairport = %d, st->index = %d\n", v->u.air.targetairport, st->index);
// v->u.air.targetairport = st->index;
v->current_order.type = OT_GOTO_DEPOT;
@@ -969,7 +970,8 @@
}
// get airport moving data
- const AirportMovingData *amd = GetAirport(st->airport_type)->MovingData(v->u.air.pos);
+ const AirportFTAClass *afc = st->Airport();
+ const AirportMovingData *amd = afc->MovingData(v->u.air.pos);
// Helicopter raise
if (amd->flag & AMED_HELI_RAISE) {
@@ -1011,9 +1013,7 @@
v->tile = st->airport_tile;
// Find altitude of landing position.
- z = GetSlopeZ(x, y) + 1;
- if (st->airport_type == AT_OILRIG) z += 54;
- if (st->airport_type == AT_HELIPORT) z += 60;
+ z = GetSlopeZ(x, y) + 1 + afc->delta_z;
if (z == v->z_pos) {
u = v->next->next;
@@ -1369,7 +1369,9 @@
//FIXME -- MaybeCrashAirplane -> increase crashing chances of very modern airplanes on smaller than AT_METROPOLITAN airports
prob = 0x10000 / 1500;
- if (((st->airport_type == AT_SMALL) || (st->airport_type == AT_COMMUTER)) && (AircraftVehInfo(v->engine_type)->subtype & AIR_FAST) && !_cheats.no_jetcrash.value) {
+ if (st->Airport()->flags & AirportFTAClass::SHORT_STRIP &&
+ AircraftVehInfo(v->engine_type)->subtype & AIR_FAST &&
+ !_cheats.no_jetcrash.value) {
prob = 0x10000 / 20;
}
@@ -1441,19 +1443,52 @@
MaybeCrashAirplane(v);
}
+/**
+ * Find the entry point to an airport depending on direction which
+ * the airport is being approached from. Each airport can have up to
+ * four entry points for its approach system so that approaching
+ * aircraft do not fly through each other or are forced to do 180
+ * degree turns during the approach. The arrivals are grouped into
+ * four sectors dependent on the DiagDirection from which the airport
+ * is approached.
+ *
+ * @param v The vehicle that is approaching the airport
+ * @param apc The Airport Class being approached.
+ * @returns The index of the entry point
+ */
+static byte AircraftGetEntryPoint(const Vehicle *v, const AirportFTAClass *apc)
+{
+ assert(v != NULL);
+ assert(apc != NULL);
+
+ const Station *st = GetStation(v->u.air.targetairport);
+ /* Make sure we don't go to 0,0 if the airport has been removed. */
+ TileIndex tile = (st->airport_tile != 0) ? st->airport_tile : st->xy;
+
+ int delta_x = v->x_pos - TileX(tile) * TILE_SIZE;
+ int delta_y = v->y_pos - TileY(tile) * TILE_SIZE;
+
+ DiagDirection dir;
+ if (abs(delta_y) < abs(delta_x)) {
+ /* We are northeast or southwest of the airport */
+ dir = delta_x < 0 ? DIAGDIR_NE : DIAGDIR_SW;
+ } else {
+ /* We are northwest or southeast of the airport */
+ dir = delta_y < 0 ? DIAGDIR_NW : DIAGDIR_SE;
+ }
+ return apc->entry_points[dir];
+}
+
+
// set the right pos when heading to other airports after takeoff
static void AircraftNextAirportPos_and_Order(Vehicle *v)
{
- const Station* st;
- const AirportFTAClass *apc;
-
if (v->current_order.type == OT_GOTO_STATION ||
v->current_order.type == OT_GOTO_DEPOT)
v->u.air.targetairport = v->current_order.dest;
- st = GetStation(v->u.air.targetairport);
- apc = GetAirport(st->airport_type);
- v->u.air.pos = v->u.air.previous_pos = apc->entry_point;
+ const AirportFTAClass *apc = GetStation(v->u.air.targetairport)->Airport();
+ v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, apc);
}
static void AircraftLeaveHangar(Vehicle *v)
@@ -1637,12 +1672,8 @@
uint16 tcur_speed, tsubspeed;
st = GetStation(v->u.air.targetairport);
- // flying device is accepted at this station
- // small airport --> no helicopters (AIRCRAFT_ONLY)
- // all other airports --> all types of flying devices (ALL)
- // heliport/oilrig, etc --> no airplanes (HELICOPTERS_ONLY)
// runway busy or not allowed to use this airstation, circle
- if (v->subtype != apc->acc_planes &&
+ if (apc->flags & (v->subtype == AIR_HELICOPTER ? AirportFTAClass::HELICOPTERS : AirportFTAClass::AIRPLANES) &&
st->airport_tile != 0 &&
(st->owner == OWNER_NONE || st->owner == v->owner)) {
// {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
@@ -1823,8 +1854,7 @@
current = current->next;
} while (current != NULL);
- DEBUG(misc, 0, "[Ap] cannot move further on Airport! (pos %d state %d)", v->u.air.pos, v->u.air.state);
- DEBUG(misc, 0, "[Ap] airport entry point: %d, Vehicle: %d", apc->entry_point, v->index);
+ DEBUG(misc, 0, "[Ap] cannot move further on Airport! (pos %d state %d) for vehicle %d", v->u.air.pos, v->u.air.state, v->index);
assert(0);
return false;
}
@@ -1838,7 +1868,7 @@
// same block, then of course we can move
if (apc->layout[current_pos->position].block != next->block) {
const Station *st = GetStation(v->u.air.targetairport);
- uint32 airport_flags = next->block;
+ uint64 airport_flags = next->block;
// check additional possible extra blocks
if (current_pos != reference && current_pos->block != NOTHING_block) {
@@ -1862,7 +1892,7 @@
// if the next position is in another block, check it and wait until it is free
if ((apc->layout[current_pos->position].block & next->block) != next->block) {
- uint32 airport_flags = next->block;
+ uint64 airport_flags = next->block;
Station* st = GetStation(v->u.air.targetairport);
//search for all all elements in the list with the same state, and blocks != N
// this means more blocks should be checked/set
@@ -2050,10 +2080,7 @@
if (v->current_order.type >= OT_LOADING) return;
- // pass the right airport structure to the functions
- // DEREF_STATION gets target airport (Station *st), its type is passed to GetAirport
- // that returns the correct layout depending on type
- AirportGoToNextPosition(v, GetAirport(GetStation(v->u.air.targetairport)->airport_type));
+ AirportGoToNextPosition(v, GetStation(v->u.air.targetairport)->Airport());
}
void Aircraft_Tick(Vehicle *v)
@@ -2119,7 +2146,7 @@
byte takeofftype;
uint16 cnt;
// only 1 station is updated per function call, so it is enough to get entry_point once
- const AirportFTAClass *ap = GetAirport(st->airport_type);
+ const AirportFTAClass *ap = st->Airport();
FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Aircraft && IsNormalAircraft(v)) {
if (v->u.air.targetairport == st->index) { // if heading to this airport
@@ -2127,7 +2154,7 @@
*you cannot delete airport, so it doesn't matter
*/
if (v->u.air.state >= FLYING) { // circle around
- v->u.air.pos = v->u.air.previous_pos = ap->entry_point;
+ v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, ap);
v->u.air.state = FLYING;
// landing plane needs to be reset to flying height (only if in pause mode upgrade,
// in normal mode, plane is reset in AircraftController. It doesn't hurt for FLYING
--- a/src/airport.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/airport.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -36,120 +36,140 @@
_airport_moving_data_country,
_airport_terminal_country,
NULL,
- 16,
- ALL,
+ _airport_entries_country,
+ AirportFTAClass::ALL | AirportFTAClass::SHORT_STRIP,
_airport_fta_country,
_airport_depots_country,
lengthof(_airport_depots_country),
- 4, 3
+ 4, 3,
+ 0,
+ 4
);
CityAirport = new AirportFTAClass(
_airport_moving_data_town,
_airport_terminal_city,
NULL,
- 19,
- ALL,
+ _airport_entries_city,
+ AirportFTAClass::ALL,
_airport_fta_city,
_airport_depots_city,
lengthof(_airport_depots_city),
- 6, 6
+ 6, 6,
+ 0,
+ 5
);
MetropolitanAirport = new AirportFTAClass(
_airport_moving_data_metropolitan,
_airport_terminal_metropolitan,
NULL,
- 20,
- ALL,
+ _airport_entries_metropolitan,
+ AirportFTAClass::ALL,
_airport_fta_metropolitan,
_airport_depots_metropolitan,
lengthof(_airport_depots_metropolitan),
- 6, 6
+ 6, 6,
+ 0,
+ 6
);
InternationalAirport = new AirportFTAClass(
_airport_moving_data_international,
_airport_terminal_international,
_airport_helipad_international,
- 37,
- ALL,
+ _airport_entries_international,
+ AirportFTAClass::ALL,
_airport_fta_international,
_airport_depots_international,
lengthof(_airport_depots_international),
- 7, 7
+ 7, 7,
+ 0,
+ 8
);
IntercontinentalAirport = new AirportFTAClass(
_airport_moving_data_intercontinental,
_airport_terminal_intercontinental,
_airport_helipad_intercontinental,
- 43,
- ALL,
+ _airport_entries_intercontinental,
+ AirportFTAClass::ALL,
_airport_fta_intercontinental,
_airport_depots_intercontinental,
lengthof(_airport_depots_intercontinental),
- 9,11
+ 9, 11,
+ 0,
+ 10
);
Heliport = new AirportFTAClass(
_airport_moving_data_heliport,
NULL,
_airport_helipad_heliport_oilrig,
- 7,
- HELICOPTERS_ONLY,
+ _airport_entries_heliport_oilrig,
+ AirportFTAClass::HELICOPTERS,
_airport_fta_heliport_oilrig,
NULL,
0,
- 1, 1
+ 1, 1,
+ 60,
+ 4
);
Oilrig = new AirportFTAClass(
_airport_moving_data_oilrig,
NULL,
_airport_helipad_heliport_oilrig,
- 7,
- HELICOPTERS_ONLY,
+ _airport_entries_heliport_oilrig,
+ AirportFTAClass::HELICOPTERS,
_airport_fta_heliport_oilrig,
NULL,
0,
- 1, 1
+ 1, 1,
+ 54,
+ 3
);
CommuterAirport = new AirportFTAClass(
_airport_moving_data_commuter,
_airport_terminal_commuter,
_airport_helipad_commuter,
- 22,
- ALL,
+ _airport_entries_commuter,
+ AirportFTAClass::ALL | AirportFTAClass::SHORT_STRIP,
_airport_fta_commuter,
_airport_depots_commuter,
lengthof(_airport_depots_commuter),
- 5,4
+ 5, 4,
+ 0,
+ 4
);
HeliDepot = new AirportFTAClass(
_airport_moving_data_helidepot,
NULL,
_airport_helipad_helidepot,
- 4,
- HELICOPTERS_ONLY,
+ _airport_entries_helidepot,
+ AirportFTAClass::HELICOPTERS,
_airport_fta_helidepot,
_airport_depots_helidepot,
lengthof(_airport_depots_helidepot),
- 2,2
+ 2, 2,
+ 0,
+ 4
);
HeliStation = new AirportFTAClass(
_airport_moving_data_helistation,
NULL,
_airport_helipad_helistation,
- 25,
- HELICOPTERS_ONLY,
+ _airport_entries_helistation,
+ AirportFTAClass::HELICOPTERS,
_airport_fta_helistation,
_airport_depots_helistation,
lengthof(_airport_depots_helistation),
- 4,2
+ 4, 2,
+ 0,
+ 4
);
}
@@ -181,28 +201,31 @@
const AirportMovingData *moving_data_,
const byte *terminals_,
const byte *helipads_,
- const byte entry_point_,
- const AcceptPlanes acc_planes_,
+ const byte *entry_points_,
+ Flags flags_,
const AirportFTAbuildup *apFA,
const TileIndexDiffC *depots_,
const byte nof_depots_,
uint size_x_,
- uint size_y_
+ uint size_y_,
+ byte delta_z_,
+ byte catchment_
) :
moving_data(moving_data_),
terminals(terminals_),
helipads(helipads_),
airport_depots(depots_),
+ flags(flags_),
nof_depots(nof_depots_),
nofelements(AirportGetNofElements(apFA)),
- entry_point(entry_point_),
+ entry_points(entry_points_),
size_x(size_x_),
- size_y(size_y_)
+ size_y(size_y_),
+ delta_z(delta_z_),
+ catchment(catchment_)
{
byte nofterminalgroups, nofhelipadgroups;
- acc_planes = acc_planes_; // XXX TinyEnumT has no initialisation, only assignment
-
/* Set up the terminal and helipad count for an airport.
* TODO: If there are more than 10 terminals or 4 helipads, internal variables
* need to be changed, so don't allow that for now */
@@ -221,15 +244,18 @@
/* Get the number of elements from the source table. We also double check this
* with the entry point which must be within bounds and use this information
* later on to build and validate the state machine */
- if (entry_point >= nofelements) {
- DEBUG(misc, 0, "[Ap] entry (%d) must be within the airport (maximum %d)", entry_point, nofelements);
- assert(entry_point < nofelements);
+ for (DiagDirection i = DIAGDIR_BEGIN; i < DIAGDIR_END; i++) {
+ if (entry_points[i] >= nofelements) {
+ DEBUG(misc, 0, "[Ap] entry (%d) must be within the airport (maximum %d)", entry_points[i], nofelements);
+ assert(entry_points[i] < nofelements);
+ }
}
/* Build the state machine itself */
layout = AirportBuildAutomata(nofelements, apFA);
- DEBUG(misc, 2, "[Ap] #count %3d; #term %2d (%dgrp); #helipad %2d (%dgrp); entry %3d",
- nofelements, nofterminals, nofterminalgroups, nofhelipads, nofhelipadgroups, entry_point);
+ DEBUG(misc, 2, "[Ap] #count %3d; #term %2d (%dgrp); #helipad %2d (%dgrp); entries %3d, %3d, %3d, %3d",
+ nofelements, nofterminals, nofterminalgroups, nofhelipads, nofhelipadgroups,
+ entry_points[DIAGDIR_NE], entry_points[DIAGDIR_SE], entry_points[DIAGDIR_SW], entry_points[DIAGDIR_NW]);
/* Test if everything went allright. This is only a rude static test checking
* the symantic correctness. By no means does passing the test mean that the
--- a/src/airport.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/airport.h Sat Feb 17 11:12:50 2007 +0000
@@ -24,18 +24,6 @@
AT_OILRIG = 15
};
-// do not change unless you change v->subtype too. This aligns perfectly with its current setting
-enum AcceptPlanes {
- ACC_BEGIN = 0,
- AIRCRAFT_ONLY = 0,
- ALL = 1,
- HELICOPTERS_ONLY = 2,
- ACC_END
-};
-
-/** Define basic enum properties */
-template <> struct EnumPropsT<AcceptPlanes> : MakeEnumPropsT<AcceptPlanes, byte, ACC_BEGIN, ACC_END, ACC_END> {};
-typedef TinyEnumT<AcceptPlanes> AcceptPlanesByte;
enum {
AMED_NOSPDCLAMP = 1 << 0,
@@ -133,17 +121,26 @@
// Finite sTate mAchine --> FTA
typedef struct AirportFTAClass {
public:
+ enum Flags {
+ AIRPLANES = 0x1,
+ HELICOPTERS = 0x2,
+ ALL = AIRPLANES | HELICOPTERS,
+ SHORT_STRIP = 0x4
+ };
+
AirportFTAClass(
const AirportMovingData *moving_data,
const byte *terminals,
const byte *helipads,
- byte entry_point,
- AcceptPlanes acc_planes,
+ const byte *entry_points,
+ Flags flags,
const AirportFTAbuildup *apFA,
const TileIndexDiffC *depots,
byte nof_depots,
uint size_x,
- uint size_y
+ uint size_y,
+ byte delta_z,
+ byte catchment
);
~AirportFTAClass();
@@ -159,18 +156,23 @@
const byte *terminals;
const byte *helipads;
const TileIndexDiffC *airport_depots; // gives the position of the depots on the airports
+ Flags flags;
byte nof_depots; // number of depots this airport has
byte nofelements; // number of positions the airport consists of
- byte entry_point; // when an airplane arrives at this airport, enter it at position entry_point
- AcceptPlanesByte acc_planes; // accept airplanes or helicopters or both
+ const byte *entry_points; ///< when an airplane arrives at this airport, enter it at position entry_point, index depends on direction
byte size_x;
byte size_y;
+ byte delta_z; // Z adjustment for helicopter pads
+ byte catchment;
} AirportFTAClass;
+DECLARE_ENUM_AS_BIT_SET(AirportFTAClass::Flags)
+
+
// internal structure used in openttd - Finite sTate mAchine --> FTA
typedef struct AirportFTA {
struct AirportFTA *next; // possible extra movement choices from this position
- uint32 block; // 32 bit blocks (st->airport_flags), should be enough for the most complex airports
+ uint64 block; // 64 bit blocks (st->airport_flags), should be enough for the most complex airports
byte position; // the position that an airplane is at
byte next_position; // next position from this position
byte heading; // heading (current orders), guiding an airplane to its target on an airport
--- a/src/airport_gui.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/airport_gui.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -150,7 +150,6 @@
case WE_PAINT: {
int i; // airport enabling loop
- int rad = 4; // default catchment radious
uint32 avail_airports;
const AirportFTAClass *airport;
@@ -175,20 +174,7 @@
airport = GetAirport(_selected_airport_type);
SetTileSelectSize(airport->size_x, airport->size_y);
- if (_patches.modified_catchment) {
- switch (_selected_airport_type) {
- case AT_OILRIG: rad = CA_AIR_OILPAD; break;
- case AT_HELIPORT: rad = CA_AIR_HELIPORT; break;
- case AT_SMALL: rad = CA_AIR_SMALL; break;
- case AT_LARGE: rad = CA_AIR_LARGE; break;
- case AT_METROPOLITAN: rad = CA_AIR_METRO; break;
- case AT_INTERNATIONAL: rad = CA_AIR_INTER; break;
- case AT_COMMUTER: rad = CA_AIR_COMMUTER; break;
- case AT_HELIDEPOT: rad = CA_AIR_HELIDEPOT; break;
- case AT_INTERCON: rad = CA_AIR_INTERCON; break;
- case AT_HELISTATION: rad = CA_AIR_HELISTATION; break;
- }
- }
+ int rad = _patches.modified_catchment ? airport->catchment : 4;
if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
--- a/src/airport_movement.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/airport_movement.h Sat Feb 17 11:12:50 2007 +0000
@@ -373,6 +373,7 @@
* this may be changed later when airports are moved to external file */
static const TileIndexDiffC _airport_depots_country[] = {{3, 0}};
static const byte _airport_terminal_country[] = {1, 2};
+static const byte _airport_entries_country[] = {16, 16, 16, 16};
static const AirportFTAbuildup _airport_fta_country[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, 255, AIRPORT_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM1, TERM1_block, 2 }, { 1, TERM2, 0, 4 }, { 1, HELITAKEOFF, 0, 19 }, { 1, 0, 0, 6 },
@@ -405,6 +406,7 @@
static const TileIndexDiffC _airport_depots_commuter[] = { { 4, 0 } };
static const byte _airport_terminal_commuter[] = { 1, 3 };
static const byte _airport_helipad_commuter[] = { 1, 2 };
+static const byte _airport_entries_commuter[] = {7, 7, 7, 7};
static const AirportFTAbuildup _airport_fta_commuter[] = {
{ 0, HANGAR, NOTHING_block, 1 }, { 0, HELITAKEOFF, HELIPAD2_block, 1 }, { 0, 0, 0, 1 },
{ 1, 255, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TAKEOFF, 0, 11 }, { 1, TERM1, TAXIWAY_BUSY_block, 10 }, { 1, TERM2, TAXIWAY_BUSY_block, 10 }, { 1, TERM3, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD1, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD2, TAXIWAY_BUSY_block, 10 }, { 1, HELITAKEOFF, TAXIWAY_BUSY_block, 10 }, { 1, 0, 0, 0 },
@@ -454,6 +456,7 @@
static const TileIndexDiffC _airport_depots_city[] = { { 5, 0 } };
static const byte _airport_terminal_city[] = { 1, 3 };
+static const byte _airport_entries_city[] = {19, 19, 19, 19};
static const AirportFTAbuildup _airport_fta_city[] = {
{ 0, HANGAR, NOTHING_block, 1 }, { 0, TAKEOFF, OUT_WAY_block, 1 }, { 0, 0, 0, 1 },
{ 1, 255, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM2, 0, 6 }, { 1, TERM3, 0, 6 }, { 1, 0, 0, 7 }, // for all else, go to 7
@@ -489,6 +492,7 @@
static const TileIndexDiffC _airport_depots_metropolitan[] = { { 5, 0 } };
static const byte _airport_terminal_metropolitan[] = { 1, 3 };
+static const byte _airport_entries_metropolitan[] = {20, 20, 20, 20};
static const AirportFTAbuildup _airport_fta_metropolitan[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, 255, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TERM2, 0, 6 }, { 1, TERM3, 0, 6 }, { 1, 0, 0, 7 }, // for all else, go to 7
@@ -527,6 +531,7 @@
static const TileIndexDiffC _airport_depots_international[] = { { 0, 3 }, { 6, 1 } };
static const byte _airport_terminal_international[] = { 2, 3, 3 };
static const byte _airport_helipad_international[] = { 1, 2 };
+static const byte _airport_entries_international[] = { 37, 37, 37, 37 };
static const AirportFTAbuildup _airport_fta_international[] = {
{ 0, HANGAR, NOTHING_block, 2 }, { 0, 255, TERM_GROUP1_block, 0 }, { 0, 255, TERM_GROUP2_ENTER1_block, 1 }, { 0, HELITAKEOFF, HELIPAD1_block, 2 }, { 0, 0, 0, 2 },
{ 1, HANGAR, NOTHING_block, 3 }, { 1, 255, HANGAR2_AREA_block, 1 }, { 1, HELITAKEOFF, HELIPAD2_block, 3 }, { 1, 0, 0, 3 },
@@ -592,6 +597,7 @@
static const TileIndexDiffC _airport_depots_intercontinental[] = { { 0, 5 }, { 8, 4 } };
static const byte _airport_terminal_intercontinental[] = { 2, 4, 4 };
static const byte _airport_helipad_intercontinental[] = { 1, 2 };
+static const byte _airport_entries_intercontinental[] = { 43, 43, 43, 43 };
static const AirportFTAbuildup _airport_fta_intercontinental[] = {
{ 0, HANGAR, NOTHING_block, 2 }, { 0, 255, HANGAR1_AREA_block | TERM_GROUP1_block, 0 }, { 0, 255, HANGAR1_AREA_block | TERM_GROUP1_block, 1 }, { 0, TAKEOFF, HANGAR1_AREA_block | TERM_GROUP1_block, 2 }, { 0, 0, 0, 2 },
{ 1, HANGAR, NOTHING_block, 3 }, { 1, 255, HANGAR2_AREA_block, 1 }, { 1, 255, HANGAR2_AREA_block, 0 }, { 1, 0, 0, 3 },
@@ -684,6 +690,7 @@
// heliports, oilrigs don't have depots
static const byte _airport_helipad_heliport_oilrig[] = { 1, 1 };
+static const byte _airport_entries_heliport_oilrig[] = { 7, 7, 7, 7 };
static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
{ 0, HELIPAD1, HELIPAD1_block, 1 },
{ 1, HELITAKEOFF, NOTHING_block, 0 }, // takeoff
@@ -701,6 +708,7 @@
// helidepots
static const TileIndexDiffC _airport_depots_helidepot[] = { { 1, 0 } };
static const byte _airport_helipad_helidepot[] = { 1, 1 };
+static const byte _airport_entries_helidepot[] = { 4, 4, 4, 4 };
static const AirportFTAbuildup _airport_fta_helidepot[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELIPAD1, HELIPAD1_block, 14 }, { 1, HELITAKEOFF, 0, 15 }, { 1, 0, 0, 0 },
@@ -730,6 +738,7 @@
// helistation
static const TileIndexDiffC _airport_depots_helistation[] = { { 0, 0 } };
static const byte _airport_helipad_helistation[] = { 1, 3 };
+static const byte _airport_entries_helistation[] = { 25, 25, 25, 25 };
static const AirportFTAbuildup _airport_fta_helistation[] = {
{ 0, HANGAR, NOTHING_block, 8 }, { 0, HELIPAD1, 0, 1 }, { 0, HELIPAD2, 0, 1 }, { 0, HELIPAD3, 0, 1 }, { 0, HELITAKEOFF, 0, 1 }, { 0, 0, 0, 0 },
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELITAKEOFF, 0, 3 }, { 1, 0, 0, 4 },
--- a/src/build_vehicle_gui.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/build_vehicle_gui.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -224,6 +224,15 @@
return _internal_sort_order ? -r : r;
}
+static int CDECL TrainEngineNumberSorter(const void *a, const void *b)
+{
+ const EngineID va = *(const EngineID*)a;
+ const EngineID vb = *(const EngineID*)b;
+ int r = ListPositionOfEngine(va) - ListPositionOfEngine(vb);
+
+ return _internal_sort_order ? -r : r;
+}
+
static int CDECL TrainEnginesThenWagonsSorter(const void *a, const void *b)
{
EngineID va = *(const EngineID*)a;
@@ -290,7 +299,7 @@
static EngList_SortTypeFunction * const _sorter[][9] = {{
/* Trains */
- &EngineNumberSorter,
+ &TrainEngineNumberSorter,
&TrainEngineCostSorter,
&TrainEngineSpeedSorter,
&TrainEnginePowerSorter,
@@ -922,7 +931,7 @@
if (e->we.sizing.diff.x != 0) w->ResizeButtons(BUILD_VEHICLE_WIDGET_BUILD, BUILD_VEHICLE_WIDGET_RENAME);
if (e->we.sizing.diff.y == 0) break;
- w->vscroll.cap += e->we.sizing.diff.y / GetVehicleListHeight(bv->vehicle_type);
+ w->vscroll.cap += e->we.sizing.diff.y / (int)GetVehicleListHeight(bv->vehicle_type);
w->widget[BUILD_VEHICLE_WIDGET_LIST].data = (w->vscroll.cap << 8) + 1;
break;
}
@@ -975,8 +984,8 @@
w->Resize(27, 0);
break;
case VEH_Aircraft:
- AcceptPlanes acc_planes = (tile == 0) ? ALL : GetAirport(GetStationByTile(tile)->airport_type)->acc_planes;
- bv->filter.acc_planes = acc_planes;
+ bv->filter.flags =
+ tile == 0 ? AirportFTAClass::ALL : GetStationByTile(tile)->Airport()->flags;
w->Resize(12, 0);
break;
}
--- a/src/command.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/command.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -45,6 +45,7 @@
DEF_COMMAND(CmdRemoveTrainWaypoint);
DEF_COMMAND(CmdBuildRoadStop);
+DEF_COMMAND(CmdRemoveRoadStop);
DEF_COMMAND(CmdBuildLongRoad);
DEF_COMMAND(CmdRemoveLongRoad);
@@ -188,7 +189,7 @@
{NULL, 0}, /* 19 */
{NULL, 0}, /* 20 */
{CmdBuildRoadStop, 0}, /* 21 */
- {NULL, 0}, /* 22 */
+ {CmdRemoveRoadStop, 0}, /* 22 */
{CmdBuildLongRoad, 0}, /* 23 */
{CmdRemoveLongRoad, 0}, /* 24 */
{CmdBuildRoad, 0}, /* 25 */
--- a/src/command.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/command.h Sat Feb 17 11:12:50 2007 +0000
@@ -27,6 +27,7 @@
CMD_REMOVE_TRAIN_WAYPOINT = 18,
CMD_BUILD_ROAD_STOP = 21,
+ CMD_REMOVE_ROAD_STOP = 22,
CMD_BUILD_LONG_ROAD = 23,
CMD_REMOVE_LONG_ROAD = 24,
CMD_BUILD_ROAD = 25,
--- a/src/driver.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/driver.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -15,6 +15,7 @@
#include "music/os2_m.h"
#include "music/win32_m.h"
#include "music/qtmidi.h"
+#include "music/libtimidity.h"
#include "sound/null_s.h"
#include "sound/sdl_s.h"
@@ -58,7 +59,10 @@
M("qt", "QuickTime MIDI Driver", &_qtime_music_driver),
#endif
#ifdef UNIX
-#if !defined(__MORPHOS__) && !defined(__AMIGA__)
+#if defined(LIBTIMIDITY)
+ M("libtimidity", "LibTimidity MIDI Driver", &_libtimidity_music_driver),
+#endif /* LIBTIMIDITY */
+#if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(PSP)
M("extmidi", "External MIDI Driver", &_extmidi_music_driver),
#endif
#endif
--- a/src/gfxinit.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/gfxinit.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -387,6 +387,9 @@
assert(load_index == SPR_AIRPORTX_BASE);
load_index += LoadGrfFile("airports.grf", load_index, i++);
+ assert(load_index == SPR_ROADSTOP_BASE);
+ load_index += LoadGrfFile("roadstops.grf", load_index, i++);
+
/* Initialize the unicode to sprite mapping table */
InitializeUnicodeGlyphMap();
--- a/src/lang/american.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/american.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nonuniform stations: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Always allow small airports: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Tree-lined road
STR_1817_ROAD_VEHICLE_DEPOT :Road vehicle depot
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Road/rail grade crossing
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Can't remove bus station...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Can't remove truck station...
##id 0x2000
STR_2000_TOWNS :{WHITE}Towns
--- a/src/lang/brazilian_portuguese.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1043,6 +1043,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Novo busca de caminho global (NPF, sobrepõe NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permite dirigir em pontos de parada nas estradas particulares de cidade: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
@@ -1571,7 +1572,7 @@
STR_1806_ROAD_DEPOT_ORIENTATION :{WHITE}Orientação da Garagem
STR_1807_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Impossível construir garagem aqui...
STR_1808_CAN_T_BUILD_BUS_STATION :{WHITE}Impossível construir estação de ônibus...
-STR_1809_CAN_T_BUILD_TRUCK_STATION :{WHITE}Impossível construir carga de caminhões...
+STR_1809_CAN_T_BUILD_TRUCK_STATION :{WHITE}Impossível construir parada de caminhão
STR_180A_ROAD_CONSTRUCTION :Construir rodovias
STR_180B_BUILD_ROAD_SECTION :{BLACK}Construir trecho rodoviário
STR_180C_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem (para construção e manutenção de automóveis)
@@ -1586,6 +1587,8 @@
STR_1816_TREE_LINED_ROAD :Rodovia arborizada
STR_1817_ROAD_VEHICLE_DEPOT :Garagem
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Passagem de nível
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação de ônibus
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover parada de caminhões
##id 0x2000
STR_2000_TOWNS :{WHITE}Cidades
@@ -1750,10 +1753,10 @@
STR_303F_NO_LONGER_ACCEPTS_OR :{WHITE}{STATION} não aceita mais {STRING} ou {STRING}
STR_3040_NOW_ACCEPTS :{WHITE}{STATION} agora aceita {STRING}
STR_3041_NOW_ACCEPTS_AND :{WHITE}{STATION} agora aceita {STRING} e {STRING}
-STR_3042_BUS_STATION_ORIENTATION :{WHITE}Orientação do ponto de ônibus
-STR_3043_TRUCK_STATION_ORIENT :{WHITE}Orientação do local de carga
-STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Precisa demolir o ponto de ônibus primeiro
-STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Precisa demolir a área de carga primeiro
+STR_3042_BUS_STATION_ORIENTATION :{WHITE}Orientação do estação de ônibus
+STR_3043_TRUCK_STATION_ORIENT :{WHITE}Orientação da parada de caminhão
+STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Precisa demolir a estação de ônibus primeiro
+STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Precisa demolir a parada de caminhão primeiro
STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} Estações
STR_3049_0 :{YELLOW}{STATION} {STATIONFEATURES}
STR_304A_NONE :{YELLOW}- Nenhuma -
@@ -1763,7 +1766,7 @@
STR_304E_SELECT_RAILROAD_STATION :{BLACK}Selecionar a orientação da estação ferroviária
STR_304F_SELECT_NUMBER_OF_PLATFORMS :{BLACK}Selecionar o número de linhas da estação ferroviária
STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Selecionar o tamanho da estação ferroviária
-STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Selecionar orientação do ponto de ônibus
+STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Selecionar orientação do estação de ônibus
STR_3052_SELECT_TRUCK_LOADING_BAY :{BLACK}Selecionar orientação da área de carga
STR_3053_CENTER_MAIN_VIEW_ON_STATION :{BLACK}Centralizar visualização no local estação
STR_3054_SHOW_STATION_RATINGS :{BLACK}Exibir avaliações da estação
@@ -1777,7 +1780,7 @@
STR_305F_AIRCRAFT_HANGAR :Hangar
STR_3060_AIRPORT :Aeroporto
STR_3061_TRUCK_LOADING_AREA :Área de carga de caminhões
-STR_3062_BUS_STATION :Ponto de ônibus
+STR_3062_BUS_STATION :Estação de ônibus
STR_3063_SHIP_DOCK :Doca
STR_3064_HIGHLIGHT_COVERAGE_AREA :{BLACK}Destacar área de cobertura da construção proposta
STR_3065_DON_T_HIGHLIGHT_COVERAGE :{BLACK}Não destacar área de cobertura da construção proposto
--- a/src/lang/bulgarian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/bulgarian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -297,6 +297,7 @@
STR_0141_LOAD_GAME :{BLACK}Отвори игра
STR_SINGLE_PLAYER :{BLACK}Сам играч
STR_MULTIPLAYER :{BLACK}Много играчи
+STR_SCENARIO_EDITOR :{BLACK}Редактор сценарии
STR_64 :64
STR_128 :128
@@ -625,6 +626,8 @@
STR_022A_GENERATE_RANDOM_LAND :{BLACK}Генерирай случаен терен
STR_022B_RESET_LANDSCAPE :{BLACK}Изчисти терена
STR_022C_RESET_LANDSCAPE :{WHITE}Изчисти терена
+STR_RESET_LANDSCAPE_TOOLTIP :{BLACK}Премахни всичко, принадлежащо на играча, от картата
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Сигурен ли си, че искаш да премахнеш всичко, принадлежашо на играча?
STR_022E_LANDSCAPE_GENERATION :{BLACK}Създаване на терен
STR_022F_TOWN_GENERATION :{BLACK}Създаване на град
STR_0230_INDUSTRY_GENERATION :{BLACK}Създаване на индустрия
@@ -729,6 +732,7 @@
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Премахни напълно града
STR_0292_SAVE_SCENARIO :Запис на сценарий
STR_0293_LOAD_SCENARIO :Зареждане на сценарий
+STR_LOAD_HEIGHTMAP :Отвори височинна карта
STR_0294_QUIT_EDITOR :Изход от редактора
STR_0295 :
STR_0296_QUIT :Изход
@@ -1039,6 +1043,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Нестандартни станции: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Нов глобален навигатор (NPF, отменя NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Теглови множител към товарите за симулация на тежки влакове: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Преминаване през спирки на градски пътища: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Малки летища са винаги разрешени: {ORANGE}{STRING}
@@ -1416,6 +1421,8 @@
STR_NETWORK_ERR_NOSERVER :{WHITE} Не може да открия мрежови игри
STR_NETWORK_ERR_NOCONNECTION :{WHITE} Сървърът не отговори на заявката
STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Не може да се свърже поради различие в NewGRF
+STR_NETWORK_ERR_DESYNC :{WHITE} Синхронизацията на мрежовата игра се провали
+STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Връзката с мрежовата игра се загуби
STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Не може да зареди играта
STR_NETWORK_ERR_SERVER_START :{WHITE} Сървъра не може да бъде стартиран
STR_NETWORK_ERR_CLIENT_START :{WHITE} Не може да се свърже
@@ -1580,6 +1587,8 @@
STR_1816_TREE_LINED_ROAD :Асфалтов път с дървета
STR_1817_ROAD_VEHICLE_DEPOT :Авто депо
STR_1818_ROAD_RAIL_LEVEL_CROSSING :ЖП прелез
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Не може да премахне автогарата...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Не може да премахне товарната гара...
##id 0x2000
STR_2000_TOWNS :{WHITE}Градове
@@ -1819,6 +1828,7 @@
STR_4800_IN_THE_WAY :{WHITE}{STRING} пречи
STR_4801 :{WHITE}{INDUSTRY}
STR_4802_COAL_MINE :Мина за въглища
+STR_4803_POWER_STATION :
STR_4804_SAWMILL :Дъскорезница
STR_4805_FOREST :Гора
STR_4806_OIL_REFINERY :Нефтена рафинерия
--- a/src/lang/catalan.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/catalan.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estacions no uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nova cerca de rutes global (NPF, anul·la NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{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_SMALL_AIRPORTS :{LTBLUE}Permet sempre aeroports petits: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Carretera de tres carrils
STR_1817_ROAD_VEHICLE_DEPOT :Cotxeres
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Pas a nivell
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}No es pot treure l'estació d'autobusos...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}No es pot treure l'estació de camions...
##id 0x2000
STR_2000_TOWNS :{WHITE}Poblacions
--- a/src/lang/czech.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/czech.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1099,6 +1099,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nový globální algoritmus hledání cesty (NPF, nahradí NTP): {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_STOP_ON_TOWN_ROAD :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Malá letiště se budou moci stále stavět: {ORANGE}{STRING}
@@ -1642,6 +1643,8 @@
STR_1816_TREE_LINED_ROAD :Silnice s alejí
STR_1817_ROAD_VEHICLE_DEPOT :Garáž
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Železniční přejezd
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nelze odstranit autobusovou zastávku...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nelze odstranit nakládací rampu...
##id 0x2000
STR_2000_TOWNS :{WHITE}Města
@@ -1805,7 +1808,7 @@
STR_3040_NOW_ACCEPTS :{WHITE}{STATION} nyní přijímá {STRING}
STR_3041_NOW_ACCEPTS_AND :{WHITE}{STATION} nyní přijímá {STRING} a {STRING}
STR_3042_BUS_STATION_ORIENTATION :{WHITE}Orientace autobusové zastávky.
-STR_3043_TRUCK_STATION_ORIENT :{WHITE}Orientace nákladové rampy.
+STR_3043_TRUCK_STATION_ORIENT :{WHITE}Orientace nákladové rampy
STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Musíš nejprve zničit autobusovou zastávku
STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Musíš nejprve zničit nákladovou rampu
STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} stanic{P e e ""}
--- a/src/lang/dutch.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/dutch.txt Sat Feb 17 11:12:50 2007 +0000
@@ -382,6 +382,9 @@
STR_SORT_BY_MAX_SPEED :Maximale snelheid
STR_SORT_BY_MODEL :Model
STR_SORT_BY_VALUE :Waarde
+STR_SORT_BY_FACILITY :Station type
+STR_SORT_BY_WAITING :Waarde van wachtende vracht
+STR_SORT_BY_RATING_MAX :Vracht waardering
STR_ENGINE_SORT_ENGINE_ID :Motor ID (klassieke soort)
STR_ENGINE_SORT_COST :Kosten
STR_ENGINE_SORT_POWER :Kracht
@@ -1038,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Vrij gevormde stations: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nieuwe globale routeplanner (NPF, voorkeur over NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{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_SMALL_AIRPORTS :{LTBLUE}Altijd kleine vliegvelden toestaan: {ORANGE}{STRING}
@@ -1581,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Weg met bomenrij
STR_1817_ROAD_VEHICLE_DEPOT :Wegvoertuigdepot
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Gelijke weg/spoorweg kruising
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Kan busstation niet verwijderen...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kan vrachtwagenstation niet verwijderen...
##id 0x2000
STR_2000_TOWNS :{WHITE}Steden
--- a/src/lang/english.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/english.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nonuniform stations: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING1}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Always allow small airports: {ORANGE}{STRING1}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Tree-lined road
STR_1817_ROAD_VEHICLE_DEPOT :Road vehicle depot
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Road/rail level crossing
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Can't remove bus station...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Can't remove lorry station...
##id 0x2000
STR_2000_TOWNS :{WHITE}Towns
--- a/src/lang/esperanto.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/esperanto.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1042,6 +1042,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nekonformaj stacioj: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nova ĝenerala vojtrovado (NPF, superas NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Pezpliigo pro ŝarĝo por imiti pezajn trajnojn: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permesu trairaj bushaltejoj sur vojoj urboposedataj: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Ĉiam permesu malgrandajn flughavenojn: {ORANGE}{STRING}
@@ -1585,6 +1586,8 @@
STR_1816_TREE_LINED_ROAD :Vojo kun arboj apude
STR_1817_ROAD_VEHICLE_DEPOT :Vojveturila deponejo
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Kruciĝo inter vojo kaj relo
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Ne povas forigi bushaltejon...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Ne povas forigi ŝarĝstacion...
##id 0x2000
STR_2000_TOWNS :{WHITE}Urboj
--- a/src/lang/estonian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/estonian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -395,6 +395,7 @@
STR_0141_LOAD_GAME :{BLACK}Laadi mängu
STR_SINGLE_PLAYER :{BLACK}Üksikmängija
STR_MULTIPLAYER :{BLACK}Võrgumäng
+STR_SCENARIO_EDITOR :{BLACK}Stsenaariumi Muutmine
STR_64 :64
STR_128 :128
@@ -827,6 +828,7 @@
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Hävita see linn täielikult
STR_0292_SAVE_SCENARIO :Salvesta kaart
STR_0293_LOAD_SCENARIO :Laadi kaart
+STR_LOAD_HEIGHTMAP :Lae kõrguskaart
STR_0294_QUIT_EDITOR :Lahku redaktorist
STR_0295 :
STR_0296_QUIT :Välju
@@ -1680,6 +1682,7 @@
STR_1816_TREE_LINED_ROAD :Kolmerajaline tee
STR_1817_ROAD_VEHICLE_DEPOT :Depoo
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Raudtee ülesõit
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Bussijaama ei saa eemaldada...
##id 0x2000
STR_2000_TOWNS :{WHITE}Linnad
--- a/src/lang/finnish.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/finnish.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Epäyhtenäiset asemat: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Uusi globaali tienhakualgor. (NPF, korvaa NTP:n): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Kerroin rahdin painolle raskaiden junien simuilointiin: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Salli pysähdyspaikkojen läpiajo kylien omistamilla teillä: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Salli aina pienet lentokentät: {ORANGE}{STRING}
@@ -1417,6 +1418,7 @@
STR_NETWORK_ERR_NOTAVAILABLE :{WHITE} Verkkolaitteita ei löytynyt tai käännetty ilman ENABLE_NETWORK-valintaa.
STR_NETWORK_ERR_NOSERVER :{WHITE} Verkkopelejä ei löytynyt.
STR_NETWORK_ERR_NOCONNECTION :{WHITE} Palvelin ei vastannut pyyntöön.
+STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Yhteyden muodostaminen epäonnistui NewGRF-virheen vuoksi
STR_NETWORK_ERR_DESYNC :{WHITE} Verkkopelin tahdistus epäonnistui.
STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Verkkopeliyhteys katkesi.
STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Palvelimen pelitallennetta ei voi ladata.
@@ -1438,6 +1440,7 @@
STR_NETWORK_ERR_CLIENT_SAVEGAME :karttaa ei voitu ladata
STR_NETWORK_ERR_CLIENT_CONNECTION_LOST :yhteys katkesi
STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR :protokollavirhe
+STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH :NewGRF-virhe
STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED :ei valtuutettu
STR_NETWORK_ERR_CLIENT_NOT_EXPECTED :vastaanotettiin omituinen paketti
STR_NETWORK_ERR_CLIENT_WRONG_REVISION :väärä revisio
@@ -1582,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Puilla reunustettu tie
STR_1817_ROAD_VEHICLE_DEPOT :Huoltoasema
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Tasoristeys
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Linja-autoasemaa ei voida poistaa...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kuorma-auto asemaa ei voida poistaa...
##id 0x2000
STR_2000_TOWNS :{WHITE}Kaupungit
@@ -2187,6 +2192,7 @@
STR_707F_HAS_BEEN_TAKEN_OVER_BY :{BLACK}{BIGFONT}Yhtiön {COMPANY} on ottanut haltuun {COMPANY}!
STR_7080_PROTECTED :{WHITE}Tällä yhtiöllä ei ole vielä osakkeita...
+STR_LIVERY_DEFAULT :
STR_LIVERY_STEAM :Höyryveturi
STR_LIVERY_DIESEL :Dieselveturi
STR_LIVERY_ELECTRIC :Sähköveturi
--- a/src/lang/french.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/french.txt Sat Feb 17 11:12:50 2007 +0000
@@ -26,7 +26,7 @@
STR_0012_OIL :Pétrole
STR_0013_LIVESTOCK :Bétail
STR_0014_GOODS :Marchandise
-STR_0015_GRAIN :Grain
+STR_0015_GRAIN :Céréales
STR_0016_WOOD :Bois
STR_0017_IRON_ORE :Fer
STR_0018_STEEL :Acier
@@ -58,7 +58,7 @@
STR_0032_OIL :Pétrole
STR_0033_LIVESTOCK :Bétail
STR_0034_GOODS :Marchandise
-STR_0035_GRAIN :Grain
+STR_0035_GRAIN :Céréales
STR_0036_WOOD :Bois
STR_0037_IRON_ORE :Fer
STR_0038_STEEL :Acier
@@ -597,7 +597,7 @@
STR_020D_CHANGES_OF_CARGO_ACCEPTANCE :{YELLOW}Changements d'acceptation de marchandises
STR_020E_SUBSIDIES :{YELLOW}Subventions
STR_020F_GENERAL_INFORMATION :{YELLOW}Information génerale
-STR_MESSAGES_ALL :{YELLOW}Pour tout types de messages (aucun/sommaire/complet)
+STR_MESSAGES_ALL :{YELLOW}Paramétrer tous les types de messages: Aucun / Sommaire / Complet
STR_MESSAGE_SOUND :{YELLOW}Émettre son pour les bulletins sommaires
STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...trop loin de la destination précédente
STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Meilleures compagnies, qui ont atteint {NUM}{}(Niveau {STRING})
@@ -1042,6 +1042,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Gares non uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nouvelle recherche de chemin globale (NPF, écrase NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{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_SMALL_AIRPORTS :{LTBLUE}Toujours permettre les petits aéroports: {ORANGE}{STRING}
@@ -1231,8 +1232,8 @@
STR_FAST_FORWARD :{BLACK}Avance rapide du jeu
STR_MESSAGE_HISTORY :{WHITE}Historique des Messages
STR_MESSAGE_HISTORY_TIP :{BLACK}Liste des messages récents
-STR_MESSAGES_DISABLE_ALL :{BLACK}Tous en sommaire
-STR_MESSAGES_ENABLE_ALL :{BLACK}Tous en complet
+STR_MESSAGES_DISABLE_ALL :{BLACK}Tous sommaires
+STR_MESSAGES_ENABLE_ALL :{BLACK}Tous complets
STR_CONSTRUCT_COAL_MINE_TIP :{BLACK}Construire une mine de charbon
STR_CONSTRUCT_FOREST_TIP :{BLACK}Planter une forêt
@@ -1585,6 +1586,8 @@
STR_1816_TREE_LINED_ROAD :Route avec lignée d'arbustres
STR_1817_ROAD_VEHICLE_DEPOT :Dépôt de véhicules routiers
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Route/rail Croisement à niveau
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossible de supprimer la station de bus...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossible de supprimer la station de camions...
##id 0x2000
STR_2000_TOWNS :{WHITE}Villes
@@ -1624,7 +1627,7 @@
STR_2020_LOCAL_AUTHORITY :{BLACK}Municipalité
STR_2021_SHOW_INFORMATION_ON_LOCAL :{BLACK}Afficher des informations sur la municipalité
STR_2022_LOCAL_AUTHORITY :{WHITE}Municipalité de {TOWN}
-STR_2023_TRANSPORT_COMPANY_RATINGS :{BLACK}Notation de la compagnie de transport:
+STR_2023_TRANSPORT_COMPANY_RATINGS :{BLACK}Qualité de service des compagnies:
STR_2024 :{YELLOW}{COMPANY}{PLAYERNAME}: {ORANGE}{STRING}
STR_2025_SUBSIDIES :{WHITE}Subventions
STR_2026_SUBSIDIES_ON_OFFER_FOR :{BLACK}Offres de subvention pour le transport de:
@@ -1727,9 +1730,9 @@
STR_3030_RENAME_STATION_LOADING :Renommer la gare
STR_3031_CAN_T_RENAME_STATION :{WHITE}Impossible de renommer la gare...
-STR_3032_RATINGS :{BLACK}Notations
+STR_3032_RATINGS :{BLACK}Qualité
STR_3033_ACCEPTS :{BLACK}Accepte
-STR_3034_LOCAL_RATING_OF_TRANSPORT :{BLACK}Notation du service de transport:
+STR_3034_LOCAL_RATING_OF_TRANSPORT :{BLACK}Qualité du service de transport:
############ range for rating starts
STR_3035_APPALLING :Épouvantable
@@ -2149,7 +2152,7 @@
STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT :{WHITE}Nous sommes à la recherche d'un acheteur pour notre compagnie{}{}Voulez vous acheter {COMPANY} pour {CURRENCY}?
STR_705C_BANKRUPT :{BLACK}{BIGFONT}Banqueroute!
STR_705D_HAS_BEEN_CLOSED_DOWN_BY :{BLACK}{BIGFONT}{COMPANY} à été fermée par ses créanciers et tous ses actifs vendus!
-STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED :{BLACK}{BIGFONT}Fondation d'une nouvelle compagnie de transport!
+STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED :{BLACK}{BIGFONT}Nouvelle compagnie de transport!
STR_705F_STARTS_CONSTRUCTION_NEAR :{BLACK}{BIGFONT}{COMPANY} commence à construire près de {TOWN}!
STR_7060_CAN_T_BUY_COMPANY :{WHITE}Impossible d'acheter la compagnie...
STR_7061_CARGO_PAYMENT_RATES :{WHITE}Valeur des marchandises
@@ -2487,7 +2490,7 @@
##id 0x8800
STR_8800_TRAIN_DEPOT :{WHITE}{TOWN} Dépôt ferroviaire
-STR_8801_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Arrivée du premier train à {STATION}!
+STR_8801_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent{}l'arrivée du premier train à {STATION}!
STR_8802_DETAILS :{WHITE}{STRING} (Détails)
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Train présent
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
@@ -2753,7 +2756,7 @@
STR_9831_NAME_SHIP :{WHITE}Nommer navire
STR_9832_CAN_T_NAME_SHIP :{WHITE}Impossible de nommer le navire...
-STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Arrivée du premier navire à {STATION}!
+STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent {}l'arrivée du premier navire à {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Placer une bouée, peut servir de guide aux navires
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Impossible de placer une bouée ici...
STR_9836_RENAME :{BLACK}Renommer
@@ -2827,7 +2830,7 @@
STR_A030_NAME_AIRCRAFT :{WHITE}Nommer l'aéronef
STR_A031_CAN_T_NAME_AIRCRAFT :{WHITE}Impossible de nommer l'aéronef...
STR_A032_NAME_AIRCRAFT :{BLACK}Nommer l'aéronef
-STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Arrivée du premier aéronef à {STATION}!
+STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Les habitants célèbrent{}l'arrivée du premier aéronef à {STATION}!
STR_A034_PLANE_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Accident d'avion!{}{COMMA} mort{P "" s} dans un crash à {STATION}
STR_PLANE_CRASH_OUT_OF_FUEL :{BLACK}{BIGFONT}Accident d'avion!{}L'aéronef n'avait plus de carburant, {COMMA} passager{P "" s} meurent dans le crash!
STR_A036 :{TINYFONT}{BLACK}{STATION}
@@ -3114,7 +3117,7 @@
STR_SMALL_AIRPORTS :{BLACK}Petits aéroports
STR_LARGE_AIRPORTS :{BLACK}Grands aéroports
-STR_HUB_AIRPORTS :{BLACK}Aéroports Internodaux
+STR_HUB_AIRPORTS :{BLACK}Aéroports Internationaux
STR_HELIPORTS :{BLACK}Héliports
############ Tooltip measurment
--- a/src/lang/german.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/german.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1042,6 +1042,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Ungleichmäßige Bahnhöfe: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Neue globale Wegfindung für alle Fahrzeuge: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Frachtgewicht erhöhen um schwere Züge zu simulieren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Erlaube Bushaltestellen an städtischen Straßen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Kleine Flughäfen immer erlauben: {ORANGE}{STRING}
@@ -1585,6 +1586,8 @@
STR_1816_TREE_LINED_ROAD :Straße mit Bäumen
STR_1817_ROAD_VEHICLE_DEPOT :Fahrzeugdepot
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Bahnübergang
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Kann Bushaltestelle nicht entfernen...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kann LKW-Ladestelle nicht entfernen...
##id 0x2000
STR_2000_TOWNS :{WHITE}Städte
--- a/src/lang/hungarian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/hungarian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1107,6 +1107,7 @@
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_NEW_PATHFINDING_ALL :{LTBLUE}Új útvonalkereső (NPF, felülbírálja az NTP-t): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Áthajtható állomások engedélyezése városi utakra: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Mindig engedélyezze a kis repülőtereket: {ORANGE}{STRING}
@@ -1650,6 +1651,8 @@
STR_1816_TREE_LINED_ROAD :Fával szegélyezett út
STR_1817_ROAD_VEHICLE_DEPOT :Garázs
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Út/vasút kereszteződés
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nem távolíthatod el ezt a buszmegállót...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nem távolíthatod el ezt a teherautó megállót...
##id 0x2000
STR_2000_TOWNS :{WHITE}Városok
--- a/src/lang/icelandic.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/icelandic.txt Sat Feb 17 11:12:50 2007 +0000
@@ -155,6 +155,7 @@
STR_00B1_GAME_OPTIONS :{WHITE}Stillingar
STR_00B2_MESSAGE :{YELLOW}Skilaboð
STR_00B3_MESSAGE_FROM :{YELLOW}Skilaboð frá {STRING}
+STR_POPUP_CAUTION_CAPTION :{WHITE}Varúð!
STR_00B4_CAN_T_DO_THIS :{WHITE}Get ekki gert þetta....
STR_00B5_CAN_T_CLEAR_THIS_AREA :{WHITE}Get ekki hreinsað þetta svæði....
STR_00B6_ORIGINAL_COPYRIGHT :{BLACK}Upphaflegur höfundarréttur {COPYRIGHT} 1995 Chris Sawyer, Öll réttindi áskilin
@@ -287,12 +288,15 @@
STR_013E_CAPACITIES :{BLACK}Burðargeta
STR_013E_TOTAL_CARGO :{BLACK}Heildarfarmur
STR_013F_CAPACITY :{BLACK}Burðargeta: {LTBLUE}{CARGO}
+STR_CAPACITY_MULT :{BLACK}Burðargeta: {LTBLUE}{CARGO} (x{NUM})
STR_013F_TOTAL_CAPACITY_TEXT :{BLACK}Farmur alls (burðargeta) þessarar lestar:
STR_013F_TOTAL_CAPACITY :{LTBLUE}- {CARGO} ({SHORTCARGO})
+STR_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
STR_0140_NEW_GAME :{BLACK}Nýr leikur
STR_0141_LOAD_GAME :{BLACK}Opna leik
STR_SINGLE_PLAYER :{BLACK}Einspilun
STR_MULTIPLAYER :{BLACK}Fjölspilun
+STR_SCENARIO_EDITOR :{BLACK}Landslagsgerð
STR_64 :64
STR_128 :128
@@ -382,10 +386,26 @@
STR_SORT_BY_FACILITY :Tegund stöðvar
STR_SORT_BY_WAITING :Verðgildi farms á stöð
STR_SORT_BY_RATING_MAX :Flutningur farms
+STR_ENGINE_SORT_ENGINE_ID :Einkenni (hefðbundin röðun)
+STR_ENGINE_SORT_COST :Kostnaður
+STR_ENGINE_SORT_POWER :Afl
+STR_ENGINE_SORT_INTRO_DATE :Árgerð
+STR_ENGINE_SORT_RUNNING_COST :Rekstrarkostnaður
+STR_ENGINE_SORT_POWER_VS_RUNNING_COST :Afl/Rekstrarkostnaður
+STR_ENGINE_SORT_CARGO_CAPACITY :Burðargeta
STR_NO_WAITING_CARGO :{BLACK}Enginn farmur bíður
STR_SELECT_ALL_FACILITIES :{BLACK}Velja allar gerðir
STR_SELECT_ALL_TYPES :{BLACK}Velja allar tegundir farms (einnig þær sem ekki bíða)
+STR_AVAILABLE_TRAINS :{BLACK}Lestaúrval
+STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Bifreiðaúrval
+STR_AVAILABLE_SHIPS :{BLACK}Skipaúrval
+STR_AVAILABLE_AIRCRAFT :{BLACK}Flugvélaúrval
+STR_AVAILABLE_ENGINES_TIP :{BLACK}Skoða lista yfir tegundir í boði af þessari gerð farartækja
+STR_MANAGE_LIST :{BLACK}Stýra lista
+STR_MANAGE_LIST_TIP :{BLACK}Senda boð til allra farartækja á listanum
STR_REPLACE_VEHICLES :Skipta út vögnum
+STR_SEND_TRAIN_TO_DEPOT :Senda í skýli
+STR_SEND_ROAD_VEHICLE_TO_DEPOT :Senda í skýli
STR_SEND_SHIP_TO_DEPOT :Senda í slipp
STR_SEND_AIRCRAFT_TO_HANGAR :Senda í skýli
STR_SEND_FOR_SERVICING :Senda í skoðun
@@ -825,7 +845,7 @@
STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...aðeins hægt að byggja í bæjum
STR_030E_SELECT_TEMPERATE_LANDSCAPE :{BLACK}Temprað landslag
STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE :{BLACK}Heimskautalandslag
-STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE :{BLACK}Velja eyðimerkurlandslag
+STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE :{BLACK}Eyðimerkurlandslag
STR_0311_SELECT_TOYLAND_LANDSCAPE :{BLACK}Leikfangalandslag
STR_0312_FUND_CONSTRUCTION_OF_NEW :{BLACK}Fjármagna byggingu nýs iðnaðars
@@ -994,15 +1014,15 @@
STR_CONFIG_PATCHES_OFF :Nei
STR_CONFIG_PATCHES_ON :Já
-STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Sýna hraða farartækis í upplýsingaslá: {ORANGE}{STRING}
+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_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 byggingu mjög langra lesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Leyfa mjög langar lestir: {ORANGE}{STRING}
STR_CONFIG_PATCHES_REALISTICACCEL :{LTBLUE}Raunveruleg hröðun lesta: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FORBID_90_DEG :{LTBLUE}Banna lestum og skipum að taka 90° beygjur: {ORANGE}{STRING} {LTBLUE} (þarfnast NPF)
STR_CONFIG_PATCHES_JOINSTATIONS :{LTBLUE}Sameina lestarstöðvar sem byggðar eru samsíða: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FULLLOADANY :{LTBLUE}Yfirgefa stöð þegar einn farmur er fullfermdur, ef valið er 'fullferma': {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FULLLOADANY :{LTBLUE}'Fullferma' á við um frysta farm sem fullfermist: {ORANGE}{STRING}
STR_CONFIG_PATCHES_IMPROVEDLOAD :{LTBLUE}Nota endurbættan algóriþma við hleðslu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GRADUAL_LOADING :{LTBLUE}Ferma farartæki smám saman: {ORANGE}{STRING}
STR_CONFIG_PATCHES_INFLATION :{LTBLUE}Verðbólga: {ORANGE}{STRING}
@@ -1012,29 +1032,30 @@
STR_CONFIG_PATCHES_BUILDXTRAIND :{LTBLUE}Leyfa byggingu hráefnaframleiðsluiðnaðar: {ORANGE}{STRING}
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}
+STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Sýna alltaf fulla dagsetningu á upplýsingaslá: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SIGNALSIDE :{LTBLUE}Sýna umferðarljós akstursmegin: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SHOWFINANCES :{LTBLUE}Sýna fjármálaglugga í lok árs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTDPatch samhæfð meðhöndlun stansleysu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Bifreiðir fara í biðraðir (með stórvægilegum aukaverkunum): {ORANGE}{STRING}
+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_NONUNIFORM_STATIONS :{LTBLUE}Órétthyrndar lestarstöðvar leyfðar: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nýtt heildar-leiðarkerfi (NPF, yfirtekur NTP): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nýtt alhliða leiðsögukerfi (NPF, yfirtekur NTP): {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_SMALL_AIRPORTS :{LTBLUE}Alltaf leyfa litla flugvelli: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Láta vita ef lest týnist: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW :{LTBLUE}Endurskoða skipanir farartækis: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Gera viðvart ef lest týnist: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW :{LTBLUE}Fara yfir áætlanir farartækja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ORDER_REVIEW_OFF :nei
-STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT :já, en útiloka kyrrstæð farartæki
+STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT :allra nema kyrrstæðra farartækja
STR_CONFIG_PATCHES_ORDER_REVIEW_ON :allra farartækja
-STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Gera viðvart ef lest skilar tapi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Gera viðvart ef lest skilar ekki hagnaði: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Farartæki úreldast aldrei: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Uppfæra faratæki sjálfvirkt þegar það eldist
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Uppfæra farartæki sjálfkrafa {ORANGE}{STRING}{LTBLUE} mánuðum fyrir/eftir hámarksaldur þess
-STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Lægsta upphæð peninga sem þörf er á fyrir sjálfvirka uppfæringu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Uppfæra faratæki sjálfvirkt þegar þau eldast
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Sjálfvirk uppfæring {ORANGE}{STRING}{LTBLUE} {P mánuði mánuðum} fyrir/eftir hámarksaldur
+STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Lágmarks bankainnistæða fyrir sjálfvirka uppfæringu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Birtingartími villuskilaboða: {ORANGE}{STRING}
STR_CONFIG_PATCHES_POPULATION_IN_LABEL :{LTBLUE}Sýna íbúafjölda í bæjarmerki: {ORANGE}{STRING}
STR_CONFIG_PATCHES_INVISIBLE_TREES :{LTBLUE}Ósýnileg tré (með gagnsæjum byggingum): {ORANGE}{STRING}
@@ -1051,8 +1072,8 @@
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Mjög hrjúft
STR_CONFIG_PATCHES_TREE_PLACER :{LTBLUE}Staðsetning trjáa: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TREE_PLACER_NONE :Hvergi
-STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL :Venjuleg
-STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED :Endurbætt
+STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL :Venjulega
+STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED :Nýstárlega
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION :{LTBLUE}Snúningur hæðakorts: {ORANGE}{STRING}
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Rangsælis
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE :Réttsælis
@@ -1060,14 +1081,14 @@
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Dreyfing stöðva mest: {ORANGE}{STRING} {RED}Ath.: Há stilling hægir á leiknum
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 lestar-, vegar-, hafnar- og flugvallarframkvæmdarglugga: {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_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}Not liðsspjall með <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Nota liðsspjall með <ENTER>: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Lestir á leikmann mest: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Bifreiðir á leikmann mest: {ORANGE}{STRING}
@@ -1082,19 +1103,19 @@
STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}Virkja nýja gervigreind (alfa): {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER :{LTBLUE}Leyfa gervigreind í fjölspilunarleik (á tilraunastigi): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Bið milli skoðana á lestum: {ORANGE}{STRING} dagar/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}Bið milli skoðana á lestum: {ORANGE}óvirkt
-STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Bið milli skoðana á bílum: {ORANGE}{STRING} dagar/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Bið milli skoðana á bílum: {ORANGE}óvrikt
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Bið milli skoðana á flugvélum: {ORANGE}{STRING} dagar/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Bið milli skoðana á flugvélum: {ORANGE}óvrikt
-STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Bið milli skoðana á skipum: {ORANGE}{STRING} dagar/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Bið milli skoðana á skipum: {ORANGE}óvirkt
-STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}Hætta skoðunum þegar bilanir eru afvirktar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Tími milli viðhalds lesta: {ORANGE}{STRING} dagar/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}Tími milli viðhalds lesta: {ORANGE}óvirkt
+STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Tími milli viðhalds bifreiða: {ORANGE}{STRING} dagar/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Tími milli viðhalds bifreiða: {ORANGE}óvrikt
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Tími milli viðhalds flugvéla: {ORANGE}{STRING} dagar/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Tími milli viðhalds flugvéla: {ORANGE}óvrikt
+STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Tími milli viðhalds skipa: {ORANGE}{STRING} dagar/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Tími milli viðhalds skipa: {ORANGE}óvirkt
+STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}Leggja niður viðhald þegar bilanir eru stilltar af: {ORANGE}{STRING}
STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}Leyfa hraðatakmarkanir vagna: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}Ekki nota rafknúnar lestir: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Fréttir birtast í lit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Fréttir byrja að birtast í lit árið: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}Upphafsár: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ENDING_YEAR :{LTBLUE}Enda leik árið: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Virkja jafnan efnahag (fleiri og minni breytingar)
@@ -1103,7 +1124,7 @@
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Nota skilti í stað ljósa fyrir: {ORANGE}{STRING}
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_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
@@ -1199,7 +1220,7 @@
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Get ekki fjarlægt hluta af stöð...
STR_CANT_CONVERT_RAIL :{WHITE}Get ekki breytt lestarteini...
-STR_CONVERT_RAIL_TIP :{BLACK}Breyta/Uppfæra gerð af lestarteini
+STR_CONVERT_RAIL_TIP :{BLACK}Breyta/uppfæra gerð lestarteins
STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP :{BLACK}Dragðu eimreið hingað til að selja alla lestina
@@ -1246,7 +1267,7 @@
STR_RAIL_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Veldu hvernig farm lestin á að flytja
STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED :{BLACK}Breyta lest svo hún flytji valinn farm
STR_RAIL_CAN_T_REFIT_VEHICLE :{WHITE}Get ekki breytt lest...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Bil milli skoðana er í hundraðshlutum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Tími milli viðhalds farartækja sýndur í hundraðshlutum: {ORANGE}{STRING}
STR_CONFIG_GAME_PRODUCTION :{WHITE}Breyta framleiðslu
TEMP_AI_IN_PROGRESS :{WHITE}Velkomin/n í nýju gervigreindina, verk í vinnslu. Þú mátt búast við vandamálum, og þegar þau koma upp skaltu taktu skjámynd þegar og senda á spjallborðið. Njóttu!
@@ -1565,6 +1586,8 @@
STR_1816_TREE_LINED_ROAD :Trjáskreyttur vegur
STR_1817_ROAD_VEHICLE_DEPOT :Bifreiðaskýli
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öð...
##id 0x2000
STR_2000_TOWNS :{WHITE}Bæir
@@ -1997,9 +2020,9 @@
############ range for difficulty settings ends
STR_26816_NONE :Engin
-STR_6816_LOW :Lág
-STR_6817_NORMAL :Venjuleg
-STR_6818_HIGH :Há
+STR_6816_LOW :Fáir
+STR_6817_NORMAL :Miðlungs
+STR_6818_HIGH :Margir
STR_6819 :{BLACK}{SMALLLEFTARROW}
STR_681A :{BLACK}{SMALLRIGHTARROW}
STR_681B_VERY_SLOW :Mjög hægt
@@ -2007,10 +2030,10 @@
STR_681D_MEDIUM :Miðlungs
STR_681E_FAST :Hratt
STR_681F_VERY_FAST :Mjög hratt
-STR_VERY_LOW :Mjög lágt
-STR_6820_LOW :Lágt
+STR_VERY_LOW :Mjög lítið
+STR_6820_LOW :Lítið
STR_6821_MEDIUM :Miðlungs
-STR_6822_HIGH :Hátt
+STR_6822_HIGH :Mikið
STR_6823_NONE :Ekkert
STR_6824_REDUCED :Minnkað
STR_6825_NORMAL :Venjulegt
@@ -2018,8 +2041,8 @@
STR_6827_X2 :x2
STR_6828_X3 :x3
STR_6829_X4 :x4
-STR_682A_VERY_FLAT :Mjög flatt
-STR_682B_FLAT :Flatt
+STR_682A_VERY_FLAT :Mjög slétt
+STR_682B_FLAT :Slétt
STR_682C_HILLY :Hæðótt
STR_682D_MOUNTAINOUS :Fjallótt
STR_682E_STEADY :Stöðugur
@@ -2176,6 +2199,8 @@
STR_LIVERY_ELECTRIC :Rafmagnsvagnar
STR_LIVERY_MONORAIL :Einteingungsvagnar
STR_LIVERY_MAGLEV :Segulsvifvagnar
+STR_LIVERY_DMU :Fjölvagna dísellest
+STR_LIVERY_EMU :Fjölvagna rafmagnslest
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)
@@ -2489,12 +2514,15 @@
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
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL :{LTBLUE}Viðhald í {TOWN} lestaskýli, {VELOCITY}
STR_INVALID_ORDER :{RED} (Ógild Skipun)
STR_UNKNOWN_DESTINATION :óþekktur áfangastaður
STR_8812_EMPTY :{LTBLUE}Tómt
STR_8813_FROM :{LTBLUE}{CARGO} frá {STATION}
+STR_FROM_MULT :{LTBLUE}{CARGO} frá {STATION} (x{NUM})
STR_8814_TRAIN_IS_WAITING_IN_DEPOT :{WHITE}Lest {COMMA} bíður í skýli
STR_8815_NEW_VEHICLES :{BLACK}Ný faratæki
STR_8816 :{BLACK}-
@@ -2506,6 +2534,7 @@
STR_NEW_ELRAIL_VEHICLES :{WHITE}Nýjir rafdrifnir lestarvagnar
STR_881D_NEW_MONORAIL_VEHICLES :{WHITE}Nýir einteingungsvagnar
STR_881E_NEW_MAGLEV_VEHICLES :{WHITE}Nýir segullestarvagnar
+STR_ALL_AVAIL_RAIL_VEHICLES :{WHITE}Járnbrautarlestir
STR_881F_BUILD_VEHICLE :{BLACK}Smíða vagn
STR_CLONE_ROAD_VEHICLE :{BLACK}Afrita bifreið
@@ -2521,6 +2550,9 @@
STR_8826_GO_TO :{BLACK}Fara að
STR_8827_FULL_LOAD :{BLACK}Fullferma
STR_8828_UNLOAD :{BLACK} Afferma
+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_8829_ORDERS :{WHITE}{VEHICLE} (Skipanir)
STR_882A_END_OF_ORDERS :{SETX 10}- - Endi skipana - -
STR_FULLLOAD_OR_SERVICE :{SKIP}{SKIP}{STRING}
@@ -2581,6 +2613,7 @@
STR_885C_BROKEN_DOWN :{RED}Bilaður
STR_885D_AGE_RUNNING_COST_YR :{BLACK}Aldur: {LTBLUE}{STRING}{BLACK} Rekstrarkostnaður: {LTBLUE}{CURRENCY} á ári
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Þyngd: {LTBLUE}{WEIGHT_S} {BLACK}Afl: {LTBLUE}{POWER}{BLACK} Hámarkshraði: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Þyngd: {LTBLUE}{WEIGHT_S} {BLACK}Afl: {LTBLUE}{POWER}{BLACK} Hámarkshraði: {LTBLUE}{VELOCITY} {BLACK}Hámarks togkraftur: {LTBLUE}{FORCE}
STR_885F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Hagnaður á þessu ári: {LTBLUE}{CURRENCY} (síðasta ár: {CURRENCY})
STR_8860_RELIABILITY_BREAKDOWNS :{BLACK}Áreiðanleiki: {LTBLUE}{COMMA}% {BLACK}Bilanir frá síðustu viðgerð: {LTBLUE}{COMMA}
STR_8861_STOPPED :{RED}Stöðvaður
@@ -2600,6 +2633,8 @@
STR_TRAIN_STOPPING :{RED}Stöðva
STR_TRAIN_STOPPING_VEL :{RED}Stöðva, {VELOCITY}
STR_INCOMPATIBLE_RAIL_TYPES :Ósamstæðir lestarteinar
+STR_TRAIN_NO_POWER :{RED}Ekkert afl
+STR_TRAIN_START_NO_CATENARY :Á þetta lestarspor vantar rafmagnsvíra, lestin kemst ekki af stað
##id 0x9000
STR_9000_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Bíll fyrir
@@ -2877,9 +2912,23 @@
STR_NEWGRF_MOVEDOWN_TIP :{BLACK}Færa valda NewGRF skrá neðar á listann
STR_NEWGRF_FILE_TIP :{BLACK}Listi yfir NewGRF skrár sem eru til staðar. Smelltu á skrá til að eiga við eiginleika hennar.
STR_NEWGRF_PARAMETER :{BLACK}Eiginleikar: {SILVER}{STRING}
+STR_NEWGRF_PARAMETER_QUERY :{BLACK}Sláðu inn NewGRF breytur
+STR_NEWGRF_NO_INFO :{BLACK}Engar upplýsingar tiltækar
+STR_NEWGRF_ADD_CAPTION :{WHITE}Tiltækar NewGRF skrár
+STR_NEWGRF_ADD_FILE :{BLACK}Bæta á lista
+STR_NEWGRF_ADD_FILE_TIP :{BLACK}Bæta valinni NewGRF skrá í stillingarnar
+STR_NEWGRF_RESCAN_FILES :{BLACK}Uppfæra lista
+STR_NEWGRF_RESCAN_FILES_TIP :{BLACK}Uppfæra listann yfir tiltækar NewGRF skrár
+STR_NEWGRF_DUPLICATE_GRFID :{WHITE}Get ekki bætt skrá við: tvö eins GRF einkenni
+STR_NEWGRF_NOT_FOUND :{RED}Viðeigandi skrá finnst ekki
+STR_NEWGRF_DISABLED :{RED}Óvirkt
+STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Viðeigandi skrá finnst ekki (samsvarandi GRF hlaðið)
+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_CURRENCY_WINDOW :{WHITE}Sérvalinn gjaldeyrir
STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Gengi: {ORANGE}{CURRENCY} = £ {COMMA}
@@ -2907,12 +2956,31 @@
STR_SCHEDULED_AIRCRAFT_TIP :{BLACK}Sýna allar flugvélar sem hafa þessa stöð á áætlun
STR_SCHEDULED_SHIPS_TIP :{BLACK}Sýna öll skip sem hafa þessa stöð á áætlun
+STR_VEH_WITH_SHARED_ORDERS_LIST :{WHITE}Samnýttar skipanir {COMMA} {P farartækis farartækja}
+STR_VEH_WITH_SHARED_ORDERS_LIST_TIP :{BLACK}Sýna öll farartæki sem deila þessari áætlun
### depot strings
-
+STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Þú ert í þann mund að selja öll farartækin. Viltu halda áfram?
+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
+STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP :{BLACK}Selja öll skip í slippi
+STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP :{BLACK}Selja allar flugvélar í skýli
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP :{BLACK}Fá lista yfir allar lestir sem hafa þetta skýli á áætlun
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP :{BLACK}Fá lista yfir allar bifreiðir sem hafa þetta skýli á áætlun
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP :{BLACK}Fá lista yfir öll skip sem hafa þennan slipp á áætlun
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP :{BLACK}Fá lista yfir allar flugvélar sem hafa flugskýli á þessum velli á áætlun
+STR_DEPOT_AUTOREPLACE_TRAIN_TIP :{BLACK}Skipta öllum lestum í skýlinu sjálfvirkt út
+STR_DEPOT_AUTOREPLACE_ROADVEH_TIP :{BLACK}Skipta öllum bifreiðum í skýlinu sjálfvirkt út
+STR_DEPOT_AUTOREPLACE_SHIP_TIP :{BLACK}Skipta öllum skipum í slippnum sjálfvirkt út
+STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP :{BLACK}Skipta öllum flugvélum í skýlinu sjálfvirkt út
+
+STR_VEHICLE_LIST_TRAIN_DEPOT :{BLACK}{STRING} - {COMMA} Lest{P "" ir}
+STR_VEHICLE_LIST_ROADVEH_DEPOT :{BLACK}{STRING} - {COMMA} Bifreið{P "" ar}
+STR_VEHICLE_LIST_SHIP_DEPOT :{BLACK}{STRING} - {COMMA} Skip
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT :{BLACK}{STRING} - {COMMA} Flugvél{P "" ar}
STR_REPLACE_VEHICLES_WHITE :{WHITE}Endurnýja {STRING}
STR_REPLACE_VEHICLES_START :{BLACK}Hefja skipti
@@ -2935,12 +3003,23 @@
STR_ENGINES :Dráttarvagnar
STR_WAGONS :Vagnar
+STR_MASS_STOP_DEPOT_TRAIN_TIP :{BLACK}Smelltu til að stöðva allar lestir í skýlinu
+STR_MASS_STOP_DEPOT_ROADVEH_TIP :{BLACK}Smelltu til að stöðva allar bifreiðar í skýlinu
+STR_MASS_STOP_DEPOT_SHIP_TIP :{BLACK}Smelltu til að stöðva öll skip í slippnum
+STR_MASS_STOP_HANGAR_TIP :{BLACK}Smelltu til að stöðva allar flugvélar í flugskýlinu
+STR_MASS_START_DEPOT_TRAIN_TIP :{BLACK}Smelltu til að ræsa allar lestir í skýlinu
+STR_MASS_START_DEPOT_ROADVEH_TIP :{BLACK}Smelltu til að ræsa allar bifreiðar í skýlinu
+STR_MASS_START_DEPOT_SHIP_TIP :{BLACK}Smelltu til að ræsa öll skip í slippnum
+STR_MASS_START_HANGAR_TIP :{BLACK}Smelltu til að ræsa allar flugvélar í flugskýlinu
+STR_MASS_STOP_LIST_TIP :{BLACK}Smelltu til að stöðva öll farartæki á listanum
+STR_MASS_START_LIST_TIP :{BLACK}Smelltu til að ræsa öll farartæki á listanum
STR_SHORT_DATE :{WHITE}{DATE_TINY}
STR_SIGN_LIST_CAPTION :{WHITE}Merkjalisti - {COMMA} merki
+STR_ORDER_REFIT_FAILED :{WHITE}Order refit failure stopped {STRING} {COMMA}
############ Lists rail types
@@ -2965,11 +3044,65 @@
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Verð: {GOLD}{CURRENCY}{BLACK} Hámarkshraði: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Burðargeta: {GOLD}{COMMA} farþegar, {COMMA} pokar af pósti
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Drifvagnar: {GOLD}+{POWER}{BLACK} Þyngd: {GOLD}+{WEIGHT_S}
+STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Hægt að breyta farmi í: {GOLD}
+STR_PURCHASE_INFO_ALL_TYPES :Allar tegundir farms
+STR_PURCHASE_INFO_ALL_BUT :Allt nema {GOLD}
+STR_PURCHASE_INFO_MAX_TE :{BLACK}Hámarks : {GOLD}{FORCE}
########### String for New Landscape Generator
+STR_GENERATE :{WHITE}Mynda land
+STR_RANDOM :{BLACK}Nýtt raðnúmer
+STR_RANDOM_HELP :{BLACK}Fá tilviljanakennt raðnúmer fyrir myndun lands
+STR_WORLD_GENERATION_CAPTION :{WHITE}Sköpun heims
+STR_RANDOM_SEED :{BLACK}Raðnúmer lands:
+STR_RANDOM_SEED_HELP :{BLACK}Smelltu til að skrifa inn raðnúmer
+STR_LAND_GENERATOR :{BLACK}Landmyndun:
+STR_TREE_PLACER :{BLACK}Planta trjám:
+STR_HEIGHTMAP_ROTATION :{BLACK}Snúningur hæðarkorts:
+STR_TERRAIN_TYPE :{BLACK}Gerð lands:
+STR_QUANTITY_OF_SEA_LAKES :{BLACK}Magn sjávar:
+STR_SMOOTHNESS :{BLACK}Sléttleiki lands:
+STR_SNOW_LINE_HEIGHT :{BLACK}Hæð snjólínu:
+STR_DATE :{BLACK}Dags.:
+STR_NUMBER_OF_TOWNS :{BLACK}Fjöldi bæja:
+STR_NUMBER_OF_INDUSTRIES :{BLACK}Fjöldi iðnaða:
+STR_GENERATE_DATE :{BLACK}{DATE_LONG}
+STR_SNOW_LINE_UP :{BLACK}Hækka snjólínu upp um eitt þrep
+STR_SNOW_LINE_DOWN :{BLACK}Lækka snjólínu niður um eitt þrep
+STR_SNOW_LINE_QUERY_CAPT :{WHITE}Breyta hæð snjólínu
+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_SNOW_LINE_HEIGHT_NUM :{NUM}
+STR_HEIGHTMAP_NAME :{BLACK}Nafn hæðarlínukorts:
+STR_HEIGHTMAP_SIZE :{BLACK}Stærð: {ORANGE}{NUM} x {NUM}
+STR_GENERATION_WORLD :{WHITE}Skapa heim...
+STR_GENERATION_ABORT :{BLACK}Hætta
+STR_GENERATION_ABORT_CAPTION :{WHITE}Hætta við sköpun heims
+STR_GENERATION_ABORT_MESSAGE :{YELLOW}Ertu viss um að þú viljir hætta við sköpunina?
+STR_PROGRESS :{WHITE}{NUM}% tilbúið
+STR_GENERATION_PROGRESS :{BLACK}{NUM} / {NUM}
+STR_WORLD_GENERATION :{BLACK}Sköpun heims
+STR_TREE_GENERATION :{BLACK}Gróðursetning trjáa
+STR_UNMOVABLE_GENERATION :{BLACK}Staðsetning fastra hluta
STR_CLEARING_TILES :{BLACK}Hrjúft og grýtt landslag
+STR_SETTINGUP_GAME :{BLACK}Set upp leik
+STR_PREPARING_TILELOOP :{BLACK}Keyri reitalykkju
+STR_PREPARING_GAME :{BLACK}Undirbý leik
+STR_DIFFICULTY_TO_CUSTOM :{WHITE}Þessi stilling breytti erfiðleikastigi í sérsniðið
+STR_SE_FLAT_WORLD :{WHITE}Slétt land
+STR_SE_FLAT_WORLD_TIP :{BLACK}Mynda slétt land
+STR_SE_RANDOM_LAND :{WHITE}Handahófskennt land
+STR_SE_NEW_WORLD :{BLACK}Búa til nýtt kort
+STR_SE_CAPTION :{WHITE}Tegund korts
+STR_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Lækka slétt land niður um eitt þrep
+STR_FLAT_WORLD_HEIGHT_UP :{BLACK}Hækka slétt land upp um eitt þrep
+STR_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Breyta hæð á sléttu landi
+STR_FLAT_WORLD_HEIGHT :{BLACK}Hæð slétts lands yfir sjávarmáli
+STR_FLAT_WORLD_HEIGHT_NUM :{NUM}
+STR_SMALLMAP_CENTER :{BLACK}Miðja heimskort á núverandi staðsetningu
########### String for new airports
STR_SMALL_AIRPORT :{BLACK}Lítill flugvöllur
@@ -2989,5 +3122,9 @@
############ Tooltip measurment
+STR_MEASURE_LENGTH :{BLACK}Lengd: {NUM}
+STR_MEASURE_AREA :{BLACK}Svæði: {NUM} x {NUM}
+STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Lengd: {NUM}{}Hæðarmunur {NUM} m
+STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Svæði: {NUM} x {NUM}{}Hæðarmunur: {NUM} m
########
--- a/src/lang/italian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/italian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nuovo pathfinding globale (NPF, sovrascrive NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Moltiplicatore di peso per simulare treni pesanti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permetti fermate passanti sulle strade pubbliche: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Consenti la costruzione di piccoli aeroporti: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Strada alberata
STR_1817_ROAD_VEHICLE_DEPOT :Deposito veicoli
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Passaggio a livello
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Non posso togliere la fermata bus...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Non posso togliere la stazione camion...
##id 0x2000
STR_2000_TOWNS :{WHITE}Città
--- a/src/lang/norwegian_bokmal.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt Sat Feb 17 11:12:50 2007 +0000
@@ -295,6 +295,7 @@
STR_0141_LOAD_GAME :{BLACK}Last inn spill
STR_SINGLE_PLAYER :{BLACK}Énspiller
STR_MULTIPLAYER :{BLACK}Flerspiller
+STR_SCENARIO_EDITOR :{BLACK}Scenario Editor
STR_64 :64
STR_128 :128
@@ -394,6 +395,10 @@
STR_NO_WAITING_CARGO :{BLACK}Ingen last venter
STR_SELECT_ALL_FACILITIES :{BLACK}Velg alle anlegg
STR_SELECT_ALL_TYPES :{BLACK}Velg alle lasttyper (inkludert last som ikke venter)
+STR_AVAILABLE_TRAINS :{BLACK}Tilgjengelige tog
+STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Tilgjengelige kjøretøy
+STR_AVAILABLE_SHIPS :{BLACK}Tilgjengelige skip
+STR_AVAILABLE_AIRCRAFT :{BLACK}Tilgjengelige luftfartøy
STR_AVAILABLE_ENGINES_TIP :{BLACK}Se en liste over tilgjengelige maskindesigner for dette kjøretøyet.
STR_MANAGE_LIST :{BLACK}Behandl liste
STR_MANAGE_LIST_TIP :{BLACK}Send instruksjoner til alle kjøretøyer i denne listen
@@ -619,6 +624,8 @@
STR_022A_GENERATE_RANDOM_LAND :{BLACK}Generer tilfeldig landskap
STR_022B_RESET_LANDSCAPE :{BLACK}Tilbakestill landskap
STR_022C_RESET_LANDSCAPE :{WHITE}Tilbakestill landskap
+STR_RESET_LANDSCAPE_TOOLTIP :{BLACK}Fjern all eiendom som er eid av spilleren(e) fra kartet
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Er du sikker på at du vil fjerne all eiendommen som er eid av spilleren(e)?
STR_022E_LANDSCAPE_GENERATION :{BLACK}Landskapsgenerering
STR_022F_TOWN_GENERATION :{BLACK}Bygenerering
STR_0230_INDUSTRY_GENERATION :{BLACK}Industrigenerering
@@ -723,6 +730,7 @@
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Slett denne byen fullstendig
STR_0292_SAVE_SCENARIO :Lagre scenario
STR_0293_LOAD_SCENARIO :Last inn scenario
+STR_LOAD_HEIGHTMAP :Last høydekart
STR_0294_QUIT_EDITOR :Avslutt redigeringsprogram
STR_0295 :
STR_0296_QUIT :Avslutt
@@ -1033,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Ikke-ensartede stasjoner: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Ny global rutesøking (NGR, overstyrer NTK): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Vektmultiplikator for frakt til å simulere tunge tog: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Tillat gjennomkjøring av stoppesteder på veier som er eid av byene: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Alltid tillat bygging av små flyplasser: {ORANGE}{STRING}
@@ -1409,6 +1418,7 @@
STR_NETWORK_ERR_NOTAVAILABLE :{WHITE} Ingen nettverksadapter funnet eller kompilert uten ENABLE_NETWORK
STR_NETWORK_ERR_NOSERVER :{WHITE} Kunne ikke finne noen nettverksspill
STR_NETWORK_ERR_NOCONNECTION :{WHITE} Tjeneren svarte ikke på forespørselen
+STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Kunne ikke koble til på grunn av en NewGRF som ikke stemmer
STR_NETWORK_ERR_DESYNC :{WHITE} Nettverksspill synkronisering feilet.
STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Nettverksspill tilkobling mistet
STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Kunne ikke laste server-lagret spill
@@ -1430,6 +1440,7 @@
STR_NETWORK_ERR_CLIENT_SAVEGAME :klarte ikke å åpne kartet
STR_NETWORK_ERR_CLIENT_CONNECTION_LOST :forbindelsen ble brutt
STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR :protokollfeil
+STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH :NewGRF stemmer ikke
STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED :ikke autorisert
STR_NETWORK_ERR_CLIENT_NOT_EXPECTED :mottok merkelig pakke
STR_NETWORK_ERR_CLIENT_WRONG_REVISION :feil versjon
@@ -1574,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Aveny
STR_1817_ROAD_VEHICLE_DEPOT :Garasje
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Jernbaneovergang
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Kan ikke fjerne busstasjonen...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kan ikke fjerne godsstasjonen...
##id 0x2000
STR_2000_TOWNS :{WHITE}Byer
--- a/src/lang/polish.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/polish.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1128,6 +1128,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Niejednolite stacje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nowe szukanie drogi (NPF, zastępuje NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Mnożnik wagi dla symulacji ciężkich pociągów towarowych: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Pozwól na budowę przystanków typu ro-ro na drogach miejskich: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Zawsze zezwalaj budować małe lotniska: {ORANGE}{STRING}
@@ -1671,6 +1672,8 @@
STR_1816_TREE_LINED_ROAD :Droga z drzewami
STR_1817_ROAD_VEHICLE_DEPOT :Zajezdnia samochodowa
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Przejazd kolejowy
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nie można usunąć przystanku...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nie można usunąć stacji załadunkowej...
##id 0x2000
STR_2000_TOWNS :{WHITE}Miasta
--- a/src/lang/portuguese.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/portuguese.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nova procura de caminho global (NPF, overrides NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de peso para simular comboios pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permitir estações de passagem em estradas das cidades: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Estrada com árvores
STR_1817_ROAD_VEHICLE_DEPOT :Depósito de veículos de estrada
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Passagem de nível
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover estação...
##id 0x2000
STR_2000_TOWNS :{WHITE}Cidades
--- a/src/lang/russian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/russian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1043,6 +1043,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Станции могут быть разной формы: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Новый поиск пути (NPF, без NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Коэф. увеличения веса груза: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Позволять строить сквозные остановки на городских дорогах: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Всегда разрешать малые аэропорты: {ORANGE}{STRING}
@@ -1586,6 +1587,8 @@
STR_1816_TREE_LINED_ROAD :Шоссе
STR_1817_ROAD_VEHICLE_DEPOT :Гараж
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Железнодорожный переезд
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Невозможно удалить автобусную остановку...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Невозможно удалить грузовой терминал...
##id 0x2000
STR_2000_TOWNS :{WHITE}Города
--- a/src/lang/simplified_chinese.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/simplified_chinese.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}允许异形站台:{ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}新的全局路径搜索 (NPF,替换 NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}根据装载货物的数量模拟超重列车:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}允许在城镇所有的道路上穿过禁行标志 {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}总允许建设小型机场:{ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :林荫公路
STR_1817_ROAD_VEHICLE_DEPOT :汽车车库
STR_1818_ROAD_RAIL_LEVEL_CROSSING :公路铁路平交路口
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}不能移除公共汽车站……
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}不能移除汽车货场
##id 0x2000
STR_2000_TOWNS :{WHITE}城镇
--- a/src/lang/slovenian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/slovenian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1083,6 +1083,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Neenake postaje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Novo skupno iskanje poti (NPF, prevlada NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Koeficient teže tovora za simulacijo težkih vlakov: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Dovoli prehodne postaje na cestah v lasti mest: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Vedno dovoli majhna letališča: {ORANGE}{STRING}
@@ -1626,6 +1627,8 @@
STR_1816_TREE_LINED_ROAD :Drevored
STR_1817_ROAD_VEHICLE_DEPOT :Garaža
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Cestno/železniško križišče
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Ni mogoča odstranitev avtobusne postaje...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Ni mogoča odstranitev tovorne postaje...
##id 0x2000
STR_2000_TOWNS :{WHITE}Mesta
@@ -1869,7 +1872,6 @@
STR_4802_COAL_MINE.r :Premogovnika
STR_4803_POWER_STATION :Termo elektrarna
STR_4803_POWER_STATION.3sk :Termo elektrarni
-STR_4803_POWER_STATION.r :Termo elektrarne
STR_4804_SAWMILL :Žaga
STR_4804_SAWMILL.r :Žage
STR_4805_FOREST :Gozd
--- a/src/lang/spanish.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/spanish.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1042,6 +1042,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Nuevo sistema de busq. de rutas global (NPF, anula a NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permite conducir en paradas de carretera propiedad de ciudades: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Permitir siempre aeropuertos pequeños: {ORANGE}{STRING}
@@ -1585,6 +1586,8 @@
STR_1816_TREE_LINED_ROAD :Carretera arbolada
STR_1817_ROAD_VEHICLE_DEPOT :Depósito de carretera
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Paso a nivel
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}No se puede quitar la estación de bus...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}No se puede quitar la estación de camiones...
##id 0x2000
STR_2000_TOWNS :{WHITE}Poblaciones
@@ -1699,6 +1702,7 @@
STR_2806 :{WHITE}{STRING}
STR_2808_TOO_MANY_SIGNS :{WHITE}...demasiadas señales
STR_2809_CAN_T_PLACE_SIGN_HERE :{WHITE}No se puede colocar una señal aquí...
+STR_280A_SIGN :Señal
STR_280B_EDIT_SIGN_TEXT :{WHITE}Editar texto de la señal
STR_280C_CAN_T_CHANGE_SIGN_NAME :{WHITE}No se puede cambiar el nombre de la señal...
STR_280D_SELECT_TREE_TYPE_TO_PLANT :{BLACK}Seleccione el tipo de árboles a plantar
--- a/src/lang/swedish.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/swedish.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Icke-rektangulära stationer: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Ny globalt sätt att hitta rutt (NPF, åsidosätter NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Godsfaktor för att simulera tunga tåg: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Tillåt genomfarts-stop på stadsägda vägar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Tillåt alltid små flygplatser: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Väg med träd
STR_1817_ROAD_VEHICLE_DEPOT :Bussgarage
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Väg-/Järnvägskorsning
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Kan inte ta bort busstation...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kan inte ta bort lastbilsstation...
##id 0x2000
STR_2000_TOWNS :{WHITE}Städer
@@ -2630,6 +2633,7 @@
STR_TRAIN_STOPPING_VEL :{RED}Stannar, {VELOCITY}
STR_INCOMPATIBLE_RAIL_TYPES :Fel järnvägstyp
STR_TRAIN_NO_POWER :{RED}Ingen Kraft
+STR_TRAIN_START_NO_CATENARY :Detta spår saknar kedjekurva, så tåget kan inte starta
##id 0x9000
STR_9000_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Vägfordon i vägen
--- a/src/lang/traditional_chinese.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/traditional_chinese.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}不規則形狀車站: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}新路徑搜尋演算法 (NPF, 覆蓋 NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}貨物重量系數,以模擬較重列車: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}可在鎮內興建路邊車站: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}永遠可以興建小型機場: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :有行道樹的公路
STR_1817_ROAD_VEHICLE_DEPOT :車庫
STR_1818_ROAD_RAIL_LEVEL_CROSSING :公路/鐵道平交道
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}不能從這邊移除公車站...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}不能從這邊移除貨運站...
##id 0x2000
STR_2000_TOWNS :{WHITE}城鎮
--- a/src/lang/turkish.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/turkish.txt Sat Feb 17 11:12:50 2007 +0000
@@ -1041,6 +1041,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Özel istasyonlar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Yeni evrensel yol bulma (NPF, NTP üzerinde): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Ağır yük trenleri için ağırlık çarpanı: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Şehiriçi yollara durak yapmak izinli: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Küçük havalimanı her zaman etkin: {ORANGE}{STRING}
@@ -1584,6 +1585,8 @@
STR_1816_TREE_LINED_ROAD :Ağaçli yol
STR_1817_ROAD_VEHICLE_DEPOT :Araba garı
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Hemzemin geçit
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Otobüs durağı kaldırılamaz...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kamyon durağı kaldırılamaz...
##id 0x2000
STR_2000_TOWNS :{WHITE}Şehirler
--- a/src/lang/ukrainian.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/ukrainian.txt Sat Feb 17 11:12:50 2007 +0000
@@ -79,7 +79,7 @@
STR_0027_COLA :кола
STR_0027_COLA.r :коли
STR_0027_COLA.z :колу
-STR_0028_COTTON_CANDY :солодку вату
+STR_0028_COTTON_CANDY :солодка вата
STR_0028_COTTON_CANDY.r :солодкої вати
STR_0028_COTTON_CANDY.z :солодку вату
STR_0029_BUBBLES :бульбашки
@@ -92,13 +92,12 @@
STR_002B_BATTERIES.r :батарейок
STR_002B_BATTERIES.z :батарейки
STR_002C_PLASTIC :пластик
-STR_002C_PLASTIC.r :пластику
-STR_002C_PLASTIC.z :ластик
-STR_002D_FIZZY_DRINKS :газовану воду
+STR_002C_PLASTIC.z :пластик
+STR_002D_FIZZY_DRINKS :газована водф
STR_002D_FIZZY_DRINKS.r :газованої води
STR_002D_FIZZY_DRINKS.z :газовану воду
STR_002E :
-STR_002F_PASSENGER :пасажирів
+STR_002F_PASSENGER :пасажири
STR_002F_PASSENGER.r :пасажирів
STR_002F_PASSENGER.z :пасажирів
STR_0030_COAL :вугілля
@@ -590,9 +589,9 @@
STR_019D_AIRCRAFT :Літак
STR_019E_SHIP :Корабель
STR_019F_TRAIN :Поїзд
-STR_01A0_IS_GETTING_OLD :{WHITE}{STRING} {COMMA} зістарився
-STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} дуже зістарився
-STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA} зістарився і терміново потребує заміни
+STR_01A0_IS_GETTING_OLD :{WHITE}{STRING} {COMMA} старіє
+STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} вже дуже старий
+STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA} вже дуже старий і терміново потребує заміни
STR_01A3_LAND_AREA_INFORMATION :{WHITE}Інформація про ділянку
STR_01A4_COST_TO_CLEAR_N_A :{BLACK}Вартість очистки: {LTBLUE}неможливо
STR_01A5_COST_TO_CLEAR :{BLACK}Вартість очистки: {LTBLUE}{CURRENCY}
@@ -923,11 +922,11 @@
STR_MEASURING_UNITS :{BLACK}Система одиниць виміру
STR_02E4 :{BLACK}{SKIP}{SKIP}{STRING}
STR_MEASURING_UNITS_SELECTION :{BLACK}Вибір системи одиниць виміру
-STR_02E6_ROAD_VEHICLES :{BLACK}Напрямок руху
+STR_02E6_ROAD_VEHICLES :{BLACK}Транспорт
STR_02E7 :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Виберіть по якій стороні їхатиме транспорт
-STR_02E9_DRIVE_ON_LEFT :Лівосторонній
-STR_02EA_DRIVE_ON_RIGHT :Правосторонній
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Виберіть, по якій стороні їхатиме транспорт
+STR_02E9_DRIVE_ON_LEFT :Їде по лівій стороні
+STR_02EA_DRIVE_ON_RIGHT :Їде по правій стороні
STR_02EB_TOWN_NAMES :{BLACK}Назви міст
STR_02EC :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_02ED_SELECT_STYLE_OF_TOWN_NAMES :{BLACK}Виберіть стиль назв міст
@@ -1145,11 +1144,12 @@
STR_CONFIG_PATCHES_SHOWFINANCES :{LTBLUE}Показувати вікно фінансів в кінці року: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTDPatch сумісна команда "без зупинки": {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Ставати транспорту в чергу: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Прокручувати вікно коли курсор з краю: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Прокручувати вікно, коли курсор з краю: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Дозволити підкупляти місцеву владу: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Неоднорідні станції: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Новий глобальний пошук шляху(NPF, замість NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Множник ваги для імітації важких потягів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Дозволити безпересадкові зупинки на муніципальних дорогах: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Будувати малі аеропорти можна завжди: {ORANGE}{STRING}
@@ -1693,6 +1693,8 @@
STR_1816_TREE_LINED_ROAD :Дорога з насадженнями
STR_1817_ROAD_VEHICLE_DEPOT :Автомобільне депо
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Залізничний переїзд
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Не можна знести автобусну станцію...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Не можна знести грузову станцію...
##id 0x2000
STR_2000_TOWNS :{WHITE}Міста
--- a/src/lang/unfinished/afrikaans.txt Wed Feb 14 10:46:38 2007 +0000
+++ b/src/lang/unfinished/afrikaans.txt Sat Feb 17 11:12:50 2007 +0000
@@ -82,6 +82,28 @@
STR_004B_BATTERY :Battery
STR_004C_PLASTIC :Plastiek
STR_004D_FIZZY_DRINK :Koeldrank
+STR_QUANTITY_STEEL :{WEIGHT} van staal
+STR_QUANTITY_VALUABLES :{COMMA} sak{P "" ke} van kosbaarhede
+STR_QUANTITY_COPPER_ORE :{WEIGHT} van koper erts
+STR_QUANTITY_MAIZE :{WEIGHT} van graan
+STR_QUANTITY_FRUIT :{WEIGHT} van vrugte
+STR_QUANTITY_DIAMONDS :{COMMA} sak{P "" ke} van diamante
+STR_QUANTITY_FOOD :{WEIGHT} van kos
+STR_QUANTITY_PAPER :{WEIGHT} van papier
+STR_QUANTITY_GOLD :{COMMA} sak{P "" ke} van goud
+STR_QUANTITY_WATER :{VOLUME} van water
+STR_QUANTITY_WHEAT :{WEIGHT} van koring
+STR_QUANTITY_RUBBER :{VOLUME} van gomlastiek
+STR_QUANTITY_SUGAR :{WEIGHT} van suiker
+STR_QUANTITY_TOYS :{COMMA} speel{P ding goed}
+STR_QUANTITY_SWEETS :{COMMA} sak{P "" ke} van lekkers
+STR_QUANTITY_COLA :{VOLUME} van cola
+STR_QUANTITY_CANDYFLOSS :{WEIGHT} van spookasem
+STR_QUANTITY_BUBBLES :{COMMA} borrel{P "" s}
+STR_QUANTITY_TOFFEE :{WEIGHT} van tameletjie
+STR_QUANTITY_BATTERIES :{COMMA} batter{P y ye}
+STR_QUANTITY_PLASTIC :{VOLUME} van plastiek
+STR_QUANTITY_FIZZY_DRINKS :{COMMA} koeldran{P k ke}
STR_ABBREV_NOTHING :
STR_ABBREV_PASSENGERS :{TINYFONT}PS
STR_ABBREV_COAL :{TINYFONT}SK
@@ -122,11 +144,13 @@
STR_00B1_GAME_OPTIONS :{WHITE}Spel Opsies
STR_00B2_MESSAGE :{YELLOW}Boodskap
STR_00B3_MESSAGE_FROM :{YELLOW}Boodskap van {STRING}
+STR_POPUP_CAUTION_CAPTION :{WHITE}Waarskuwing!
STR_00B4_CAN_T_DO_THIS :{WHITE}Kan nie dit doen nie....
STR_00B5_CAN_T_CLEAR_THIS_AREA :{WHITE}Kan nie die area reinig nie....
STR_00B6_ORIGINAL_COPYRIGHT :{BLACK}Oorspronklik kopiereg {COPYRIGHT} 1995 Chris Sawyer, Alle regte voorbehou
STR_00B7_VERSION :{BLACK}OpenTTD bewerking {REV}
STR_00BA_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2006 Die OpenTTD span
+STR_TRANSLATED_BY :{BLACK} Vertaler(s) -
STR_00C5 :{BLACK}{CROSS}
STR_00C6 :{SILVER}{CROSS}
@@ -253,11 +277,15 @@
STR_013E_CAPACITIES :{BLACK}Kapasiteite
STR_013E_TOTAL_CARGO :{BLACK}Totaale Vrag
STR_013F_CAPACITY :{BLACK}Kapasiteit: {LTBLUE}{CARGO}
+STR_CAPACITY_MULT :{BLACK}Kapasiteit: {LTBLUE}{CARGO} (x{NUM})
STR_013F_TOTAL_CAPACITY_TEXT :{BLACK}Totaale vrag kapasitiet van die trein:
STR_013F_TOTAL_CAPACITY :{LTBLUE}- {CARGO} ({SHORTCARGO})
+STR_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
STR_0140_NEW_GAME :{BLACK}Nuwe Spel
STR_0141_LOAD_GAME :{BLACK}Laai Spel
+STR_SINGLE_PLAYER :{BLACK}Enkel speeler
STR_MULTIPLAYER :{BLACK}Veelspeler
+STR_SCENARIO_EDITOR :{BLACK}Draaiboek Redakteur
STR_64 :64
STR_128 :128
@@ -274,13 +302,37 @@
STR_0152_TOWN_DIRECTORY :Stad index
STR_0153_SUBSIDIES :Subsidiëe
-
-
+STR_UNITS_IMPERIAL :Imperiaal
+STR_UNITS_METRIC :Metriek
+STR_UNITS_SI :SI
-
+STR_UNITS_VELOCITY_IMPERIAL :{COMMA} mph
+STR_UNITS_VELOCITY_METRIC :{COMMA} km/h
+STR_UNITS_VELOCITY_SI :{COMMA} m/s
+STR_UNITS_POWER_IMPERIAL :{COMMA}hp
+STR_UNITS_POWER_METRIC :{COMMA}hp
+STR_UNITS_POWER_SI :{COMMA}kW
+STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t
+STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t
+STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg
+STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA} ton{P "" s}
+STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} tonne{P "" s}
+STR_UNITS_WEIGHT_LONG_SI :{COMMA} kg
+
+STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}gal
+STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}l
+STR_UNITS_VOLUME_SHORT_SI :{COMMA}m³
+
+STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA} gallon{P "" s}
+STR_UNITS_VOLUME_LONG_METRIC :{COMMA} litre{P "" s}
+STR_UNITS_VOLUME_LONG_SI :{COMMA} m³
+
+STR_UNITS_FORCE_IMPERIAL :{COMMA}x10³ lbf
+STR_UNITS_FORCE_METRIC :{COMMA} ton krag
+STR_UNITS_FORCE_SI :{COMMA} kN
############ range for menu starts
STR_0154_OPERATING_PROFIT_GRAPH :Opereer profyt grafiek
@@ -290,6 +342,7 @@
STR_0158_COMPANY_VALUE_GRAPH :Maatskappy waarde grafiek
STR_0159_CARGO_PAYMENT_RATES :Vrag betaaling grade
STR_015A_COMPANY_LEAGUE_TABLE :Maatskappy verbond tafel
+STR_PERFORMANCE_DETAIL_MENU :Omstandig prestasie gradering
############ range for menu ends
STR_015B_OPENTTD :{WHITE}Omtrent OpenTTD
@@ -299,13 +352,45 @@
STR_015F_QUIT :Uitgang
STR_ABANDON_GAME_QUERY :{YELLOW}Is jy seker jy wil die spel verlaat?
STR_0161_QUIT_GAME :{WHITE}Verlaat Spel
+STR_SORT_ORDER_TIP :{BLACK}Selekteer sorteer orde (afklimende/klimende)
+STR_SORT_CRITERIA_TIP :{BLACK}Selekteer sorteer maatstaf
+STR_SORT_BY :{BLACK}Sorteer by
+STR_SORT_BY_POPULATION :{BLACK}Populasie
+STR_SORT_BY_PRODUCTION :{BLACK}Produksie
+STR_SORT_BY_TYPE :{BLACK}Tipe
+STR_SORT_BY_TRANSPORTED :{BLACK}Uitvervoer
+STR_SORT_BY_NAME :{BLACK}Naam
+STR_SORT_BY_DROPDOWN_NAME :Naam
+STR_SORT_BY_DATE :{BLACK}Datum
+STR_SORT_BY_NUMBER :Nommer
+STR_SORT_BY_PROFIT_LAST_YEAR :Profyt verlede jaar
+STR_SORT_BY_PROFIT_THIS_YEAR :Profyt die jaar
+STR_SORT_BY_AGE :Ouderdom
+STR_SORT_BY_RELIABILITY :Deeglikheid
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Totaale kapasitiet per vrag tipe
+STR_SORT_BY_MAX_SPEED :Maksimum spoed
+STR_SORT_BY_MODEL :Model
+STR_SORT_BY_VALUE :Waarde
+STR_SORT_BY_FACILITY :Stasie tipe
+STR_SORT_BY_WAITING :Wagtend vrag waarde
+STR_SORT_BY_RATING_MAX :Vrag gradering
STR_ENGINE_SORT_ENGINE_ID :EngineID (klassieke sorteer)
+STR_ENGINE_SORT_COST :Koste
+STR_ENGINE_SORT_POWER :Krag
+STR_ENGINE_SORT_INTRO_DATE :Inleiding Datum
+STR_ENGINE_SORT_RUNNING_COST :Loopkoste
STR_ENGINE_SORT_CARGO_CAPACITY :Vrag Kapasiteit
STR_NO_WAITING_CARGO :{BLACK}Geen vrag van enige tipe is op wag
STR_AVAILABLE_ENGINES_TIP :{BLACK}Wys 'n lys van beskikbaare enjin tipes vir die voertiug tipe.
STR_MANAGE_LIST :{BLACK}Bestuur lys
STR_MANAGE_LIST_TIP :{BLACK}Stuur instruksies na alle voertuie in die lys
+STR_REPLACE_VEHICLES :Vervang voertuie
+STR_SEND_TRAIN_TO_DEPOT :Stuur na Depot
+STR_SEND_ROAD_VEHICLE_TO_DEPOT :Stuur na Depot
+STR_SEND_SHIP_TO_DEPOT :Stuur na Depot
+STR_SEND_AIRCRAFT_TO_HANGAR :Stuur na Hangar
+STR_SEND_FOR_SERVICING :Stuur vir Diens
############ range for months starts
STR_0162_JAN :Jan
@@ -353,6 +438,9 @@
STR_018A_CAN_T_CHANGE_SERVICING :{WHITE}kan nie tussendiens tydperk verander nie...
STR_018B_CLOSE_WINDOW :{BLACK}Maak venster toe
STR_018C_WINDOW_TITLE_DRAG_THIS :{BLACK}Venster titel - sleep die om venster te beweeg
+STR_STICKY_BUTTON :{BLACK}Bemerk die venste as ontoemaakbaar by die"Sluit Alle Vensters" sleutel
+STR_RESIZE_BUTTON :{BLACK}Kliek en sleep om venster te vergroot
+STR_SAVELOAD_HOME_BUTTON :{BLACK}Kliek hier om na die huidige bewaar/laai leer te spring
STR_018D_DEMOLISH_BUILDINGS_ETC :{BLACK}Breek gebou af ens. op 'n landblokkie
STR_018E_LOWER_A_CORNER_OF_LAND :{BLACK}Verlaag 'n hoek van land
STR_018F_RAISE_A_CORNER_OF_LAND :{BLACK}Verhoog 'n hoek van land
@@ -495,6 +583,7 @@
STR_MESSAGE_SOUND :{YELLOW}Speel geluid vir opsommige nuus boodskappe
STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...te ver van vorige destinasie
STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Hoof maatskappye wat het {NUM}{}({STRING} Vlak) gekry
+STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Maatskappy Liga Tafel in {NUM}
STR_0212 :{BIGFONT}{COMMA}.
STR_0213_BUSINESSMAN :Sakeman
STR_0214_ENTREPRENEUR :Ondernemer
@@ -515,6 +604,7 @@
STR_022A_GENERATE_RANDOM_LAND :{BLACK}Ontwikkel lukraak land
STR_022B_RESET_LANDSCAPE :{BLACK}Herstel landerye
STR_022C_RESET_LANDSCAPE :{WHITE}Herstel landerye
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Is jy seker jy wil alle speler-besittend eiendom verwyder?
STR_022E_LANDSCAPE_GENERATION :{BLACK}Landerye ontwikkeling
STR_022F_TOWN_GENERATION :{BLACK}Stad ontwikkeling
STR_0230_INDUSTRY_GENERATION :{BLACK}Nyweheid ontwikkeling
@@ -627,6 +717,9 @@
STR_0298_LOAD_SCENARIO :{WHITE}Laai Draaiboek
STR_0299_SAVE_SCENARIO :{WHITE}Bewaar Draaiboek
STR_029A_PLAY_SCENARIO :{BLACK}Speel Draaiboek
+STR_PLAY_HEIGHTMAP :{BLACK}Speel Hoogtekaart
+STR_PLAY_HEIGHTMAP_HINT :{BLACK}begin 'n nuwe spel, gebruikend 'n hoogtekaart as oStart a new game, using a heightmap as landscape
+STR_QUIT_SCENARIO_QUERY :{YELLOW}Is jy seker jy wil die draaiboek verlaat?
STR_029C_QUIT_EDITOR :{WHITE}Verlaat Redakteur
STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...kan slegs in stede met 'n populasie van te minste 1200 gebou word
STR_029E_MOVE_THE_STARTING_DATE :{BLACK}Beweeg die begin datum terug 1 jaar
@@ -641,6 +734,7 @@
STR_02B6 :{STRING} - {STRING}
STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS :{BLACK}Vertoon laaste boodskap of nuus verslag
STR_OFF :Af
+STR_SUMMARY :Opsomming
STR_FULL :Vol
STR_02BA :{SILVER}- - {COMPANY} - -
STR_02BB_TOWN_DIRECTORY :Stad index
@@ -656,14 +750,17 @@
############ range for menu starts
STR_02C3_GAME_OPTIONS :Spel opsies
STR_02C5_DIFFICULTY_SETTINGS :Moeilikheid stellings
+STR_02C7_CONFIG_PATCHES :Skep Stukke
STR_NEWGRF_SETTINGS :Newgrf stellings
STR_GAMEOPTMENU_0A :
STR_02CA_TOWN_NAMES_DISPLAYED :{SETX 12}Stad naame vertoon
STR_02CC_STATION_NAMES_DISPLAYED :{SETX 12}Stasie naame vertoon
STR_02CE_SIGNS_DISPLAYED :{SETX 12}Tekens vertoon
+STR_WAYPOINTS_DISPLAYED2 :{SETX 12}Wegpunte vertoon
STR_02D0_FULL_ANIMATION :{SETX 12}Volle animasie
STR_02D2_FULL_DETAIL :{SETX 12}Volle aanwyse
STR_02D4_TRANSPARENT_BUILDINGS :{SETX 12}Deurskynend geboue
+STR_TRANSPARENT_SIGNS :{SETX 12}Deurskynend stasie tekens
############ range ends here
############ range for menu starts
@@ -681,11 +778,14 @@
STR_02DD_SUBSIDIES :Subsidiee
STR_02DE_MAP_OF_WORLD :Kaart van wêreld
STR_EXTRA_VIEW_PORT :Ekstra gesigswerf
+STR_SIGN_LIST :Teken lys
STR_02DF_TOWN_DIRECTORY :Stad indeks
+STR_TOWN_POPULATION :{BLACK}Wereld populasie: {COMMA}
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Gesigswerf {COMMA}
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Afskryf na gesigswerf
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Afskryf die lokasie van die wereldwerf na die gesigswerf
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Deeg van gesigswerf
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Deeg die lokasie van die gesigspunt na die hoofskerm
STR_02E0_CURRENCY_UNITS :{BLACK}Koers eenheide
STR_02E1 :{BLACK}{SKIP}{STRING}
@@ -744,12 +844,26 @@
STR_0329_PURCHASE_LAND_FOR_FUTURE :{BLACK}Koop land vir toekomende gebruik
STR_032F_AUTOSAVE :{RED}OUTOBEWAAR
+STR_SAVING_GAME :{RED}* * BEWAAR SPEL * *
+STR_SAVE_STILL_IN_PROGRESS :{WHITE}Bewaar nog in vorder, wag asb tot dit klaar is!
STR_0330_SELECT_EZY_STREET_STYLE :{BLACK}Kies 'Ezy Straat styl musiek' musiek lys
STR_0335_6 :{BLACK}6
STR_0336_7 :{BLACK}7
############ start of townname region
+STR_TOWNNAME_ORIGINAL_ENGLISH :Engels (Oorspronkilik)
+STR_TOWNNAME_FRENCH :Frans
+STR_TOWNNAME_DUTCH :Hollands
+STR_TOWNNAME_FINNISH :Finnish
+STR_TOWNNAME_POLISH :Polish
+STR_TOWNNAME_SLOVAKISH :Slovakish
+STR_TOWNNAME_NORWEGIAN :Norwegian
+STR_TOWNNAME_HUNGARIAN :Hungarian
+STR_TOWNNAME_AUSTRIAN :Austrian
+STR_TOWNNAME_ROMANIAN :Romanian
+STR_TOWNNAME_CZECH :Czech
+STR_TOWNNAME_SWISS :Swiss
############ end of townname region
STR_CURR_GBP :Pounds ()
@@ -1072,7 +1186,7 @@
STR_NETWORK_PLAYER_NAME :{BLACK}Speler naam:
STR_NETWORK_ENTER_NAME_TIP :{BLACK}Die is die naam waarmee ander spelers sal jou aanwys
STR_NETWORK_CONNECTION :{BLACK}Verbinding:
-STR_NETWORK_CONNECTION_TIP :{BLACK}Kies tueen internet spel of 'n Plaaslike Area Netwerk (LAN) spel
+STR_NETWORK_CONNECTION_TIP :{BLACK}Kies teen internet spel of 'n Plaaslike Area Netwerk (LAN) spel
STR_NETWORK_START_SERVER :{BLACK}Begin bediender
STR_NETWORK_START_SERVER_TIP :{BLACK}Begin u eie bediender
--- a/src/macros.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/macros.h Sat Feb 17 11:12:50 2007 +0000
@@ -62,11 +62,30 @@
//#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size))
#define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) )
+template <typename T>
+static inline bool HASBIT(T x, int y)
+{
+ return (x & (((T)1) << y)) != 0;
+}
-#define HASBIT(x,y) (((x) & (1 << (y))) != 0)
-#define SETBIT(x,y) ((x) |= (1 << (y)))
-#define CLRBIT(x,y) ((x) &= ~(1 << (y)))
-#define TOGGLEBIT(x,y) ((x) ^= (1 << (y)))
+template <typename T>
+static inline T SETBIT(T& x, int y)
+{
+ return x |= (((T)1) << y);
+}
+
+template <typename T>
+static inline T CLRBIT(T& x, int y)
+{
+ return x &= ~(((T)1) << y);
+}
+
+template <typename T>
+static inline T TOGGLEBIT(T& x, int y)
+{
+ return x ^= (((T)1) << y);
+}
+
// checking more bits. Maybe unneccessary, but easy to use
#define HASBITS(x,y) ((x) & (y))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/music/libtimidity.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -0,0 +1,143 @@
+/* $Id: extmidi.c 4692 2006-05-02 19:09:49Z peter1138 $ */
+
+#include "../stdafx.h"
+#include "../openttd.h"
+#include "../sound.h"
+#include "../string.h"
+#include "../variables.h"
+#include "../debug.h"
+#include "libtimidity.h"
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <timidity.h>
+#if defined(PSP)
+#include <pspaudiolib.h>
+#endif /* PSP */
+
+enum MidiState {
+ MIDI_STOPPED = 0,
+ MIDI_PLAYING = 1,
+};
+
+static struct {
+ MidIStream *stream;
+ MidSongOptions options;
+ MidSong *song;
+
+ MidiState status;
+ uint32 song_length;
+ uint32 song_position;
+} _midi;
+
+#if defined(PSP)
+static void AudioOutCallback(void *buf, unsigned int _reqn, void *userdata)
+{
+ memset(buf, 0, _reqn * PSP_NUM_AUDIO_CHANNELS);
+ if (_midi.status == MIDI_PLAYING) {
+ mid_song_read_wave(_midi.song, buf, _reqn * PSP_NUM_AUDIO_CHANNELS);
+ }
+}
+#endif /* PSP */
+
+static const char *LibtimidityMidiStart(const char *const *param)
+{
+ _midi.status = MIDI_STOPPED;
+
+ if (mid_init(param == NULL ? NULL : (char *)param[0]) < 0) {
+ /* If init fails, it can be because no configuration was found.
+ * If it was not forced via param, try to load it without a
+ * configuration. Who knows that works. */
+ if (param != NULL || mid_init_no_config() < 0) {
+ DEBUG(driver, 0, "error initializing timidity");
+ return NULL;
+ }
+ }
+ DEBUG(driver, 1, "successfully initialised timidity");
+
+ _midi.options.rate = 44100;
+ _midi.options.format = MID_AUDIO_S16LSB;
+ _midi.options.channels = 2;
+#if defined(PSP)
+ _midi.options.buffer_size = PSP_NUM_AUDIO_SAMPLES;
+#else
+ _midi.options.buffer_size = _midi.options.rate;
+#endif
+
+#if defined(PSP)
+ pspAudioInit();
+ pspAudioSetChannelCallback(_midi.options.channels, &AudioOutCallback, NULL);
+ pspAudioSetVolume(_midi.options.channels, PSP_VOLUME_MAX, PSP_VOLUME_MAX);
+#endif /* PSP */
+
+ return NULL;
+}
+
+static void LibtimidityMidiStop(void)
+{
+ if (_midi.status == MIDI_PLAYING) {
+ _midi.status = MIDI_STOPPED;
+ mid_song_free(_midi.song);
+ }
+ mid_exit();
+}
+
+static void LibtimidityMidiPlaySong(const char *filename)
+{
+ _midi.stream = mid_istream_open_file(filename);
+ if (_midi.stream == NULL) {
+ DEBUG(driver, 0, "Could not open music file");
+ return;
+ }
+
+ _midi.song = mid_song_load(_midi.stream, &_midi.options);
+ mid_istream_close(_midi.stream);
+ _midi.song_length = mid_song_get_total_time(_midi.song);
+
+ if (_midi.song == NULL) {
+ DEBUG(driver, 1, "Invalid MIDI file");
+ return;
+ }
+
+ mid_song_start(_midi.song);
+ _midi.status = MIDI_PLAYING;
+}
+
+static void LibtimidityMidiStopSong(void)
+{
+ _midi.status = MIDI_STOPPED;
+ mid_song_free(_midi.song);
+}
+
+static bool LibtimidityMidiIsPlaying(void)
+{
+ if (_midi.status == MIDI_PLAYING) {
+ _midi.song_position = mid_song_get_time(_midi.song);
+ if (_midi.song_position >= _midi.song_length) {
+ _midi.status = MIDI_STOPPED;
+ _midi.song_position = 0;
+ }
+ }
+
+ return (_midi.status == MIDI_PLAYING);
+}
+
+static void LibtimidityMidiSetVolume(byte vol)
+{
+ if (_midi.song != NULL)
+ mid_song_set_volume(_midi.song, vol);
+}
+
+const HalMusicDriver _libtimidity_music_driver = {
+ LibtimidityMidiStart,
+ LibtimidityMidiStop,
+ LibtimidityMidiPlaySong,
+ LibtimidityMidiStopSong,
+ LibtimidityMidiIsPlaying,
+ LibtimidityMidiSetVolume,
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/music/libtimidity.h Sat Feb 17 11:12:50 2007 +0000
@@ -0,0 +1,10 @@
+/* $Id: extmidi.h 2704 2005-07-25 07:16:10Z tron $ */
+
+#ifndef MUSIC_LIBTIMIDITY_H
+#define MUSIC_LIBTIMIDITY_H
+
+#include "../hal.h"
+
+extern const HalMusicDriver _libtimidity_music_driver;
+
+#endif /* MUSIC_LIBTIMIDITY_H */
--- a/src/newgrf.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/newgrf.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -215,7 +215,8 @@
if (condition != 0) {
ei->unk2 &= ~0x80;
- rvi->railveh_type = RAILVEH_SINGLEHEAD;
+ if (rvi->railveh_type == RAILVEH_WAGON)
+ rvi->railveh_type = RAILVEH_SINGLEHEAD;
} else {
ei->unk2 |= 0x80;
rvi->railveh_type = RAILVEH_WAGON;
--- a/src/newgrf_engine.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/newgrf_engine.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -288,7 +288,8 @@
static byte MapAircraftMovementState(const Vehicle *v)
{
const Station *st = GetStation(v->u.air.targetairport);
- byte amdflag = GetAirport(st->airport_type)->MovingData(v->u.air.pos)->flag;
+ const AirportFTAClass *afc = st->Airport();
+ byte amdflag = afc->MovingData(v->u.air.pos)->flag;
switch (v->u.air.state) {
case HANGAR:
@@ -347,26 +348,11 @@
return AMS_TTDP_CLIMBING;
case HELITAKEOFF: // Helicopter is moving to take off position.
- switch (st->airport_type) {
- case AT_SMALL:
- case AT_LARGE:
- case AT_METROPOLITAN:
- case AT_INTERNATIONAL:
- case AT_COMMUTER:
- case AT_INTERCON:
- /* Note, Helidepot and Helistation are treated as airports as
- * helicopters are taking off from ground level. */
- case AT_HELIDEPOT:
- case AT_HELISTATION:
- if (amdflag & AMED_HELI_RAISE) return AMS_TTDP_HELI_TAKEOFF_AIRPORT;
- return AMS_TTDP_TO_JUNCTION;
-
- case AT_HELIPORT:
- case AT_OILRIG:
- return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
-
- default:
- return AMS_TTDP_HELI_TAKEOFF_AIRPORT;
+ if (afc->delta_z == 0) {
+ return amdflag & AMED_HELI_RAISE ?
+ AMS_TTDP_HELI_TAKEOFF_AIRPORT : AMS_TTDP_TO_JUNCTION;
+ } else {
+ return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
}
case FLYING:
@@ -383,18 +369,11 @@
case HELILANDING:
case HELIENDLANDING: // Helicoptor is decending.
if (amdflag & AMED_HELI_LOWER) {
- switch (st->airport_type) {
- case AT_HELIPORT:
- case AT_OILRIG:
- return AMS_TTDP_HELI_LAND_HELIPORT;
-
- default:
- /* Note, Helidepot and Helistation are treated as airports as
- * helicopters are landing at ground level. */
- return AMS_TTDP_HELI_LAND_AIRPORT;
- }
+ return afc->delta_z == 0 ?
+ AMS_TTDP_HELI_LAND_AIRPORT : AMS_TTDP_HELI_LAND_HELIPORT;
+ } else {
+ return AMS_TTDP_FLIGHT_TO_TOWER;
}
- return AMS_TTDP_FLIGHT_TO_TOWER;
default:
return AMS_TTDP_HANGAR;
@@ -1031,7 +1010,7 @@
* i.e.), so we give them all the NEW_CARGO triggered
* vehicle's portion of random bits. */
assert(first);
- DoTriggerVehicle(GetFirstVehicleInChain(v), VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
+ DoTriggerVehicle((v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
break;
case VEHICLE_TRIGGER_DEPOT:
--- a/src/npf.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/npf.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -279,6 +279,12 @@
if (IsLevelCrossing(tile)) cost += _patches.npf_crossing_penalty;
break;
+ case MP_STATION:
+ cost = NPF_TILE_LENGTH;
+ /* Increase the cost for drive-through road stops */
+ if (IsDriveThroughStopTile(tile)) cost += _patches.npf_road_drive_through_penalty;
+ break;
+
default:
break;
}
@@ -453,7 +459,7 @@
if (IsTileType(tile, MP_RAILWAY) || /* Rail tile (also rail depot) */
IsRailwayStationTile(tile) || /* Rail station tile */
IsTileDepotType(tile, TRANSPORT_ROAD) || /* Road depot tile */
- IsRoadStopTile(tile) || /* Road station tile */
+ IsStandardRoadStopTile(tile) || /* Road station tile (but not drive-through stops) */
IsTileDepotType(tile, TRANSPORT_WATER)) { /* Water depot tile */
return IsTileOwner(tile, owner); /* You need to own these tiles entirely to use them */
}
@@ -529,8 +535,8 @@
} else if (IsBridgeTile(src_tile) && GetBridgeRampDirection(src_tile) == src_exitdir) {
dst_tile = GetOtherBridgeEnd(src_tile);
override_dst_check = true;
- } else if (type != TRANSPORT_WATER && (IsRoadStopTile(src_tile) || IsTileDepotType(src_tile, type))) {
- /* This is a road station or a train or road depot. We can enter and exit
+ } else if (type != TRANSPORT_WATER && (IsStandardRoadStopTile(src_tile) || IsTileDepotType(src_tile, type))) {
+ /* This is a road station (non drive-through) or a train or road depot. We can enter and exit
* those from one side only. Trackdirs don't support that (yet), so we'll
* do this here. */
@@ -599,7 +605,7 @@
}
/* Determine available tracks */
- if (type != TRANSPORT_WATER && (IsRoadStopTile(dst_tile) || IsTileDepotType(dst_tile, type))){
+ if (type != TRANSPORT_WATER && (IsStandardRoadStopTile(dst_tile) || IsTileDepotType(dst_tile, type))){
/* Road stations and road and train depots return 0 on GTTS, so we have to do this by hand... */
DiagDirection exitdir;
if (IsRoadStopTile(dst_tile)) {
--- a/src/oldloader.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/oldloader.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -387,7 +387,7 @@
and 1 becomes 2. The rest of the values are okay */
if (_old_vehicle_multiplier < 2) _old_vehicle_multiplier++;
- /* TTDPatch incraeses the Vehicle-part in the middle of the game,
+ /* TTDPatch increases the Vehicle-part in the middle of the game,
so if the multipler is anything else but 1, the assert fails..
bump the assert value so it doesn't!
(1 multipler == 850 vehicles
@@ -401,9 +401,9 @@
for (i = 0; i < 17; i++) _old_map3[i] = 0;
for (i = 0x1FE00; i < 0x20000; i++) _old_map3[i] = 0;
- if (_new_ttdpatch_format) DEBUG(oldloader, 1, "Found TTDPatch game");
+ if (_new_ttdpatch_format) DEBUG(oldloader, 2, "Found TTDPatch game");
- DEBUG(oldloader, 1, "Vehicle-multiplier is set to %d (%d vehicles)", _old_vehicle_multiplier, _old_vehicle_multiplier * 850);
+ DEBUG(oldloader, 3, "Vehicle-multiplier is set to %d (%d vehicles)", _old_vehicle_multiplier, _old_vehicle_multiplier * 850);
}
static const OldChunks town_chunk[] = {
@@ -1061,19 +1061,22 @@
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) {
- 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;
- default: res = LoadChunk(ls, NULL, vehicle_empty_chunk); break;
+ default: NOT_REACHED();
+ case 0x00 /*VEH_Invalid */: v->type = VEH_Invalid; res = LoadChunk(ls, NULL, vehicle_empty_chunk); break;
+ case 0x10 /*VEH_Train */: v->type = VEH_Train; res = LoadChunk(ls, &v->u.rail, vehicle_train_chunk); break;
+ case 0x11 /*VEH_Road */: v->type = VEH_Road; res = LoadChunk(ls, &v->u.road, vehicle_road_chunk); break;
+ case 0x12 /*VEH_Ship */: v->type = VEH_Ship; res = LoadChunk(ls, &v->u.ship, vehicle_ship_chunk); break;
+ case 0x13 /*VEH_Aircraft*/: v->type = VEH_Aircraft; res = LoadChunk(ls, &v->u.air, vehicle_air_chunk); break;
+ case 0x14 /*VEH_Special */: v->type = VEH_Special; res = LoadChunk(ls, &v->u.special, vehicle_special_chunk); break;
+ case 0x15 /*VEH_Disaster*/: v->type = VEH_Disaster; res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
}
/* This chunk size should always be 10 bytes */
if (ls->total_read - temp != 10) {
- DEBUG(oldloader, 4, "Assert failed in Vehicle");
+ DEBUG(oldloader, 0, "Assert failed in VehicleUnion: invalid chunk size");
return false;
}
@@ -1198,8 +1201,7 @@
default: v->spritenum >>= 1; break;
}
- if (_old_next_ptr != 0xFFFF)
- v->next = GetVehicle(_old_next_ptr);
+ if (_old_next_ptr != 0xFFFF) v->next = GetVehicle(_old_next_ptr);
v->string_id = RemapOldStringID(_old_string_id);
@@ -1467,13 +1469,13 @@
/* The first 49 is the name of the game + checksum, skip it */
fseek(ls->file, HEADER_SIZE, SEEK_SET);
- DEBUG(oldloader, 4, "Reading main chunk...");
+ DEBUG(oldloader, 3, "Reading main chunk...");
/* Load the biggest chunk */
if (!LoadChunk(ls, NULL, main_chunk)) {
DEBUG(oldloader, 0, "Loading failed");
return false;
}
- DEBUG(oldloader, 4, "Done, converting game data...");
+ DEBUG(oldloader, 3, "Done, converting game data...");
/* Fix some general stuff */
_opt.landscape = _opt.landscape & 0xF;
@@ -1488,16 +1490,29 @@
}
for (i = 0; i < OLD_MAP_SIZE; i ++) {
- if (IsTileType(i, MP_RAILWAY)) {
- /* We save presignals different from TTDPatch, convert them */
- if (GetRailTileType(i) == RAIL_TILE_SIGNALS) {
- /* This byte is always zero in TTD for this type of tile */
- if (_m[i].m4) /* Convert the presignals to our own format */
- _m[i].m4 = (_m[i].m4 >> 1) & 7;
- }
- /* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just
- * clear it for ourselves and let OTTD's rebuild PBS itself */
- _m[i].m4 &= 0xF; /* Only keep the lower four bits; upper four is PBS */
+ switch (GetTileType(i)) {
+ case MP_RAILWAY:
+ /* We save presignals different from TTDPatch, convert them */
+ if (GetRailTileType(i) == RAIL_TILE_SIGNALS) {
+ /* This byte is always zero in TTD for this type of tile */
+ if (_m[i].m4) /* Convert the presignals to our own format */
+ _m[i].m4 = (_m[i].m4 >> 1) & 7;
+ }
+ /* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just
+ * clear it for ourselves and let OTTD's rebuild PBS itself */
+ _m[i].m4 &= 0xF; /* Only keep the lower four bits; upper four is PBS */
+ break;
+ case MP_WATER: {
+ /* TTDPatch has all tiles touching water as coast (water)-type, we don't.
+ * This is only true from a certain TTDP version, but there is no harm
+ * in checking all the time */
+ Slope s = GetTileSlope(i, NULL);
+ if (s == SLOPE_ENW || s == SLOPE_NWS || s == SLOPE_SEN || s == SLOPE_WSE || IsSteepSlope(s)) {
+ SetTileType(i, MP_CLEAR);
+ SetTileOwner(i, OWNER_NONE);
+ }
+ } break;
+ default: break;
}
}
@@ -1511,7 +1526,7 @@
/* We have a new difficulty setting */
_opt.diff.town_council_tolerance = clamp(_opt.diff_level, 0, 2);
- DEBUG(oldloader, 4, "Finished converting game data");
+ DEBUG(oldloader, 3, "Finished converting game data");
DEBUG(oldloader, 1, "TTD(Patch) savegame successfully converted");
return true;
@@ -1521,7 +1536,7 @@
{
LoadgameState ls;
- DEBUG(oldloader, 4, "Trying to load a TTD(Patch) savegame");
+ DEBUG(oldloader, 3, "Trying to load a TTD(Patch) savegame");
InitLoading(&ls);
--- a/src/order_cmd.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/order_cmd.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -259,9 +259,9 @@
if (!IsValidStationID(new_order.dest)) return CMD_ERROR;
st = GetStation(new_order.dest);
- if ((st->airport_type != AT_OILRIG && !CheckOwnership(st->owner)) ||
+ if (!CheckOwnership(st->owner) ||
!(st->facilities & FACIL_AIRPORT) ||
- GetAirport(st->airport_type)->nof_depots == 0) {
+ st->Airport()->nof_depots == 0) {
return CMD_ERROR;
}
} else {
--- a/src/pathfind.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/pathfind.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -296,7 +296,7 @@
if (tpf->tracktype == TRANSPORT_ROAD) {
// road stops and depots now have a track (r4419)
// don't enter road stop from the back
- if (IsRoadStopTile(tile) && ReverseDiagDir(GetRoadStopDir(tile)) != direction) return;
+ if (IsStandardRoadStopTile(tile) && ReverseDiagDir(GetRoadStopDir(tile)) != direction) return;
// don't enter road depot from the back
if (IsTileDepotType(tile, TRANSPORT_ROAD) && ReverseDiagDir(GetRoadDepotDirection(tile)) != direction) return;
}
--- a/src/road_gui.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/road_gui.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -16,6 +16,7 @@
#include "sound.h"
#include "command.h"
#include "variables.h"
+#include "station_map.h"
//needed for catchments
#include "station.h"
@@ -83,7 +84,7 @@
if (success) {
SndPlayTileFx(SND_1F_SPLAT, tile);
ResetObjectToPlace();
- BuildRoadOutsideStation(tile, (DiagDirection)p1);
+ if (!HASBIT(p2, 1)) BuildRoadOutsideStation(tile, (DiagDirection)p1);
}
}
@@ -92,14 +93,33 @@
DoCommandP(tile, _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1807_CAN_T_BUILD_ROAD_VEHICLE));
}
+static void PlaceRoadStop(TileIndex tile, uint32 p2, uint32 cmd)
+{
+ uint32 p1 = _road_station_picker_orientation;
+
+ if (p1 >= DIAGDIR_END) {
+ SETBIT(p2, 1); // It's a drive-through stop
+ p1 -= DIAGDIR_END; // Adjust picker result to actual direction
+ }
+ DoCommandP(tile, p1, p2, CcRoadDepot, cmd);
+}
+
static void PlaceRoad_BusStation(TileIndex tile)
{
- DoCommandP(tile, _road_station_picker_orientation, RoadStop::BUS, CcRoadDepot, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1808_CAN_T_BUILD_BUS_STATION));
+ if (_remove_button_clicked) {
+ DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_BUS_STATION));
+ } else {
+ PlaceRoadStop(tile, RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1808_CAN_T_BUILD_BUS_STATION));
+ }
}
static void PlaceRoad_TruckStation(TileIndex tile)
{
- DoCommandP(tile, _road_station_picker_orientation, RoadStop::TRUCK, CcRoadDepot, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1809_CAN_T_BUILD_TRUCK_STATION));
+ if (_remove_button_clicked) {
+ DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_TRUCK_STATION));
+ } else {
+ PlaceRoadStop(tile, RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1809_CAN_T_BUILD_TRUCK_STATION));
+ }
}
static void PlaceRoad_DemolishArea(TileIndex tile)
@@ -195,7 +215,7 @@
case WE_CREATE: w->DisableWidget(RTW_REMOVE); break;
case WE_PAINT:
- if (w->IsWidgetLowered(RTW_ROAD_X) || w->IsWidgetLowered(RTW_ROAD_Y)) {
+ if (w->IsWidgetLowered(RTW_ROAD_X) || w->IsWidgetLowered(RTW_ROAD_Y) || w->IsWidgetLowered(RTW_BUS_STATION) || w->IsWidgetLowered(RTW_TRUCK_STATION)) {
w->EnableWidget(RTW_REMOVE);
}
w->DrawWidgets();
@@ -428,7 +448,7 @@
switch (e->event) {
case WE_CREATE:
w->LowerWidget(_road_station_picker_orientation + 3);
- w->LowerWidget(_station_show_coverage + 7);
+ w->LowerWidget(_station_show_coverage + 9);
break;
case WE_PAINT: {
@@ -445,13 +465,18 @@
SetTileSelectSize(1, 1);
}
- image = (w->window_class == WC_BUS_STATION) ? 0x47 : 0x43;
+ image = (w->window_class == WC_BUS_STATION) ? GFX_BUS_BASE : GFX_TRUCK_BASE;
StationPickerDrawSprite(103, 35, RAILTYPE_BEGIN, image);
StationPickerDrawSprite(103, 85, RAILTYPE_BEGIN, image+1);
StationPickerDrawSprite(35, 85, RAILTYPE_BEGIN, image+2);
StationPickerDrawSprite(35, 35, RAILTYPE_BEGIN, image+3);
+ image = (w->window_class == WC_BUS_STATION) ? GFX_BUS_BASE_EXT : GFX_TRUCK_BASE_EXT;
+
+ StationPickerDrawSprite(171, 35, RAILTYPE_BEGIN, image);
+ StationPickerDrawSprite(171, 85, RAILTYPE_BEGIN, image + 1);
+
DrawStationCoverageAreaText(2, 146,
((w->window_class == WC_BUS_STATION) ? (1<<CT_PASSENGERS) : ~(1<<CT_PASSENGERS)),
3);
@@ -460,17 +485,17 @@
case WE_CLICK: {
switch (e->we.click.widget) {
- case 3: case 4: case 5: case 6:
+ case 3: case 4: case 5: case 6: case 7: case 8:
w->RaiseWidget(_road_station_picker_orientation + 3);
_road_station_picker_orientation = (DiagDirection)(e->we.click.widget - 3);
w->LowerWidget(_road_station_picker_orientation + 3);
SndPlayFx(SND_15_BEEP);
w->SetDirty();
break;
- case 7: case 8:
- w->RaiseWidget(_station_show_coverage + 7);
- _station_show_coverage = (e->we.click.widget != 7);
- w->LowerWidget(_station_show_coverage + 7);
+ case 9: case 10:
+ w->RaiseWidget(_station_show_coverage + 9);
+ _station_show_coverage = (e->we.click.widget != 9);
+ w->LowerWidget(_station_show_coverage + 9);
SndPlayFx(SND_15_BEEP);
w->SetDirty();
break;
@@ -494,12 +519,14 @@
static const Widget _bus_station_picker_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 139, 0, 13, STR_3042_BUS_STATION_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 139, 14, 176, 0x0, STR_NULL},
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 206, 0, 13, STR_3042_BUS_STATION_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 206, 14, 176, 0x0, STR_NULL},
{ WWT_PANEL, RESIZE_NONE, 14, 71, 136, 17, 66, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
{ WWT_PANEL, RESIZE_NONE, 14, 71, 136, 69, 118, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
{ WWT_PANEL, RESIZE_NONE, 14, 3, 68, 69, 118, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
{ WWT_PANEL, RESIZE_NONE, 14, 3, 68, 17, 66, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
+{ WWT_PANEL, RESIZE_NONE, 14, 139, 204, 17, 66, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
+{ WWT_PANEL, RESIZE_NONE, 14, 139, 204, 69, 118, 0x0, STR_3051_SELECT_BUS_STATION_ORIENTATION},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 10, 69, 133, 144, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 70, 129, 133, 144, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA},
{ WWT_LABEL, RESIZE_NONE, 7, 0, 139, 120, 133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
@@ -507,7 +534,7 @@
};
static const WindowDesc _bus_station_picker_desc = {
- WDP_AUTO, WDP_AUTO, 140, 177,
+ WDP_AUTO, WDP_AUTO, 207, 177,
WC_BUS_STATION, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
_bus_station_picker_widgets,
@@ -521,12 +548,14 @@
static const Widget _truck_station_picker_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 139, 0, 13, STR_3043_TRUCK_STATION_ORIENT, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 139, 14, 176, 0x0, STR_NULL},
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 206, 0, 13, STR_3043_TRUCK_STATION_ORIENT, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 206, 14, 176, 0x0, STR_NULL},
{ WWT_PANEL, RESIZE_NONE, 14, 71, 136, 17, 66, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
{ WWT_PANEL, RESIZE_NONE, 14, 71, 136, 69, 118, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
{ WWT_PANEL, RESIZE_NONE, 14, 3, 68, 69, 118, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
{ WWT_PANEL, RESIZE_NONE, 14, 3, 68, 17, 66, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
+{ WWT_PANEL, RESIZE_NONE, 14, 139, 204, 17, 66, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
+{ WWT_PANEL, RESIZE_NONE, 14, 139, 204, 69, 118, 0x0, STR_3052_SELECT_TRUCK_LOADING_BAY},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 10, 69, 133, 144, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 70, 129, 133, 144, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA},
{ WWT_LABEL, RESIZE_NONE, 7, 0, 139, 120, 133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
@@ -534,7 +563,7 @@
};
static const WindowDesc _truck_station_picker_desc = {
- WDP_AUTO, WDP_AUTO, 140, 177,
+ WDP_AUTO, WDP_AUTO, 207, 177,
WC_TRUCK_STATION, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
_truck_station_picker_widgets,
--- a/src/road_map.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/road_map.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -24,6 +24,7 @@
case MP_STATION:
if (!IsRoadStopTile(tile)) return ROAD_NONE;
+ if (IsDriveThroughStopTile(tile)) return (GetRoadStopDir(tile) == DIAGDIR_NE) ? ROAD_X : ROAD_Y;
return DiagDirToRoadBits(GetRoadStopDir(tile));
case MP_TUNNELBRIDGE:
@@ -45,7 +46,7 @@
uint32 r;
// Don't allow local authorities to build roads through road depots or road stops.
- if ((IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) || IsTileType(tile, MP_STATION)) {
+ if ((IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile))) {
return TRACK_BIT_NONE;
}
--- a/src/roadveh_cmd.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/roadveh_cmd.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -1080,7 +1080,8 @@
/* Road depot owned by another player or with the wrong orientation */
trackdirs = TRACKDIR_BIT_NONE;
}
- } else if (IsTileType(tile, MP_STATION) && IsRoadStopTile(tile)) {
+ } else if (IsTileType(tile, MP_STATION) && IsStandardRoadStopTile(tile)) {
+ /* Standard road stop (drive-through stops are treated as normal road) */
if (!IsTileOwner(tile, v->owner) || GetRoadStopDir(tile) == enterdir) {
/* different station owner or wrong orientation */
trackdirs = TRACKDIR_BIT_NONE;
@@ -1093,7 +1094,7 @@
trackdirs = TRACKDIR_BIT_NONE;
} else {
/* Proper station type, check if there is free loading bay */
- if (!_patches.roadveh_queue &&
+ if (!_patches.roadveh_queue && IsStandardRoadStopTile(tile) &&
!GetRoadStopByTile(tile, rstype)->HasFreeBay()) {
/* Station is full and RV queuing is off */
trackdirs = TRACKDIR_BIT_NONE;
@@ -1167,7 +1168,8 @@
goto do_it;
}
} else if (IsTileType(desttile, MP_STATION)) {
- if (IsRoadStop(desttile)) {
+ /* For drive-through stops we can head for the actual station tile */
+ if (IsStandardRoadStopTile(desttile)) {
dir = GetRoadStopDir(desttile);
do_it:;
/* When we are heading for a depot or station, we just
@@ -1242,9 +1244,11 @@
/* Start frames for when a vehicle enters a tile/changes its state.
* The start frame is different for vehicles that turned around or
* are leaving the depot as the do not start at the edge of the tile */
- RVC_DEFAULT_START_FRAME = 0,
- RVC_TURN_AROUND_START_FRAME = 1,
- RVC_DEPOT_START_FRAME = 6
+ RVC_DEFAULT_START_FRAME = 0,
+ RVC_TURN_AROUND_START_FRAME = 1,
+ RVC_DEPOT_START_FRAME = 6,
+ /* Stop frame for a vehicle in a drive-through stop */
+ RVC_DRIVE_THROUGH_STOP_FRAME = 7
};
typedef struct RoadDriveEntry {
@@ -1376,8 +1380,12 @@
return;
}
- /* Get move position data for next frame */
- rd = _road_drive_data[(v->u.road.state + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
+ /* Get move position data for next frame.
+ * For a drive-through road stop use 'straight road' move data.
+ * In this case v->u.road.state is masked to give the road stop entry direction. */
+ rd = _road_drive_data[(
+ (HASBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
+ (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
if (rd.x & RDE_NEXT_TILE) {
TileIndex tile = v->tile + TileOffsByDiagDir(rd.x & 3);
@@ -1417,8 +1425,8 @@
goto again;
}
- if (IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) && IsTileType(v->tile, MP_STATION)) {
- if (IsReversingRoadTrackdir(dir)) {
+ if (IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) && IsTileType(v->tile, MP_STATION)) {
+ if (IsReversingRoadTrackdir(dir) && IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END)) {
/* New direction is trying to turn vehicle around.
* We can't turn at the exit of a road stop so wait.*/
v->cur_speed = 0;
@@ -1427,9 +1435,13 @@
if (IsRoadStop(v->tile)) {
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile));
- /* Vehicle is leaving a road stop tile, mark bay as free */
- rs->FreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY));
- rs->SetEntranceBusy(false);
+ /* Vehicle is leaving a road stop tile, mark bay as free
+ * For drive-through stops, only do it if the vehicle stopped here */
+ if (IsStandardRoadStopTile(v->tile) || HASBIT(v->u.road.state, RVS_IS_STOPPING)) {
+ rs->FreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY));
+ CLRBIT(v->u.road.state, RVS_IS_STOPPING);
+ }
+ if (IsStandardRoadStopTile(v->tile)) rs->SetEntranceBusy(false);
}
}
@@ -1523,8 +1535,18 @@
}
}
- if (v->u.road.state >= RVSB_IN_ROAD_STOP &&
- _road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_opt.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) {
+ /* If the vehicle is in a normal road stop and the frame equals the stop frame OR
+ * if the vehicle is in a drive-through road stop and this is the destination station
+ * and it's the correct type of stop (bus or truck) and the frame equals the stop frame...
+ * (the station test and stop type test ensure that other vehicles, using the road stop as
+ * a through route, do not stop) */
+ if ((IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) &&
+ _road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_opt.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) ||
+ (IS_BYTE_INSIDE(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) &&
+ v->current_order.dest == GetStationIndex(v->tile) &&
+ GetRoadStopType(v->tile) == ((v->cargo_type == CT_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
+ v->u.road.frame == RVC_DRIVE_THROUGH_STOP_FRAME)) {
+
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile));
Station* st = GetStationByTile(v->tile);
@@ -1536,6 +1558,31 @@
/* Vehicle has arrived at a bay in a road stop */
Order old_order;
+ if (IsDriveThroughStopTile(v->tile)) {
+ TileIndex next_tile = TILE_ADD(v->tile, TileOffsByDir(v->direction));
+ RoadStop::Type type = (v->cargo_type == CT_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK;
+
+ assert(HASBIT(v->u.road.state, RVS_IS_STOPPING));
+
+ /* Check if next inline bay is free */
+ if (IsDriveThroughStopTile(next_tile) && (GetRoadStopType(next_tile) == type)) {
+ RoadStop *rs_n = GetRoadStopByTile(next_tile, type);
+
+ if (rs_n->IsFreeBay(HASBIT(v->u.road.state, RVS_USING_SECOND_BAY))) {
+ /* Bay in next stop along is free - use it */
+ ClearSlot(v);
+ rs_n->num_vehicles++;
+ v->u.road.slot = rs_n;
+ v->dest_tile = rs_n->xy;
+ v->u.road.slot_age = 14;
+
+ v->u.road.frame++;
+ RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
+ return;
+ }
+ }
+ }
+
rs->SetEntranceBusy(false);
v->last_station_visited = GetStationIndex(v->tile);
@@ -1573,7 +1620,7 @@
ClearSlot(v);
}
- rs->SetEntranceBusy(true);
+ if (IsStandardRoadStopTile(v->tile)) rs->SetEntranceBusy(true);
if (rs == v->u.road.slot) {
/* We are leaving the correct station */
--- a/src/saveload.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/saveload.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -30,7 +30,7 @@
#include "variables.h"
#include <setjmp.h>
-extern const uint16 SAVEGAME_VERSION = 46;
+extern const uint16 SAVEGAME_VERSION = 47;
uint16 _sl_version; /// the major savegame version identifier
byte _sl_minor_version; /// the minor savegame version, DO NOT USE!
--- a/src/settings.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/settings.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -1340,6 +1340,7 @@
SDT_BOOL(Patches, serviceathelipad, 0, 0, true, STR_CONFIG_PATCHES_SERVICEATHELIPAD, NULL),
SDT_BOOL(Patches, modified_catchment, 0, 0, true, STR_CONFIG_PATCHES_CATCHMENT, NULL),
SDT_CONDBOOL(Patches, gradual_loading, 40, SL_MAX_VERSION, 0, 0, true, STR_CONFIG_PATCHES_GRADUAL_LOADING, NULL),
+ SDT_CONDBOOL(Patches, road_stop_on_town_road, 47, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD, NULL),
/***************************************************************************/
/* Economy section of the GUI-configure patches window */
@@ -1431,6 +1432,8 @@
SDT_VAR(Patches, npf_road_curve_penalty, SLE_UINT, 0, 0, 1, 0, 100000, 0, STR_NULL, NULL),
/* This is the penalty for level crossings, for both road and rail vehicles */
SDT_VAR(Patches, npf_crossing_penalty, SLE_UINT, 0, 0, (3 * NPF_TILE_LENGTH), 0, 100000, 0, STR_NULL, NULL),
+ /* This is the penalty for drive-through road, stops. */
+ SDT_CONDVAR (Patches, npf_road_drive_through_penalty, SLE_UINT, 47, SL_MAX_VERSION, 0, 0, 8 * NPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
// The maximum number of nodes to search
@@ -1464,6 +1467,7 @@
SDT_CONDVAR (Patches, yapf.road_slope_penalty , SLE_UINT, 33, SL_MAX_VERSION, 0, 0, 2 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
SDT_CONDVAR (Patches, yapf.road_curve_penalty , SLE_UINT, 33, SL_MAX_VERSION, 0, 0, 1 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
SDT_CONDVAR (Patches, yapf.road_crossing_penalty , SLE_UINT, 33, SL_MAX_VERSION, 0, 0, 3 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
+ SDT_CONDVAR (Patches, yapf.road_stop_penalty , SLE_UINT, 47, SL_MAX_VERSION, 0, 0, 8 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
/***************************************************************************/
/* Terrain genation related patch options */
--- a/src/settings_gui.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/settings_gui.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -599,6 +599,7 @@
"serviceathelipad",
"modified_catchment",
"gradual_loading",
+ "road_stop_on_town_road",
};
static const char *_patches_economy[] = {
--- a/src/station.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/station.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -502,6 +502,13 @@
return GB(status, 0, MAX_BAY_COUNT) != 0;
}
+/** Checks whether the given bay is free in this road stop */
+bool RoadStop::IsFreeBay(uint nr) const
+{
+ assert(nr < MAX_BAY_COUNT);
+ return HASBIT(status, nr);
+}
+
/**
* Allocates a bay
* @return the allocated bay number
@@ -520,6 +527,16 @@
}
/**
+ * Allocates a bay in a drive-through road stop
+ * @param nr the number of the bay to allocate
+ */
+void RoadStop::AllocateDriveThroughBay(uint nr)
+{
+ assert(nr < MAX_BAY_COUNT);
+ CLRBIT(status, nr);
+}
+
+/**
* Frees the given bay
* @param nr the number of the bay to free
*/
--- a/src/station.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/station.h Sat Feb 17 11:12:50 2007 +0000
@@ -3,6 +3,7 @@
#ifndef STATION_H
#define STATION_H
+#include "airport.h"
#include "player.h"
#include "oldpool.h"
#include "sprite.h"
@@ -66,7 +67,9 @@
/* For accessing status */
bool HasFreeBay() const;
+ bool IsFreeBay(uint nr) const;
uint AllocateBay();
+ void AllocateDriveThroughBay(uint nr);
void FreeBay(uint nr);
bool IsEntranceBusy() const;
void SetEntranceBusy(bool busy);
@@ -110,6 +113,12 @@
return type == RoadStop::BUS ? bus_stops : truck_stops;
}
+ const AirportFTAClass *Airport() const
+ {
+ assert(airport_tile != 0);
+ return GetAirport(airport_type);
+ }
+
TileIndex xy;
RoadStop *bus_stops;
RoadStop *truck_stops;
@@ -200,18 +209,8 @@
CA_NONE = 0,
CA_BUS = 3,
CA_TRUCK = 3,
- CA_AIR_OILPAD = 3,
CA_TRAIN = 4,
- CA_AIR_HELIPORT = 4,
- CA_AIR_SMALL = 4,
- CA_AIR_LARGE = 5,
- CA_DOCK = 5,
- CA_AIR_METRO = 6,
- CA_AIR_INTER = 8,
- CA_AIR_COMMUTER = 4,
- CA_AIR_HELIDEPOT = 4,
- CA_AIR_INTERCON = 10,
- CA_AIR_HELISTATION = 4,
+ CA_DOCK = 5
} CatchmentAera;
void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
--- a/src/station_cmd.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/station_cmd.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -35,6 +35,7 @@
#include "date.h"
#include "helpers.hpp"
#include "misc/autoptr.hpp"
+#include "road.h"
/**
* Called if a new block is added to the station-pool
@@ -109,27 +110,13 @@
* radius that is available within the station */
static uint FindCatchmentRadius(const Station* st)
{
- CatchmentAera ret = CA_NONE;
-
- if (st->bus_stops != NULL) ret = max(ret, CA_BUS);
- if (st->truck_stops != NULL) ret = max(ret, CA_TRUCK);
- if (st->train_tile) ret = max(ret, CA_TRAIN);
- if (st->dock_tile) ret = max(ret, CA_DOCK);
-
- if (st->airport_tile) {
- switch (st->airport_type) {
- case AT_OILRIG: ret = max(ret, CA_AIR_OILPAD); break;
- case AT_SMALL: ret = max(ret, CA_AIR_SMALL); break;
- case AT_HELIPORT: ret = max(ret, CA_AIR_HELIPORT); break;
- case AT_LARGE: ret = max(ret, CA_AIR_LARGE); break;
- case AT_METROPOLITAN: ret = max(ret, CA_AIR_METRO); break;
- case AT_INTERNATIONAL: ret = max(ret, CA_AIR_INTER); break;
- case AT_COMMUTER: ret = max(ret, CA_AIR_COMMUTER); break;
- case AT_HELIDEPOT: ret = max(ret, CA_AIR_HELIDEPOT); break;
- case AT_INTERCON: ret = max(ret, CA_AIR_INTERCON); break;
- case AT_HELISTATION: ret = max(ret, CA_AIR_HELISTATION); break;
- }
- }
+ uint ret = CA_NONE;
+
+ if (st->bus_stops != NULL) ret = max<uint>(ret, CA_BUS);
+ if (st->truck_stops != NULL) ret = max<uint>(ret, CA_TRUCK);
+ if (st->train_tile != 0) ret = max<uint>(ret, CA_TRAIN);
+ if (st->dock_tile != 0) ret = max<uint>(ret, CA_DOCK);
+ if (st->airport_tile) ret = max<uint>(ret, st->Airport()->catchment);
return ret;
}
@@ -556,7 +543,7 @@
}
if (st->airport_tile != 0) {
- const AirportFTAClass* afc = GetAirport(st->airport_type);
+ const AirportFTAClass* afc = st->Airport();
MergePoint(&rect, st->airport_tile);
MergePoint(&rect,
@@ -1247,7 +1234,8 @@
/** Build a bus or truck stop
* @param tile tile to build the stop at
* @param p1 entrance direction (DiagDirection)
- * @param p2 0 for Bus stops, 1 for truck stops
+ * @param p2 bit 0: 0 for Bus stops, 1 for truck stops
+ * bit 1: 0 for normal, 1 for drive-through
*/
int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
@@ -1255,19 +1243,32 @@
RoadStop *road_stop;
int32 cost;
int32 ret;
- bool type = !!p2;
+ bool type = HASBIT(p2, 0);
+ bool is_drive_through = HASBIT(p2, 1);
+ bool build_over_road = is_drive_through && IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL;
+ Owner cur_owner = _current_player;
/* Saveguard the parameters */
if (!IsValidDiagDirection((DiagDirection)p1)) return CMD_ERROR;
+ /* If it is a drive-through stop check for valid axis */
+ if (is_drive_through && !IsValidAxis((Axis)p1)) return CMD_ERROR;
+ /* Road bits in the wrong direction */
+ if (build_over_road && (GetRoadBits(tile) & ((Axis)p1 == AXIS_X ? ROAD_Y : ROAD_X)) != 0) return CMD_ERROR;
+ /* Not allowed to build over this road */
+ if (build_over_road && !IsTileOwner(tile, _current_player) && !(IsTileOwner(tile, OWNER_TOWN) && _patches.road_stop_on_town_road)) return CMD_ERROR;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile))
return CMD_ERROR;
- ret = CheckFlatLandBelow(tile, 1, 1, flags, 1 << p1, NULL);
+ if (build_over_road) flags ^= DC_AUTO;
+
+ if (build_over_road && IsTileOwner(tile, OWNER_TOWN)) _current_player = OWNER_TOWN;
+ ret = CheckFlatLandBelow(tile, 1, 1, flags, is_drive_through ? 5 << p1 : 1 << p1, NULL);
+ _current_player = cur_owner;
if (CmdFailed(ret)) return ret;
- cost = ret;
+ cost = build_over_road ? 0 : ret; // Don't add cost of clearing road when overbuilding
st = GetStationAround(tile, 1, 1, INVALID_STATION);
if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
@@ -1333,7 +1334,8 @@
st->rect.BeforeAddTile(tile, StationRect::ADD_TRY);
- MakeRoadStop(tile, st->owner, st->index, type ? RoadStop::TRUCK : RoadStop::BUS, (DiagDirection)p1);
+ MakeRoadStop(tile, st->owner, st->index, type ? RoadStop::TRUCK : RoadStop::BUS, is_drive_through, (DiagDirection)p1);
+ if (is_drive_through & HASBIT(p2, 3)) SetStopBuiltOnTownRoad(tile);
UpdateStationVirtCoordDirty(st);
UpdateStationAcceptance(st, false);
@@ -1395,7 +1397,44 @@
return (is_truck) ? _price.remove_truck_station : _price.remove_bus_station;
}
-
+/** Remove a bus or truck stop
+ * @param tile tile to remove the stop from
+ * @param p1 not used
+ * @param p2 bit 0: 0 for Bus stops, 1 for truck stops
+ */
+int32 CmdRemoveRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+ Station* st;
+ bool is_drive_through;
+ bool is_towns_road = false;
+ RoadBits road_bits;
+ int32 ret;
+
+ /* Make sure the specified tile is a road stop of the correct type */
+ if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile) || (uint32)GetRoadStopType(tile) != p2) return CMD_ERROR;
+ st = GetStationByTile(tile);
+ /* Save the stop info before it is removed */
+ is_drive_through = IsDriveThroughStopTile(tile);
+ road_bits = GetAnyRoadBits(tile);
+ if (is_drive_through) is_towns_road = GetStopBuiltOnTownRoad(tile);
+
+ ret = RemoveRoadStop(st, flags, tile);
+
+ /* If the stop was a drive-through stop replace the road */
+ if ((flags & DC_EXEC) && !CmdFailed(ret) && is_drive_through) {
+ uint index = 0;
+ Owner cur_owner = _current_player;
+
+ if (is_towns_road) {
+ index = ClosestTownFromTile(tile, _patches.dist_local_authority)->index;
+ _current_player = OWNER_TOWN;
+ }
+ DoCommand(tile, road_bits, index, DC_EXEC, CMD_BUILD_ROAD);
+ _current_player = cur_owner;
+ }
+
+ return ret;
+}
// FIXME -- need to move to its corresponding Airport variable
// Country Airfield (small)
@@ -1628,14 +1667,13 @@
TileIndex tile;
int w,h;
int32 cost;
- const AirportFTAClass* afc;
if (_current_player != OWNER_WATER && !CheckOwnership(st->owner))
return CMD_ERROR;
tile = st->airport_tile;
- afc = GetAirport(st->airport_type);
+ const AirportFTAClass *afc = st->Airport();
w = afc->size_x;
h = afc->size_y;
@@ -2227,6 +2265,27 @@
/* Attempt to allocate a parking bay in a road stop */
RoadStop *rs = GetRoadStopByTile(tile, GetRoadStopType(tile));
+ if (IsDriveThroughStopTile(tile)) {
+ /* Vehicles entering a drive-through stop from the 'normal' side use first bay (bay 0). */
+ byte side = ((DirToDiagDir(v->direction) == ReverseDiagDir(GetRoadStopDir(tile))) == (v->u.road.overtaking == 0)) ? 0 : 1;
+
+ if (!rs->IsFreeBay(side)) return VETSB_CANNOT_ENTER;
+
+ /* Check if the vehicle is stopping at this road stop */
+ if (GetRoadStopType(tile) == ((v->cargo_type == CT_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
+ v->current_order.dest == GetStationIndex(tile)) {
+ SETBIT(v->u.road.state, RVS_IS_STOPPING);
+ rs->AllocateDriveThroughBay(side);
+ }
+
+ /* Indicate if vehicle is using second bay. */
+ if (side == 1) SETBIT(v->u.road.state, RVS_USING_SECOND_BAY);
+ /* Indicate a drive-through stop */
+ SETBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP);
+ return VETSB_CONTINUE;
+ }
+
+ /* For normal (non drive-through) road stops */
/* Check if station is busy or if there are no free bays. */
if (rs->IsEntranceBusy() || !rs->HasFreeBay()) return VETSB_CANNOT_ENTER;
@@ -2693,7 +2752,13 @@
case STATION_RAIL: return RemoveRailroadStation(st, tile, flags);
case STATION_AIRPORT: return RemoveAirport(st, flags);
case STATION_TRUCK:
- case STATION_BUS: return RemoveRoadStop(st, flags, tile);
+ if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile))
+ return_cmd_error(STR_3047_MUST_DEMOLISH_TRUCK_STATION);
+ return RemoveRoadStop(st, flags, tile);
+ case STATION_BUS:
+ if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile))
+ return_cmd_error(STR_3046_MUST_DEMOLISH_BUS_STATION);
+ return RemoveRoadStop(st, flags, tile);
case STATION_BUOY: return RemoveBuoy(st, flags);
case STATION_DOCK: return RemoveDock(st, flags);
default: break;
--- a/src/station_map.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/station_map.h Sat Feb 17 11:12:50 2007 +0000
@@ -42,7 +42,9 @@
GFX_RADAR_DISTRICTWE_LAST = 156,
GFX_WINDSACK_INTERCON_FIRST = 164,
GFX_WINDSACK_INTERCON_LAST = 167,
- GFX_BASE_END = 168
+ GFX_TRUCK_BASE_EXT = 168,
+ GFX_BUS_BASE_EXT = 170,
+ GFX_BASE_END = 172
};
enum {
@@ -51,7 +53,9 @@
TRUCK_SIZE = GFX_BUS_BASE - GFX_TRUCK_BASE,
BUS_SIZE = GFX_OILRIG_BASE - GFX_BUS_BASE,
DOCK_SIZE_TOTAL = GFX_BUOY_BASE - GFX_DOCK_BASE,
- AIRPORT_SIZE_EXTENDED = GFX_BASE_END - GFX_AIRPORT_BASE_EXTENDED
+ AIRPORT_SIZE_EXTENDED = GFX_TRUCK_BASE_EXT - GFX_AIRPORT_BASE_EXTENDED,
+ TRUCK_SIZE_EXT = GFX_BUS_BASE_EXT - GFX_TRUCK_BASE_EXT,
+ BUS_SIZE_EXT = GFX_BASE_END - GFX_BUS_BASE_EXT,
};
typedef enum HangarTiles {
@@ -125,12 +129,14 @@
static inline bool IsTruckStop(TileIndex t)
{
- return IS_BYTE_INSIDE(GetStationGfx(t), GFX_TRUCK_BASE, GFX_TRUCK_BASE + TRUCK_SIZE);
+ return (IS_BYTE_INSIDE(GetStationGfx(t), GFX_TRUCK_BASE, GFX_TRUCK_BASE + TRUCK_SIZE)) ||
+ (IS_BYTE_INSIDE(GetStationGfx(t), GFX_TRUCK_BASE_EXT, GFX_TRUCK_BASE_EXT + TRUCK_SIZE_EXT));
}
static inline bool IsBusStop(TileIndex t)
{
- return IS_BYTE_INSIDE(GetStationGfx(t), GFX_BUS_BASE, GFX_BUS_BASE + BUS_SIZE);
+ return (IS_BYTE_INSIDE(GetStationGfx(t), GFX_BUS_BASE, GFX_BUS_BASE + BUS_SIZE)) ||
+ (IS_BYTE_INSIDE(GetStationGfx(t), GFX_BUS_BASE_EXT, GFX_BUS_BASE_EXT + BUS_SIZE_EXT));
}
static inline bool IsRoadStop(TileIndex t)
@@ -143,13 +149,44 @@
return IsTileType(t, MP_STATION) && IsRoadStop(t);
}
+static inline bool IsStandardRoadStopTile(TileIndex t)
+{
+ return IsTileType(t, MP_STATION) &&
+ (IS_BYTE_INSIDE(GetStationGfx(t), GFX_TRUCK_BASE, GFX_TRUCK_BASE + TRUCK_SIZE) ||
+ IS_BYTE_INSIDE(GetStationGfx(t), GFX_BUS_BASE, GFX_BUS_BASE + BUS_SIZE));
+}
+
+static inline bool IsDriveThroughStopTile(TileIndex t)
+{
+ return IsTileType(t, MP_STATION) &&
+ (IS_BYTE_INSIDE(GetStationGfx(t), GFX_TRUCK_BASE_EXT, GFX_TRUCK_BASE_EXT + TRUCK_SIZE_EXT) ||
+ IS_BYTE_INSIDE(GetStationGfx(t), GFX_BUS_BASE_EXT, GFX_BUS_BASE_EXT + BUS_SIZE_EXT));
+}
+
+static inline bool GetStopBuiltOnTownRoad(TileIndex t)
+{
+ assert(IsDriveThroughStopTile(t));
+ return HASBIT(_m[t].m6, 3);
+}
+
+static inline void SetStopBuiltOnTownRoad(TileIndex t)
+{
+ assert(IsDriveThroughStopTile(t));
+ SETBIT(_m[t].m6, 3);
+}
+
/**
* Gets the direction the road stop entrance points towards.
*/
static inline DiagDirection GetRoadStopDir(TileIndex t)
{
+ StationGfx gfx = GetStationGfx(t);
assert(IsRoadStopTile(t));
- return (DiagDirection)((GetStationGfx(t) - GFX_TRUCK_BASE) & 3);
+ if (gfx < GFX_TRUCK_BASE_EXT) {
+ return (DiagDirection)((gfx - GFX_TRUCK_BASE) & 3);
+ } else {
+ return (DiagDirection)((gfx - GFX_TRUCK_BASE_EXT) & 1);
+ }
}
static inline bool IsOilRig(TileIndex t)
@@ -275,9 +312,13 @@
SetRailType(t, rt);
}
-static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, DiagDirection d)
+static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, bool is_drive_through, DiagDirection d)
{
- MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE : GFX_TRUCK_BASE) + d);
+ if (is_drive_through) {
+ MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE_EXT : GFX_TRUCK_BASE_EXT) + d);
+ } else {
+ MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE : GFX_TRUCK_BASE) + d);
+ }
}
static inline void MakeAirport(TileIndex t, Owner o, StationID sid, byte section)
--- a/src/table/files.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/table/files.h Sat Feb 17 11:12:50 2007 +0000
@@ -61,4 +61,5 @@
{ "elrailsw.grf", { 0x4f, 0xf9, 0xac, 0x79, 0x50, 0x28, 0x9b, 0xe2, 0x15, 0x30, 0xa8, 0x1e, 0xd5, 0xfd, 0xe1, 0xda } },
{ "openttd.grf", { 0x59, 0x22, 0x19, 0xe0, 0x6e, 0xe7, 0xb6, 0xa3, 0x55, 0x53, 0xcc, 0x9e, 0xbc, 0xaf, 0xcc, 0x83 } },
{ "trkfoundw.grf", { 0x12, 0x33, 0x3f, 0xa3, 0xd1, 0x86, 0x8b, 0x04, 0x53, 0x18, 0x9c, 0xee, 0xf9, 0x2d, 0xf5, 0x95 } },
+ { "roadstops.grf", { 0x8c, 0xd9, 0x45, 0x21, 0x28, 0x82, 0x96, 0x45, 0x33, 0x22, 0x7a, 0xb9, 0x0d, 0xf3, 0x67, 0x4a } },
};
--- a/src/table/sprites.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/table/sprites.h Sat Feb 17 11:12:50 2007 +0000
@@ -117,6 +117,16 @@
SPR_GRASS_RIGHT = SPR_AIRPORTX_BASE + 13,
SPR_GRASS_LEFT = SPR_AIRPORTX_BASE + 14,
+ SPR_ROADSTOP_BASE = SPR_AIRPORTX_BASE + 15, // The sprites used for drive-through road stops
+ SPR_BUS_STOP_DT_Y_W = SPR_ROADSTOP_BASE,
+ SPR_BUS_STOP_DT_Y_E = SPR_ROADSTOP_BASE + 1,
+ SPR_BUS_STOP_DT_X_W = SPR_ROADSTOP_BASE + 2,
+ SPR_BUS_STOP_DT_X_E = SPR_ROADSTOP_BASE + 3,
+ SPR_TRUCK_STOP_DT_Y_W = SPR_ROADSTOP_BASE + 4,
+ SPR_TRUCK_STOP_DT_Y_E = SPR_ROADSTOP_BASE + 5,
+ SPR_TRUCK_STOP_DT_X_W = SPR_ROADSTOP_BASE + 6,
+ SPR_TRUCK_STOP_DT_X_E = SPR_ROADSTOP_BASE + 7,
+
/* Manager face sprites */
SPR_GRADIENT = 874, // background gradient behind manager face
@@ -295,6 +305,10 @@
SPR_PYLON_NS_W = SPR_ELRAIL_BASE + 37,
SPR_PYLON_NS_E = SPR_ELRAIL_BASE + 38,
+ /* sprites for roads */
+ SPR_ROAD_PAVED_STRAIGHT_Y = 1313,
+ SPR_ROAD_PAVED_STRAIGHT_X = 1314,
+
/* sprites for airports and airfields*/
/* Small airports are AIRFIELD, everything else is AIRPORT */
SPR_HELIPORT = 2633,
--- a/src/table/station_land.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/table/station_land.h Sat Feb 17 11:12:50 2007 +0000
@@ -959,6 +959,34 @@
TILE_SEQ_END()
};
+// drive-through truck stop X
+static const DrawTileSeqStruct _station_display_datas_0168[] = {
+ { 1, 0, 0, 14, 3, 10, SPR_TRUCK_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ { 1, 13, 0, 14, 1, 10, SPR_TRUCK_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ TILE_SEQ_END()
+};
+
+// drive-through truck stop Y
+static const DrawTileSeqStruct _station_display_datas_0169[] = {
+ { 13, 1, 0, 1, 14, 10, SPR_TRUCK_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ { 0, 1, 0, 3, 14, 10, SPR_TRUCK_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ TILE_SEQ_END()
+};
+
+// drive-through bus stop X
+static const DrawTileSeqStruct _station_display_datas_0170[] = {
+ { 5, 0, 0, 8, 3, 10, SPR_BUS_STOP_DT_X_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ { 5, 14, 0, 8, 1, 10, SPR_BUS_STOP_DT_X_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ TILE_SEQ_END()
+};
+
+// drive-through bus stop Y
+static const DrawTileSeqStruct _station_display_datas_0171[] = {
+ { 13, 5, 0, 1, 8, 10, SPR_BUS_STOP_DT_Y_W | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ { 0, 5, 0, 3, 8, 10, SPR_BUS_STOP_DT_Y_E | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
+ TILE_SEQ_END()
+};
+
static const DrawTileSprites _station_display_datas[] = {
{ SPR_RAIL_TRACK_X, PAL_NONE, _station_display_datas_0 },
{ SPR_RAIL_TRACK_Y, PAL_NONE, _station_display_datas_1 },
@@ -1128,4 +1156,8 @@
{ SPR_FLAT_GRASS_TILE, PAL_NONE, _station_display_datas_59 },
{ SPR_FLAT_GRASS_TILE, PAL_NONE, _station_display_datas_60 },
{ SPR_FLAT_GRASS_TILE, PAL_NONE, _station_display_datas_61 },
+ { SPR_ROAD_PAVED_STRAIGHT_X, PAL_NONE, _station_display_datas_0168 },
+ { SPR_ROAD_PAVED_STRAIGHT_Y, PAL_NONE, _station_display_datas_0169 },
+ { SPR_ROAD_PAVED_STRAIGHT_X, PAL_NONE, _station_display_datas_0170 },
+ { SPR_ROAD_PAVED_STRAIGHT_Y, PAL_NONE, _station_display_datas_0171 }
};
--- a/src/tunnelbridge_cmd.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -77,7 +77,7 @@
}
#define M(x) (1 << (x))
-enum {
+typedef enum BridgeFoundations{
// foundation, whole tile is leveled up --> 3 corners raised
BRIDGE_FULL_LEVELED_FOUNDATION = M(SLOPE_WSE) | M(SLOPE_NWS) | M(SLOPE_ENW) | M(SLOPE_SEN),
// foundation, tile is partly leveled up --> 1 corner raised
@@ -85,7 +85,7 @@
// no foundations (X,Y direction)
BRIDGE_NO_FOUNDATION = M(SLOPE_FLAT) | M(SLOPE_SW) | M(SLOPE_SE) | M(SLOPE_NW) | M(SLOPE_NE),
BRIDGE_HORZ_RAMP = (BRIDGE_PARTLY_LEVELED_FOUNDATION | BRIDGE_NO_FOUNDATION) & ~M(SLOPE_FLAT)
-};
+} BridgeFoundataion;
#undef M
static inline const PalSpriteID *GetBridgeSpriteTable(int index, byte table)
--- a/src/unix.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/unix.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -260,13 +260,11 @@
void CSleep(int milliseconds)
{
- #if !defined(__BEOS__) && !defined(__AMIGA__)
- usleep(milliseconds * 1000);
- #endif
- #ifdef __BEOS__
+ #if defined(PSP)
+ sceKernelDelayThread(milliseconds * 1000);
+ #elif defined(__BEOS__)
snooze(milliseconds * 1000);
- #endif
- #if defined(__AMIGA__)
+ #elif defined(__AMIGA__)
{
ULONG signals;
ULONG TimerSigBit = 1 << TimerPort->mp_SigBit;
@@ -282,7 +280,9 @@
}
WaitIO((struct IORequest *)TimerRequest);
}
- #endif // __AMIGA__
+ #else
+ usleep(milliseconds * 1000);
+ #endif
}
#ifdef WITH_ICONV
--- a/src/variables.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/variables.h Sat Feb 17 11:12:50 2007 +0000
@@ -166,6 +166,7 @@
bool autosave_on_exit; // save an autosave when you quit the game, but do not ask "Do you really want to quit?"
byte max_num_autosaves; // controls how many autosavegames are made before the game starts to overwrite (names them 0 to max_num_autosaves - 1)
bool extra_dynamite; // extra dynamite
+ bool road_stop_on_town_road; // allow building of drive-through road stops on town owned roads
bool never_expire_vehicles; // never expire vehicles
byte extend_vehicle_life; // extend vehicle life by this many years
@@ -211,6 +212,7 @@
uint32 npf_water_curve_penalty; /* The penalty for curves */
uint32 npf_road_curve_penalty; /* The penalty for curves */
uint32 npf_crossing_penalty; /* The penalty for level crossings */
+ uint32 npf_road_drive_through_penalty; /* The penalty for going through a drive-through road stop */
bool population_in_label; // Show the population of a town in his label?
--- a/src/vehicle.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/vehicle.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -515,6 +515,7 @@
Vehicle* u;
assert(v != NULL);
+ assert(v->type == VEH_Train);
if (v->first != NULL) {
if (IsFrontEngine(v->first) || IsFreeWagon(v->first)) return v->first;
@@ -2756,9 +2757,11 @@
if (IsRoadVehInDepot(v)) /* We'll assume the road vehicle is facing outwards */
return DiagdirToDiagTrackdir(GetRoadDepotDirection(v->tile));
- if (IsRoadStopTile(v->tile)) /* We'll assume the road vehicle is facing outwards */
+ if (IsStandardRoadStopTile(v->tile)) /* We'll assume the road vehicle is facing outwards */
return DiagdirToDiagTrackdir(GetRoadStopDir(v->tile)); /* Road vehicle in a station */
+ if (IsDriveThroughStopTile(v->tile)) return DiagdirToDiagTrackdir(DirToDiagDir(v->direction));
+
/* If vehicle's state is a valid track direction (vehicle is not turning around) return it */
if (!IsReversingRoadTrackdir((Trackdir)v->u.road.state)) return (Trackdir)v->u.road.state;
--- a/src/vehicle.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/vehicle.h Sat Feb 17 11:12:50 2007 +0000
@@ -45,14 +45,18 @@
/* Bit numbers */
RVS_USING_SECOND_BAY = 1, ///< Only used while in a road stop
+ RVS_IS_STOPPING = 2, ///< Only used for drive-through stops. Vehicle will stop here
RVS_DRIVE_SIDE = 4, ///< Only used when retrieving move data and for turning vehicles
RVS_IN_ROAD_STOP = 5, ///< The vehicle is in a road stop
+ RVS_IN_DT_ROAD_STOP = 6, ///< The vehicle is in a drive-through road stop
/* Bit sets of the above specified bits */
RVSB_USING_SECOND_BAY = 1 << RVS_USING_SECOND_BAY, ///< Only used while in a road stop
RVSB_DRIVE_SIDE = 1 << RVS_DRIVE_SIDE, ///< Only used when retrieving move data and for turning vehicles
RVSB_IN_ROAD_STOP = 1 << RVS_IN_ROAD_STOP, ///< The vehicle is in a road stop
RVSB_IN_ROAD_STOP_END = RVSB_IN_ROAD_STOP + TRACKDIR_END,
+ RVSB_IN_DT_ROAD_STOP = 1 << RVS_IN_DT_ROAD_STOP, ///< The vehicle is in a drive-through road stop
+ RVSB_IN_DT_ROAD_STOP_END = RVSB_IN_DT_ROAD_STOP + TRACKDIR_END,
RVSB_TRACKDIR_MASK = 0x0F, ///< The mask used to extract track dirs
RVSB_ROAD_STOP_TRACKDIR_MASK = 0x09 ///< Only bits 0 and 3 are used to encode the trackdir for road stops
--- a/src/video/dedicated_v.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/video/dedicated_v.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -45,12 +45,16 @@
}
#endif
-#ifdef UNIX
+#if defined(UNIX) || defined(PSP)
# include <sys/time.h> /* gettimeofday */
# include <sys/types.h>
# include <unistd.h>
# include <signal.h>
# define STDIN 0 /* file descriptor for standard input */
+# if defined(PSP)
+# include <sys/fd_set.h>
+# include <sys/select.h>
+# endif /* PSP */
/* Signal handlers */
static void DedicatedSignalHandler(int sig)
@@ -148,7 +152,7 @@
static bool DedicatedVideoChangeRes(int w, int h) { return false; }
static void DedicatedVideoFullScreen(bool fs) {}
-#if defined(UNIX) || defined(__OS2__)
+#if defined(UNIX) || defined(__OS2__) || defined(PSP)
static bool InputWaiting(void)
{
struct timeval tv;
@@ -194,7 +198,7 @@
if (_exit_game) return;
-#if defined(UNIX) || defined(__OS2__)
+#if defined(UNIX) || defined(__OS2__) || defined(PSP)
if (fgets(input_line, lengthof(input_line), stdin) == NULL) return;
#else
/* Handle console input, and singal console thread, it can accept input again */
@@ -227,7 +231,7 @@
uint32 next_tick = cur_ticks + 30;
/* Signal handlers */
-#ifdef UNIX
+#if defined(UNIX) || defined(PSP)
signal(SIGTERM, DedicatedSignalHandler);
signal(SIGINT, DedicatedSignalHandler);
signal(SIGQUIT, DedicatedSignalHandler);
--- a/src/window.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/window.h Sat Feb 17 11:12:50 2007 +0000
@@ -570,7 +570,7 @@
byte vehicle_type;
union {
RailTypeByte railtype;
- AcceptPlanesByte acc_planes; // AIRCRAFT_ONLY, ALL, HELICOPTERS_ONLY
+ AirportFTAClass::Flags flags;
} filter;
byte sel_index; // deprecated value, used for 'unified' ship and road
bool descending_sort_order;
--- a/src/yapf/follow_track.hpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/yapf/follow_track.hpp Sat Feb 17 11:12:50 2007 +0000
@@ -121,8 +121,8 @@
/** return true if we can leave m_old_tile in m_exitdir */
FORCEINLINE bool CanExitOldTile()
{
- // road stop can be left at one direction only
- if (IsRoadTT() && IsRoadStopTile(m_old_tile)) {
+ // road stop can be left at one direction only unless it's a drive-through stop
+ if (IsRoadTT() && IsStandardRoadStopTile(m_old_tile)) {
DiagDirection exitdir = GetRoadStopDir(m_old_tile);
if (exitdir != m_exitdir)
return false;
@@ -140,8 +140,8 @@
/** return true if we can enter m_new_tile from m_exitdir */
FORCEINLINE bool CanEnterNewTile()
{
- if (IsRoadTT() && IsRoadStopTile(m_new_tile)) {
- // road stop can be entered from one direction only
+ if (IsRoadTT() && IsStandardRoadStopTile(m_new_tile)) {
+ // road stop can be entered from one direction only unless it's a drive-through stop
DiagDirection exitdir = GetRoadStopDir(m_new_tile);
if (ReverseDiagDir(exitdir) != m_exitdir)
return false;
--- a/src/yapf/yapf_costrail.hpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp Sat Feb 17 11:12:50 2007 +0000
@@ -282,13 +282,13 @@
// add penalty for skipped station tiles
if (F.m_is_station)
{
+ uint platform_length = F.m_tiles_skipped + 1;
if (target_seen) {
// it is our destination station
- uint platform_length = F.m_tiles_skipped + 1;
segment_cost += PlatformLengthPenalty(platform_length);
} else {
// station is not our destination station, apply penalty for skipped platform tiles
- segment_cost += Yapf().PfGetSettings().rail_station_penalty * F.m_tiles_skipped;
+ segment_cost += Yapf().PfGetSettings().rail_station_penalty * platform_length;
}
}
--- a/src/yapf/yapf_road.cpp Wed Feb 14 10:46:38 2007 +0000
+++ b/src/yapf/yapf_road.cpp Sat Feb 17 11:12:50 2007 +0000
@@ -51,6 +51,10 @@
if (IsLevelCrossing(tile))
cost += Yapf().PfGetSettings().road_crossing_penalty;
break;
+ case MP_STATION:
+ if (IsDriveThroughStopTile(tile))
+ cost += Yapf().PfGetSettings().road_stop_penalty;
+ break;
default:
break;
@@ -76,6 +80,10 @@
// base tile cost depending on distance between edges
segment_cost += Yapf().OneTileCost(tile, trackdir);
+ const Vehicle* v = Yapf().GetVehicle();
+ // we have reached the vehicle's destination - segment should end here to avoid target skipping
+ if (v->current_order.type == OT_GOTO_STATION && tile == v->dest_tile) break;
+
// stop if we have just entered the depot
if (IsTileDepotType(tile, TRANSPORT_ROAD) && trackdir == DiagdirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) {
// next time we will reverse and leave the depot
@@ -103,7 +111,6 @@
// add min/max speed penalties
int min_speed = 0;
int max_speed = F.GetSpeedLimit(&min_speed);
- const Vehicle* v = Yapf().GetVehicle();
if (max_speed < v->max_speed) segment_cost += 1 * (v->max_speed - max_speed);
if (min_speed > v->max_speed) segment_cost += 10 * (min_speed - v->max_speed);
--- a/src/yapf/yapf_settings.h Wed Feb 14 10:46:38 2007 +0000
+++ b/src/yapf/yapf_settings.h Sat Feb 17 11:12:50 2007 +0000
@@ -39,6 +39,7 @@
YS_DEF(uint32, road_slope_penalty) ///< penalty for up-hill slope
YS_DEF(uint32, road_curve_penalty) ///< penalty for curves
YS_DEF(uint32, road_crossing_penalty) ///< penalty for level crossing
+ YS_DEF(uint32, road_stop_penalty) ///< penalty for going through a drive-through road stop
YS_DEF(bool , rail_firstred_twoway_eol) ///< treat first red two-way signal as dead end
YS_DEF(uint32, rail_firstred_penalty) ///< penalty for first red signal
YS_DEF(uint32, rail_firstred_exit_penalty) ///< penalty for first red exit signal