(svn r13684) [NoAI] -Sync: with trunk r13599:13683.
--- a/config.lib Mon Jun 30 21:31:23 2008 +0000
+++ b/config.lib Wed Jul 09 13:32:13 2008 +0000
@@ -931,6 +931,12 @@
# Make sure we mark GCC 2.95 flag for Makefile.src.in, as we
# need a lovely hack there to make it compile correctly.
gcc295="1"
+
+ # Disable warnings about unused variables when
+ # compiling with asserts disabled
+ if [ $enable_assert -eq 0 ]; then
+ CFLAGS="$CFLAGS -Wno-unused"
+ fi
fi
if [ $cc_version -ge 30 ]; then
--- a/projects/openttd_vs80.vcproj Mon Jun 30 21:31:23 2008 +0000
+++ b/projects/openttd_vs80.vcproj Wed Jul 09 13:32:13 2008 +0000
@@ -1476,6 +1476,10 @@
>
</File>
<File
+ RelativePath=".\..\src\tar_type.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\terraform_gui.h"
>
</File>
--- a/projects/openttd_vs90.vcproj Mon Jun 30 21:31:23 2008 +0000
+++ b/projects/openttd_vs90.vcproj Wed Jul 09 13:32:13 2008 +0000
@@ -1473,6 +1473,10 @@
>
</File>
<File
+ RelativePath=".\..\src\tar_type.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\terraform_gui.h"
>
</File>
--- a/source.list Mon Jun 30 21:31:23 2008 +0000
+++ b/source.list Wed Jul 09 13:32:13 2008 +0000
@@ -294,6 +294,7 @@
string_type.h
strings_func.h
strings_type.h
+tar_type.h
terraform_gui.h
textbuf_gui.h
texteff.hpp
--- a/src/blitter/32bpp_anim.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/32bpp_anim.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -15,6 +15,181 @@
static FBlitter_32bppAnim iFBlitter_32bppAnim;
+template <BlitterMode mode>
+inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
+{
+ const SpriteData *src = (const SpriteData *)bp->sprite;
+
+ const Colour *src_px = (const Colour *)(src->data + src->offset[zoom][0]);
+ const uint8 *src_n = (const uint8 *)(src->data + src->offset[zoom][1]);
+
+ for (uint i = bp->skip_top; i != 0; i--) {
+ src_px = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
+ src_n += *(const uint32 *)src_n;
+ }
+
+ uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
+ uint8 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
+
+ const byte *remap = bp->remap; // store so we don't have to access it via bp everytime
+
+ for (int y = 0; y < bp->height; y++) {
+ uint32 *dst_ln = dst + bp->pitch;
+ uint8 *anim_ln = anim + this->anim_buf_width;
+
+ const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
+ src_px++;
+
+ const uint8 *src_n_ln = src_n + *(uint32 *)src_n;
+ src_n += 4;
+
+ uint32 *dst_end = dst + bp->skip_left;
+
+ uint n;
+
+ while (dst < dst_end) {
+ n = *src_n++;
+
+ if (src_px->a == 0) {
+ dst += n;
+ src_px ++;
+ src_n++;
+
+ if (dst > dst_end) anim += dst - dst_end;
+ } else {
+ if (dst + n > dst_end) {
+ uint d = dst_end - dst;
+ src_px += d;
+ src_n += d;
+
+ dst = dst_end - bp->skip_left;
+ dst_end = dst + bp->width;
+
+ n = min<uint>(n - d, (uint)bp->width);
+ goto draw;
+ }
+ dst += n;
+ src_px += n;
+ src_n += n;
+ }
+ }
+
+ dst -= bp->skip_left;
+ dst_end -= bp->skip_left;
+
+ dst_end += bp->width;
+
+ while (dst < dst_end) {
+ n = min<uint>(*src_n++, (uint)(dst_end - dst));
+
+ if (src_px->a == 0) {
+ anim += n;
+ dst += n;
+ src_px++;
+ src_n++;
+ continue;
+ }
+
+ draw:;
+
+ switch (mode) {
+ case BM_COLOUR_REMAP:
+ if (src_px->a == 255) {
+ do {
+ uint m = *src_n;
+ /* In case the m-channel is zero, do not remap this pixel in any way */
+ if (m == 0) {
+ *dst = *src_px;
+ *anim = 0;
+ } else {
+ uint r = remap[m];
+ *anim = r;
+ if (r != 0) *dst = this->LookupColourInPalette(r);
+ }
+ anim++;
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ } else {
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ *dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
+ *anim = 0;
+ } else {
+ uint r = remap[m];
+ *anim = r;
+ if (r != 0) *dst = ComposeColourPANoCheck(this->LookupColourInPalette(r), src_px->a, *dst);
+ }
+ anim++;
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
+ }
+ break;
+
+ case BM_TRANSPARENT:
+ /* TODO -- We make an assumption here that the remap in fact is transparency, not some color.
+ * This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
+ * we produce a result the newgrf maker didn't expect ;) */
+
+ /* Make the current color a bit more black, so it looks like this image is transparent */
+ src_n += n;
+ if (src_px->a == 255) {
+ src_px += n;
+ do {
+ *dst = MakeTransparent(*dst, 3, 4);
+ *anim = remap[*anim];
+ anim++;
+ dst++;
+ } while (--n != 0);
+ } else {
+ do {
+ *dst = MakeTransparent(*dst, (256 * 4 - src_px->a), 256 * 4);
+ *anim = remap[*anim];
+ anim++;
+ dst++;
+ src_px++;
+ } while (--n != 0);
+ }
+ break;
+
+ default:
+ if (src_px->a == 255) {
+ do {
+ /* Compiler assumes pointer aliasing, can't optimise this on its own */
+ uint m = *src_n++;
+ /* Above 217 is palette animation */
+ *anim++ = m;
+ *dst++ = (m >= 217) ? this->LookupColourInPalette(m) : *src_px;
+ src_px++;
+ } while (--n != 0);
+ } else {
+ do {
+ uint m = *src_n++;
+ *anim++ = m;
+ if (m >= 217) {
+ *dst = ComposeColourPANoCheck(this->LookupColourInPalette(m), src_px->a, *dst);
+ } else {
+ *dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
+ }
+ dst++;
+ src_px++;
+ } while (--n != 0);
+ }
+ break;
+ }
+ }
+
+ anim = anim_ln;
+ dst = dst_ln;
+ src_px = src_px_ln;
+ src_n = src_n_ln;
+ }
+}
+
void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
{
if (_screen_disable_anim) {
@@ -23,10 +198,6 @@
return;
}
- const SpriteLoader::CommonPixel *src, *src_line;
- uint32 *dst, *dst_line;
- uint8 *anim, *anim_line;
-
if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
/* The size of the screen changed; we can assume we can wipe all data from our buffer */
free(this->anim_buf);
@@ -35,68 +206,11 @@
this->anim_buf_height = _screen.height;
}
- /* Find where to start reading in the source sprite */
- src_line = (const SpriteLoader::CommonPixel *)bp->sprite + (bp->skip_top * bp->sprite_width + bp->skip_left) * ScaleByZoom(1, zoom);
- dst_line = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
- anim_line = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
-
- for (int y = 0; y < bp->height; y++) {
- dst = dst_line;
- dst_line += bp->pitch;
-
- src = src_line;
- src_line += bp->sprite_width * ScaleByZoom(1, zoom);
-
- anim = anim_line;
- anim_line += this->anim_buf_width;
-
- for (int x = 0; x < bp->width; x++) {
- if (src->a == 0) {
- /* src->r is 'misused' here to indicate how much more pixels are following with an alpha of 0 */
- int skip = UnScaleByZoom(src->r, zoom);
-
- dst += skip;
- anim += skip;
- x += skip - 1;
- src += ScaleByZoom(1, zoom) * skip;
- continue;
- }
-
- switch (mode) {
- case BM_COLOUR_REMAP:
- /* In case the m-channel is zero, do not remap this pixel in any way */
- if (src->m == 0) {
- *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
- *anim = 0;
- } else {
- if (bp->remap[src->m] != 0) {
- *dst = ComposeColourPA(this->LookupColourInPalette(bp->remap[src->m]), src->a, *dst);
- *anim = bp->remap[src->m];
- }
- }
- break;
-
- case BM_TRANSPARENT:
- /* TODO -- We make an assumption here that the remap in fact is transparency, not some color.
- * This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
- * we produce a result the newgrf maker didn't expect ;) */
-
- /* Make the current color a bit more black, so it looks like this image is transparent */
- *dst = MakeTransparent(*dst, 192);
- *anim = bp->remap[*anim];
- break;
-
- default:
- /* Above 217 is palette animation */
- if (src->m >= 217) *dst = ComposeColourPA(this->LookupColourInPalette(src->m), src->a, *dst);
- else *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
- *anim = src->m;
- break;
- }
- dst++;
- anim++;
- src += ScaleByZoom(1, zoom);
- }
+ switch (mode) {
+ default: NOT_REACHED();
+ case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
+ case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
+ case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
}
}
--- a/src/blitter/32bpp_anim.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/32bpp_anim.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -34,6 +34,8 @@
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
/* virtual */ const char *GetName() { return "32bpp-anim"; }
+
+ template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
};
class FBlitter_32bppAnim: public BlitterFactory<FBlitter_32bppAnim> {
--- a/src/blitter/32bpp_base.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/32bpp_base.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -30,7 +30,7 @@
/**
* Compose a colour based on RGB values.
*/
- static inline uint ComposeColour(uint a, uint r, uint g, uint b)
+ static inline uint32 ComposeColour(uint a, uint r, uint g, uint b)
{
return (((a) << 24) & 0xFF000000) | (((r) << 16) & 0x00FF0000) | (((g) << 8) & 0x0000FF00) | ((b) & 0x000000FF);
}
@@ -46,60 +46,76 @@
/**
* Compose a colour based on RGBA values and the current pixel value.
*/
- static inline uint ComposeColourRGBA(uint r, uint g, uint b, uint a, uint current)
+ static inline uint32 ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, uint32 current)
+ {
+ uint cr = GB(current, 16, 8);
+ uint cg = GB(current, 8, 8);
+ uint cb = GB(current, 0, 8);
+
+ /* The 256 is wrong, it should be 255, but 256 is much faster... */
+ return ComposeColour(0xFF,
+ (r * a + cr * (256 - a)) / 256,
+ (g * a + cg * (256 - a)) / 256,
+ (b * a + cb * (256 - a)) / 256);
+ }
+
+ /**
+ * Compose a colour based on RGBA values and the current pixel value.
+ * Handles fully transparent and solid pixels in a special (faster) way.
+ */
+ static inline uint32 ComposeColourRGBA(uint r, uint g, uint b, uint a, uint32 current)
{
if (a == 0) return current;
if (a >= 255) return ComposeColour(0xFF, r, g, b);
- uint cr, cg, cb;
- cr = GB(current, 16, 8);
- cg = GB(current, 8, 8);
- cb = GB(current, 0, 8);
+ return ComposeColourRGBANoCheck(r, g, b, a, current);
+ }
+
+ /**
+ * Compose a colour based on Pixel value, alpha value, and the current pixel value.
+ */
+ static inline uint32 ComposeColourPANoCheck(uint32 colour, uint a, uint32 current)
+ {
+ uint r = GB(colour, 16, 8);
+ uint g = GB(colour, 8, 8);
+ uint b = GB(colour, 0, 8);
+ uint cr = GB(current, 16, 8);
+ uint cg = GB(current, 8, 8);
+ uint cb = GB(current, 0, 8);
/* The 256 is wrong, it should be 255, but 256 is much faster... */
return ComposeColour(0xFF,
- (r * a + cr * (256 - a)) / 256,
- (g * a + cg * (256 - a)) / 256,
- (b * a + cb * (256 - a)) / 256);
+ (r * a + cr * (256 - a)) / 256,
+ (g * a + cg * (256 - a)) / 256,
+ (b * a + cb * (256 - a)) / 256);
}
/**
- * Compose a colour based on Pixel value, alpha value, and the current pixel value.
- */
- static inline uint ComposeColourPA(uint colour, uint a, uint current)
+ * Compose a colour based on Pixel value, alpha value, and the current pixel value.
+ * Handles fully transparent and solid pixels in a special (faster) way.
+ */
+ static inline uint32 ComposeColourPA(uint32 colour, uint a, uint32 current)
{
if (a == 0) return current;
if (a >= 255) return (colour | 0xFF000000);
- uint r, g, b, cr, cg, cb;
- r = GB(colour, 16, 8);
- g = GB(colour, 8, 8);
- b = GB(colour, 0, 8);
- cr = GB(current, 16, 8);
- cg = GB(current, 8, 8);
- cb = GB(current, 0, 8);
-
- /* The 256 is wrong, it should be 255, but 256 is much faster... */
- return ComposeColour(0xFF,
- (r * a + cr * (256 - a)) / 256,
- (g * a + cg * (256 - a)) / 256,
- (b * a + cb * (256 - a)) / 256);
+ return ComposeColourPANoCheck(colour, a, current);
}
/**
* Make a pixel looks like it is transparent.
* @param colour the colour already on the screen.
- * @param amount the amount of transparency, times 256.
+ * @param nom the amount of transparency, nominator, makes colour lighter.
+ * @param denom denominator, makes colour darker.
* @return the new colour for the screen.
*/
- static inline uint MakeTransparent(uint colour, uint amount)
+ static inline uint32 MakeTransparent(uint32 colour, uint nom, uint denom = 256)
{
- uint r, g, b;
- r = GB(colour, 16, 8);
- g = GB(colour, 8, 8);
- b = GB(colour, 0, 8);
+ uint r = GB(colour, 16, 8);
+ uint g = GB(colour, 8, 8);
+ uint b = GB(colour, 0, 8);
- return ComposeColour(0xFF, r * amount / 256, g * amount / 256, b * amount / 256);
+ return ComposeColour(0xFF, r * nom / denom, g * nom / denom, b * nom / denom);
}
/**
@@ -107,12 +123,11 @@
* @param colour the colour to make grey.
* @return the new colour, now grey.
*/
- static inline uint MakeGrey(uint colour)
+ static inline uint32 MakeGrey(uint32 colour)
{
- uint r, g, b;
- r = GB(colour, 16, 8);
- g = GB(colour, 8, 8);
- b = GB(colour, 0, 8);
+ uint r = GB(colour, 16, 8);
+ uint g = GB(colour, 8, 8);
+ uint b = GB(colour, 0, 8);
/* To avoid doubles and stuff, multiple it with a total of 65536 (16bits), then
* divide by it to normalize the value to a byte again. See heightmap.cpp for
--- a/src/blitter/32bpp_optimized.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/32bpp_optimized.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -6,44 +6,133 @@
#include "../zoom_func.h"
#include "../gfx_func.h"
#include "../debug.h"
+#include "../core/math_func.hpp"
+#include "../core/alloc_func.hpp"
#include "32bpp_optimized.hpp"
static FBlitter_32bppOptimized iFBlitter_32bppOptimized;
-template <BlitterMode mode, ZoomLevel zoom> inline void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp)
+/**
+ * Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
+ *
+ * @param mode blitter mode
+ * @param bp further blitting parameters
+ * @param zoom zoom level at which we are drawing
+ */
+template <BlitterMode mode>
+inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
{
- const SpriteLoader::CommonPixel *src, *src_line;
- uint32 *dst, *dst_line;
+ const SpriteData *src = (const SpriteData *)bp->sprite;
- /* Find where to start reading in the source sprite */
- src_line = (const SpriteLoader::CommonPixel *)bp->sprite + (bp->skip_top * bp->sprite_width + bp->skip_left) * ScaleByZoom(1, zoom);
- dst_line = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
+ /* src_px : each line begins with uint32 n = 'number of bytes in this line',
+ * then n times is the Colour struct for this line */
+ const Colour *src_px = (const Colour *)(src->data + src->offset[zoom][0]);
+ /* src_n : each line begins with uint32 n = 'number of bytes in this line',
+ * then interleaved stream of 'm' and 'n' channels. 'm' is remap,
+ * 'n' is number of bytes with the same alpha channel class */
+ const uint8 *src_n = (const uint8 *)(src->data + src->offset[zoom][1]);
+
+ /* skip upper lines in src_px and src_n */
+ for (uint i = bp->skip_top; i != 0; i--) {
+ src_px = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
+ src_n += *(uint32 *)src_n;
+ }
+
+ /* skip lines in dst */
+ uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
+
+ /* store so we don't have to access it via bp everytime (compiler assumes pointer aliasing) */
+ const byte *remap = bp->remap;
for (int y = 0; y < bp->height; y++) {
- dst = dst_line;
- dst_line += bp->pitch;
-
- src = src_line;
- src_line += bp->sprite_width * ScaleByZoom(1, zoom);
+ /* next dst line begins here */
+ uint32 *dst_ln = dst + bp->pitch;
- for (int x = 0; x < bp->width; x++) {
- if (src->a == 0) {
- /* src->r is 'misused' here to indicate how much more pixels are following with an alpha of 0 */
- int skip = UnScaleByZoom(src->r, zoom);
+ /* next src line begins here */
+ const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
+ src_px++;
- dst += skip;
- x += skip - 1;
- src += ScaleByZoom(1, zoom) * skip;
+ /* next src_n line begins here */
+ const uint8 *src_n_ln = src_n + *(uint32 *)src_n;
+ src_n += 4;
+
+ /* we will end this line when we reach this point */
+ uint32 *dst_end = dst + bp->skip_left;
+
+ /* number of pixels with the same aplha channel class */
+ uint n;
+
+ while (dst < dst_end) {
+ n = *src_n++;
+
+ if (src_px->a == 0) {
+ dst += n;
+ src_px ++;
+ src_n++;
+ } else {
+ if (dst + n > dst_end) {
+ uint d = dst_end - dst;
+ src_px += d;
+ src_n += d;
+
+ dst = dst_end - bp->skip_left;
+ dst_end = dst + bp->width;
+
+ n = min<uint>(n - d, (uint)bp->width);
+ goto draw;
+ }
+ dst += n;
+ src_px += n;
+ src_n += n;
+ }
+ }
+
+ dst -= bp->skip_left;
+ dst_end -= bp->skip_left;
+
+ dst_end += bp->width;
+
+ while (dst < dst_end) {
+ n = min<uint>(*src_n++, (uint)(dst_end - dst));
+
+ if (src_px->a == 0) {
+ dst += n;
+ src_px++;
+ src_n++;
continue;
}
+ draw:;
+
switch (mode) {
case BM_COLOUR_REMAP:
- /* In case the m-channel is zero, do not remap this pixel in any way */
- if (src->m == 0) {
- *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+ if (src_px->a == 255) {
+ do {
+ uint m = *src_n;
+ /* In case the m-channel is zero, do not remap this pixel in any way */
+ if (m == 0) {
+ *dst = *src_px;
+ } else {
+ uint r = remap[m];
+ if (r != 0) *dst = this->LookupColourInPalette(r);
+ }
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
} else {
- if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->LookupColourInPalette(bp->remap[src->m]), src->a, *dst);
+ do {
+ uint m = *src_n;
+ if (m == 0) {
+ *dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
+ } else {
+ uint r = remap[m];
+ if (r != 0) *dst = ComposeColourPANoCheck(this->LookupColourInPalette(r), src_px->a, *dst);
+ }
+ dst++;
+ src_px++;
+ src_n++;
+ } while (--n != 0);
}
break;
@@ -53,30 +142,54 @@
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current color a bit more black, so it looks like this image is transparent */
- *dst = MakeTransparent(*dst, 192);
+ src_n += n;
+ if (src_px->a == 255) {
+ src_px += n;
+ do {
+ *dst = MakeTransparent(*dst, 3, 4);
+ dst++;
+ } while (--n != 0);
+ } else {
+ do {
+ *dst = MakeTransparent(*dst, (256 * 4 - src_px->a), 256 * 4);
+ dst++;
+ src_px++;
+ } while (--n != 0);
+ }
break;
default:
- *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+ if (src_px->a == 255) {
+ /* faster than memcpy(), n is usually low */
+ src_n += n;
+ do {
+ *dst++ = *src_px++;
+ } while (--n != 0);
+ } else {
+ src_n += n;
+ do {
+ *dst = ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, *dst);
+ dst++;
+ src_px++;
+ } while (--n != 0);
+ }
break;
}
- dst++;
- src += ScaleByZoom(1, zoom);
}
+
+ dst = dst_ln;
+ src_px = src_px_ln;
+ src_n = src_n_ln;
}
}
-template <BlitterMode mode> inline void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, ZoomLevel zoom)
-{
- switch (zoom) {
- default: NOT_REACHED();
- case ZOOM_LVL_NORMAL: Draw<mode, ZOOM_LVL_NORMAL>(bp); return;
- case ZOOM_LVL_OUT_2X: Draw<mode, ZOOM_LVL_OUT_2X>(bp); return;
- case ZOOM_LVL_OUT_4X: Draw<mode, ZOOM_LVL_OUT_4X>(bp); return;
- case ZOOM_LVL_OUT_8X: Draw<mode, ZOOM_LVL_OUT_8X>(bp); return;
- }
-}
-
+/**
+ * Draws a sprite to a (screen) buffer. Calls adequate templated function.
+ *
+ * @param bp further blitting parameters
+ * @param mode blitter mode
+ * @param zoom zoom level at which we are drawing
+ */
void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
{
switch (mode) {
@@ -87,46 +200,180 @@
}
}
+/**
+ * Resizes the sprite in a very simple way, takes every n-th pixel and every n-th row
+ *
+ * @param sprite_src sprite to resize
+ * @param zoom resizing scale
+ * @return resized sprite
+ */
+static const SpriteLoader::Sprite *ResizeSprite(const SpriteLoader::Sprite *sprite_src, ZoomLevel zoom)
+{
+ SpriteLoader::Sprite *sprite = MallocT<SpriteLoader::Sprite>(1);
+
+ if (zoom == ZOOM_LVL_NORMAL) {
+ memcpy(sprite, sprite_src, sizeof(*sprite));
+ uint size = sprite_src->height * sprite_src->width;
+ sprite->data = MallocT<SpriteLoader::CommonPixel>(size);
+ memcpy(sprite->data, sprite_src->data, size * sizeof(SpriteLoader::CommonPixel));
+ return sprite;
+ }
+
+ sprite->height = UnScaleByZoom(sprite_src->height, zoom);
+ sprite->width = UnScaleByZoom(sprite_src->width, zoom);
+ sprite->x_offs = UnScaleByZoom(sprite_src->x_offs, zoom);
+ sprite->y_offs = UnScaleByZoom(sprite_src->y_offs, zoom);
+
+ uint size = sprite->height * sprite->width;
+ SpriteLoader::CommonPixel *dst = sprite->data = CallocT<SpriteLoader::CommonPixel>(size);
+
+ const SpriteLoader::CommonPixel *src = (SpriteLoader::CommonPixel *)sprite_src->data;
+ const SpriteLoader::CommonPixel *src_end = src + sprite_src->height * sprite_src->width;
+
+ uint scaled_1 = ScaleByZoom(1, zoom);
+
+ for (uint y = 0; y < sprite->height; y++) {
+ if (src >= src_end) src = src_end - sprite_src->width;
+
+ const SpriteLoader::CommonPixel *src_ln = src + sprite_src->width * scaled_1;
+ for (uint x = 0; x < sprite->width; x++) {
+ if (src >= src_ln) src = src_ln - 1;
+ *dst = *src;
+ dst++;
+ src += scaled_1;
+ }
+
+ src = src_ln;
+ }
+
+ return sprite;
+}
+
Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator)
{
- Sprite *dest_sprite;
- SpriteLoader::CommonPixel *dst;
- dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sprite->height * sprite->width * sizeof(SpriteLoader::CommonPixel));
+ /* streams of pixels (a, r, g, b channels)
+ *
+ * stored in separated stream so data are always aligned on 4B boundary */
+ Colour *dst_px_orig[ZOOM_LVL_COUNT];
+
+ /* interleaved stream of 'm' channel and 'n' channel
+ * 'n' is number if following pixels with the same alpha channel class
+ * there are 3 classes: 0, 255, others
+ *
+ * it has to be stored in one stream so fewer registers are used -
+ * x86 has problems with register allocation even with this solution */
+ uint8 *dst_n_orig[ZOOM_LVL_COUNT];
+
+ /* lengths of streams */
+ uint32 lengths[ZOOM_LVL_COUNT][2];
+
+ for (ZoomLevel z = ZOOM_LVL_BEGIN; z < ZOOM_LVL_END; z++) {
+ const SpriteLoader::Sprite *src_orig = ResizeSprite(sprite, z);
+
+ uint size = src_orig->height * src_orig->width;
+
+ dst_px_orig[z] = CallocT<Colour>(size + src_orig->height * 2);
+ dst_n_orig[z] = CallocT<uint8>(size * 2 + src_orig->height * 4 * 2);
+
+ uint32 *dst_px_ln = (uint32 *)dst_px_orig[z];
+ uint32 *dst_n_ln = (uint32 *)dst_n_orig[z];
+
+ const SpriteLoader::CommonPixel *src = (const SpriteLoader::CommonPixel *)src_orig->data;
+
+ for (uint y = src_orig->height; y > 0; y--) {
+ Colour *dst_px = (Colour *)(dst_px_ln + 1);
+ uint8 *dst_n = (uint8 *)(dst_n_ln + 1);
+
+ uint8 *dst_len = dst_n++;
+
+ uint last = 3;
+ int len = 0;
+
+ for (uint x = src_orig->width; x > 0; x--) {
+ uint8 a = src->a;
+ uint t = a > 0 && a < 255 ? 1 : a;
+
+ if (last != t || len == 255) {
+ if (last != 3) {
+ *dst_len = len;
+ dst_len = dst_n++;
+ }
+ len = 0;
+ }
+
+ last = t;
+ len++;
+
+ if (a != 0) {
+ dst_px->a = a;
+ *dst_n = src->m;
+ if (src->m != 0) {
+ /* Pre-convert the mapping channel to a RGB value */
+ uint32 colour = this->LookupColourInPalette(src->m);
+ dst_px->r = GB(colour, 16, 8);
+ dst_px->g = GB(colour, 8, 8);
+ dst_px->b = GB(colour, 0, 8);
+ } else {
+ dst_px->r = src->r;
+ dst_px->g = src->g;
+ dst_px->b = src->b;
+ }
+ dst_px++;
+ dst_n++;
+ } else if (len == 1) {
+ dst_px++;
+ *dst_n = src->m;
+ dst_n++;
+ }
+
+ src++;
+ }
+
+ if (last != 3) {
+ *dst_len = len;
+ }
+
+ dst_px = (Colour *)AlignPtr(dst_px, 4);
+ dst_n = (uint8 *)AlignPtr(dst_n, 4);
+
+ *dst_px_ln = (uint8 *)dst_px - (uint8 *)dst_px_ln;
+ *dst_n_ln = (uint8 *)dst_n - (uint8 *)dst_n_ln;
+
+ dst_px_ln = (uint32 *)dst_px;
+ dst_n_ln = (uint32 *)dst_n;
+ }
+
+ lengths[z][0] = (byte *)dst_px_ln - (byte *)dst_px_orig[z]; // all are aligned to 4B boundary
+ lengths[z][1] = (byte *)dst_n_ln - (byte *)dst_n_orig[z];
+
+ free(src_orig->data);
+ free((void *)src_orig);
+ }
+
+ uint len = 0; // total length of data
+ for (ZoomLevel z = ZOOM_LVL_BEGIN; z < ZOOM_LVL_END; z++) {
+ len += lengths[z][0] + lengths[z][1];
+ }
+
+ Sprite *dest_sprite = (Sprite *)allocator(sizeof(*dest_sprite) + sizeof(SpriteData) + len);
dest_sprite->height = sprite->height;
dest_sprite->width = sprite->width;
dest_sprite->x_offs = sprite->x_offs;
dest_sprite->y_offs = sprite->y_offs;
- dst = (SpriteLoader::CommonPixel *)dest_sprite->data;
-
- memcpy(dst, sprite->data, sprite->height * sprite->width * sizeof(SpriteLoader::CommonPixel));
- /* Skip to the end of the array, and work backwards to find transparent blocks */
- dst = dst + sprite->height * sprite->width - 1;
+ SpriteData *dst = (SpriteData *)dest_sprite->data;
- for (uint y = sprite->height; y > 0; y--) {
- int trans = 0;
- /* Process sprite line backwards, to compute lengths of transparent blocks */
- for (uint x = sprite->width; x > 0; x--) {
- if (dst->a == 0) {
- /* Save transparent block length in red channel; max value is 255 the red channel can contain */
- if (trans < 255) trans++;
- dst->r = trans;
- dst->g = 0;
- dst->b = 0;
- dst->m = 0;
- } else {
- trans = 0;
- if (dst->m != 0) {
- /* Pre-convert the mapping channel to a RGB value */
- uint color = this->LookupColourInPalette(dst->m);
- dst->r = GB(color, 16, 8);
- dst->g = GB(color, 8, 8);
- dst->b = GB(color, 0, 8);
- }
- }
- dst--;
- }
+ for (ZoomLevel z = ZOOM_LVL_BEGIN; z < ZOOM_LVL_END; z++) {
+ dst->offset[z][0] = z == ZOOM_LVL_BEGIN ? 0 : lengths[z - 1][1] + dst->offset[z - 1][1];
+ dst->offset[z][1] = lengths[z][0] + dst->offset[z][0];
+
+ memcpy(dst->data + dst->offset[z][0], dst_px_orig[z], lengths[z][0]);
+ memcpy(dst->data + dst->offset[z][1], dst_n_orig[z], lengths[z][1]);
+
+ free(dst_px_orig[z]);
+ free(dst_n_orig[z]);
}
+
return dest_sprite;
}
--- a/src/blitter/32bpp_optimized.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/32bpp_optimized.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -10,13 +10,17 @@
class Blitter_32bppOptimized : public Blitter_32bppSimple {
public:
+ struct SpriteData {
+ uint32 offset[ZOOM_LVL_COUNT][2];
+ byte data[VARARRAY_SIZE];
+ };
+
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
/* virtual */ Sprite *Encode(SpriteLoader::Sprite *sprite, Blitter::AllocatorProc *allocator);
/* virtual */ const char *GetName() { return "32bpp-optimized"; }
- template <BlitterMode mode, ZoomLevel zoom> void Draw(Blitter::BlitterParams *bp);
- template <BlitterMode mode> void Draw(Blitter::BlitterParams *bp, ZoomLevel zoom);
+ template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
};
class FBlitter_32bppOptimized: public BlitterFactory<FBlitter_32bppOptimized> {
--- a/src/blitter/8bpp_optimized.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/8bpp_optimized.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -71,24 +71,28 @@
/* Skip transparent pixels */
dst += trans;
width -= trans;
- if (width <= 0) continue;
+ if (width <= 0 || pixels == 0) continue;
pixels = min<uint>(pixels, (uint)width);
width -= pixels;
switch (mode) {
- case BM_COLOUR_REMAP:
- for (uint x = 0; x < pixels; x++) {
- if (bp->remap[*src] != 0) *dst = bp->remap[*src];
+ case BM_COLOUR_REMAP: {
+ const uint8 *remap = bp->remap;
+ do {
+ uint m = remap[*src];
+ if (m != 0) *dst = m;
dst++; src++;
- }
- break;
+ } while (--pixels != 0);
+ } break;
- case BM_TRANSPARENT:
- for (uint x = 0; x < pixels; x++) {
- *dst = bp->remap[*dst];
- dst++; src++;
- }
- break;
+ case BM_TRANSPARENT: {
+ const uint8 *remap = bp->remap;
+ src += pixels;
+ do {
+ *dst = remap[*dst];
+ dst++;
+ } while (--pixels != 0);
+ } break;
default:
memcpy(dst, src, pixels);
--- a/src/blitter/factory.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/blitter/factory.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -8,7 +8,6 @@
#include "base.hpp"
#include "../debug.h"
#include "../string_func.h"
-#include <string>
#include <map>
/**
@@ -16,8 +15,16 @@
*/
class BlitterFactoryBase {
private:
- char *name;
- typedef std::map<std::string, BlitterFactoryBase *> Blitters;
+ const char *name;
+
+ struct StringCompare {
+ bool operator () (const char *a, const char *b) const
+ {
+ return strcmp(a, b) < 0;
+ }
+ };
+
+ typedef std::map<const char *, BlitterFactoryBase *, StringCompare> Blitters;
static Blitters &GetBlitters()
{
@@ -58,7 +65,7 @@
if (this->name == NULL) return;
GetBlitters().erase(this->name);
if (GetBlitters().empty()) delete &GetBlitters();
- free(this->name);
+ free((void *)this->name);
}
/**
--- a/src/bridge.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/bridge.h Wed Jul 09 13:32:13 2008 +0000
@@ -44,7 +44,7 @@
void DrawBridgeMiddle(const TileInfo *ti);
-bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len);
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len, uint32 flags = 0);
int CalcBridgeLenCostFactor(int x);
void ResetBridges();
--- a/src/cargopacket.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/cargopacket.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -242,7 +242,7 @@
if (mta == MTA_FINAL_DELIVERY && !tmp.Empty()) {
/* There are some packets that could not be delivered at the station, put them back */
- tmp.MoveTo(this, MAX_UVALUE(uint));
+ tmp.MoveTo(this, UINT_MAX);
tmp.packets.clear();
}
--- a/src/console_cmds.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/console_cmds.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -408,9 +408,9 @@
}
if (ci != NULL) {
+ IConsolePrint(CC_DEFAULT, "Client banned");
banip = GetPlayerIP(ci);
NetworkServerSendError(index, NETWORK_ERROR_KICKED);
- IConsolePrint(CC_DEFAULT, "Client banned");
} else {
IConsolePrint(CC_DEFAULT, "Client not online, banned IP");
}
@@ -1291,15 +1291,16 @@
if (argc != 3) return false;
- if (atoi(argv[1]) < 1 || atoi(argv[1]) > MAX_PLAYERS) {
+ PlayerID player_id = (PlayerID)(atoi(argv[1]) - 1);
+ if (!IsValidPlayer(player_id) || !GetPlayer(player_id)->is_active) {
IConsolePrintF(CC_DEFAULT, "Unknown player. Player range is between 1 and %d.", MAX_PLAYERS);
return true;
}
if (!_network_server) {
- NetworkClientSendChat(NETWORK_ACTION_CHAT_COMPANY, DESTTYPE_TEAM, atoi(argv[1]), argv[2]);
+ NetworkClientSendChat(NETWORK_ACTION_CHAT_COMPANY, DESTTYPE_TEAM, player_id, argv[2]);
} else {
- NetworkServerSendChat(NETWORK_ACTION_CHAT_COMPANY, DESTTYPE_TEAM, atoi(argv[1]), argv[2], NETWORK_SERVER_INDEX);
+ NetworkServerSendChat(NETWORK_ACTION_CHAT_COMPANY, DESTTYPE_TEAM, player_id, argv[2], NETWORK_SERVER_INDEX);
}
return true;
--- a/src/core/alloc_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/alloc_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -24,7 +24,8 @@
* @param num_elements the number of elements to allocate of the given type.
* @return NULL when num_elements == 0, non-NULL otherwise.
*/
-template <typename T> FORCEINLINE T* MallocT(size_t num_elements)
+template <typename T>
+static FORCEINLINE T *MallocT(size_t num_elements)
{
/*
* MorphOS cannot handle 0 elements allocations, or rather that always
@@ -48,7 +49,8 @@
* @param num_elements the number of elements to allocate of the given type.
* @return NULL when num_elements == 0, non-NULL otherwise.
*/
-template <typename T> FORCEINLINE T* CallocT(size_t num_elements)
+template <typename T>
+static FORCEINLINE T *CallocT(size_t num_elements)
{
/*
* MorphOS cannot handle 0 elements allocations, or rather that always
@@ -73,7 +75,8 @@
* @param num_elements the number of elements to allocate of the given type.
* @return NULL when num_elements == 0, non-NULL otherwise.
*/
-template <typename T> FORCEINLINE T* ReallocT(T *t_ptr, size_t num_elements)
+template <typename T>
+static FORCEINLINE T *ReallocT(T *t_ptr, size_t num_elements)
{
/*
* MorphOS cannot handle 0 elements allocations, or rather that always
--- a/src/core/alloc_type.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/alloc_type.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -29,28 +29,39 @@
/** Allocating the memory */
SmallStackSafeStackAlloc() : data(MallocT<T>(length)), len(length) {}
+
/** And freeing when it goes out of scope */
- ~SmallStackSafeStackAlloc() { free(data); }
+ ~SmallStackSafeStackAlloc()
+ {
+ free(data);
+ }
#endif
/**
* Gets a pointer to the data stored in this wrapper.
* @return the pointer.
*/
- inline operator T* () { return data; }
+ FORCEINLINE operator T* ()
+ {
+ return data;
+ }
/**
* Gets a pointer to the data stored in this wrapper.
* @return the pointer.
*/
- inline T* operator -> () { return data; }
+ FORCEINLINE T* operator -> ()
+ {
+ return data;
+ }
/**
* Gets a pointer to the last data element stored in this wrapper.
* @note needed because endof does not work properly for pointers.
* @return the 'endof' pointer.
*/
- inline T* EndOf() {
+ FORCEINLINE T* EndOf()
+ {
#if !defined(__NDS__)
return endof(data);
#else
@@ -74,14 +85,14 @@
* @param size the amount of bytes to allocate.
* @return the given amounts of bytes zeroed.
*/
- void *operator new(size_t size) { return CallocT<byte>(size); }
+ FORCEINLINE void *operator new(size_t size) { return CallocT<byte>(size); }
/**
* Memory allocator for an array of class instances.
* @param size the amount of bytes to allocate.
* @return the given amounts of bytes zeroed.
*/
- void *operator new[](size_t size) { return CallocT<byte>(size); }
+ FORCEINLINE void *operator new[](size_t size) { return CallocT<byte>(size); }
/**
* Memory release for a single class instance.
@@ -91,7 +102,7 @@
* @warning The value of the \a size parameter can only be trusted for
* classes that have their own (virtual) destructor method.
*/
- void operator delete(void *ptr, size_t size) { free(ptr); }
+ FORCEINLINE void operator delete(void *ptr, size_t size) { free(ptr); }
/**
* Memory release for an array of class instances.
@@ -101,7 +112,7 @@
* @warning The value of the \a size parameter can only be trusted for
* classes that have their own (virtual) destructor method.
*/
- void operator delete[](void *ptr, size_t size) { free(ptr); }
+ FORCEINLINE void operator delete[](void *ptr, size_t size) { free(ptr); }
};
#endif /* ALLOC_TYPE_HPP */
--- a/src/core/bitmath_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/bitmath_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -21,7 +21,8 @@
* @param n The number of bits to read.
* @return The selected bits, aligned to a LSB.
*/
-template<typename T> static inline uint GB(const T x, const uint8 s, const uint8 n)
+template <typename T>
+static FORCEINLINE uint GB(const T x, const uint8 s, const uint8 n)
{
return (x >> s) & ((1U << n) - 1);
}
@@ -43,7 +44,8 @@
* @param d The actually new bits to save in the defined position.
* @return The new value of x
*/
-template<typename T, typename U> static inline T SB(T& x, const uint8 s, const uint8 n, const U d)
+template <typename T, typename U>
+static FORCEINLINE T SB(T &x, const uint8 s, const uint8 n, const U d)
{
x &= (T)(~(((1U << n) - 1) << s));
x |= (T)(d << s);
@@ -64,7 +66,8 @@
* @param i The value to add at the given startposition in the given window.
* @return The new value of x
*/
-template<typename T, typename U> static inline T AB(T& x, const uint8 s, const uint8 n, const U i)
+template <typename T, typename U>
+static FORCEINLINE T AB(T &x, const uint8 s, const uint8 n, const U i)
{
const T mask = (T)(((1U << n) - 1) << s);
x = (T)((x & ~mask) | ((x + (i << s)) & mask));
@@ -82,7 +85,8 @@
* @param y The position of the bit to check, started from the LSB
* @return True if the bit is set, false else.
*/
-template<typename T> static inline bool HasBit(const T x, const uint8 y)
+template <typename T>
+static FORCEINLINE bool HasBit(const T x, const uint8 y)
{
return (x & ((T)1U << y)) != 0;
}
@@ -110,7 +114,8 @@
* @param y The bit position to set
* @return The new value of the old value with the bit set
*/
-template<typename T> static inline T SetBit(T& x, const uint8 y)
+template <typename T>
+static FORCEINLINE T SetBit(T &x, const uint8 y)
{
return x = (T)(x | (T)(1U << y));
}
@@ -138,7 +143,8 @@
* @param y The bit position to clear
* @return The new value of the old value with the bit cleared
*/
-template<typename T> static inline T ClrBit(T& x, const uint8 y)
+template <typename T>
+static FORCEINLINE T ClrBit(T &x, const uint8 y)
{
return x = (T)(x & ~((T)1U << y));
}
@@ -166,7 +172,8 @@
* @param y The bit position to toggle
* @return The new value of the old value with the bit toggled
*/
-template<typename T> static inline T ToggleBit(T& x, const uint8 y)
+template <typename T>
+static FORCEINLINE T ToggleBit(T &x, const uint8 y)
{
return x = (T)(x ^ (T)(1U << y));
}
@@ -201,7 +208,7 @@
* @return The position of the first bit which is set
* @see FIND_FIRST_BIT
*/
-static inline uint8 FindFirstBit2x64(const int value)
+static FORCEINLINE uint8 FindFirstBit2x64(const int value)
{
if ((value & 0xFF) == 0) {
return FIND_FIRST_BIT((value >> 8) & 0x3F) + 8;
@@ -223,7 +230,8 @@
* @param value The value to clear the first bit
* @return The new value with the first bit cleared
*/
-template<typename T> static inline T KillFirstBit(T value)
+template <typename T>
+static FORCEINLINE T KillFirstBit(T value)
{
return value &= (T)(value - 1);
}
@@ -234,7 +242,8 @@
* @param value the value to count the number of bits in.
* @return the number of bits.
*/
-template<typename T> static inline uint CountBits(T value)
+template <typename T>
+static inline uint CountBits(T value)
{
uint num;
@@ -258,7 +267,8 @@
* @param n The number how many we waht to rotate
* @return A bit rotated number
*/
-template<typename T> static inline T ROL(const T x, const uint8 n)
+template <typename T>
+static FORCEINLINE T ROL(const T x, const uint8 n)
{
return (T)(x << n | x >> (sizeof(x) * 8 - n));
}
@@ -271,7 +281,8 @@
* @param n The number how many we waht to rotate
* @return A bit rotated number
*/
-template<typename T> static inline T ROR(const T x, const uint8 n)
+template <typename T>
+static FORCEINLINE T ROR(const T x, const uint8 n)
{
return (T)(x >> n | x << (sizeof(x) * 8 - n));
}
@@ -305,7 +316,7 @@
* @param x the variable to bitswap
* @return the bitswapped value.
*/
- static inline uint32 BSWAP32(uint32 x)
+ static FORCEINLINE uint32 BSWAP32(uint32 x)
{
return ((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | ((x << 8) & 0xFF0000) | ((x << 24) & 0xFF000000);
}
@@ -315,7 +326,7 @@
* @param x the variable to bitswap
* @return the bitswapped value.
*/
- static inline uint16 BSWAP16(uint16 x)
+ static FORCEINLINE uint16 BSWAP16(uint16 x)
{
return (x >> 8) | (x << 8);
}
--- a/src/core/endian_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/endian_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -33,12 +33,12 @@
#define TO_LE32X(x) (x)
#endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */
-static inline uint16 ReadLE16Aligned(const void *x)
+static FORCEINLINE uint16 ReadLE16Aligned(const void *x)
{
return FROM_LE16(*(const uint16*)x);
}
-static inline uint16 ReadLE16Unaligned(const void *x)
+static FORCEINLINE uint16 ReadLE16Unaligned(const void *x)
{
#if OTTD_ALIGNMENT == 1
return ((const byte*)x)[0] | ((const byte*)x)[1] << 8;
--- a/src/core/enum_type.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/enum_type.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -73,7 +73,8 @@
template <typename Tenum_t> struct TinyEnumT;
/** The general declaration of TinyEnumT<> (above) */
-template <typename Tenum_t> struct TinyEnumT
+template <typename Tenum_t>
+struct TinyEnumT
{
typedef Tenum_t enum_type; ///< expose our enumeration type (i.e. Trackdir) to outside
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration propeties
--- a/src/core/math_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/math_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -27,7 +27,8 @@
* @param b The second value
* @return The greater value or a if equals
*/
-template<typename T> static inline T max(const T a, const T b)
+template <typename T>
+static FORCEINLINE T max(const T a, const T b)
{
return (a >= b) ? a : b;
}
@@ -42,7 +43,8 @@
* @param b The second value
* @return The smaller value or b if equals
*/
-template<typename T> static inline T min(const T a, const T b)
+template <typename T>
+static FORCEINLINE T min(const T a, const T b)
{
return (a < b) ? a : b;
}
@@ -56,7 +58,7 @@
* @param b The second integer
* @return The smaller value
*/
-static inline int min(const int a, const int b)
+static FORCEINLINE int min(const int a, const int b)
{
return (a < b) ? a : b;
}
@@ -70,7 +72,7 @@
* @param b The second unsigned integer
* @return The smaller value
*/
-static inline uint minu(const uint a, const uint b)
+static FORCEINLINE uint minu(const uint a, const uint b)
{
return (a < b) ? a : b;
}
@@ -82,7 +84,8 @@
* @param a The value we want to unsign
* @return The unsigned value
*/
-template <typename T> static inline T abs(const T a)
+template <typename T>
+static FORCEINLINE T abs(const T a)
{
return (a < (T)0) ? -a : a;
}
@@ -95,10 +98,31 @@
* @param n The base of the number we are searching
* @return The smallest multiple of n equal or greater than x
*/
-template<typename T> static inline T Align(const T x, uint n)
+template <typename T>
+static FORCEINLINE T Align(const T x, uint n)
{
+ assert((n & (n - 1)) == 0 && n != 0);
n--;
- return (T)((x + n) & ~(n));
+ return (T)((x + n) & ~((T)n));
+}
+
+/**
+ * Return the smallest multiple of n equal or greater than x
+ * Applies to pointers only
+ *
+ * @note n must be a power of 2
+ * @param x The min value
+ * @param n The base of the number we are searching
+ * @return The smallest multiple of n equal or greater than x
+ * @see Align()
+ */
+
+assert_compile(sizeof(size_t) == sizeof(void *));
+
+template <typename T>
+static FORCEINLINE T *AlignPtr(T *x, uint n)
+{
+ return (T *)Align((size_t)x, n);
}
/**
@@ -117,7 +141,7 @@
* @returns A value between min and max which is closest to a.
* @see ClampU(uint, uint, uint)
*/
-static inline int Clamp(const int a, const int min, const int max)
+static FORCEINLINE int Clamp(const int a, const int min, const int max)
{
if (a <= min) return min;
if (a >= max) return max;
@@ -140,7 +164,7 @@
* @returns A value between min and max which is closest to a.
* @see Clamp(int, int, int)
*/
-static inline uint ClampU(const uint a, const uint min, const uint max)
+static FORCEINLINE uint ClampU(const uint a, const uint min, const uint max)
{
if (a <= min) return min;
if (a >= max) return max;
@@ -161,7 +185,7 @@
* @return The 64-bit value reduced to a 32-bit value
* @see Clamp(int, int, int)
*/
-static inline int32 ClampToI32(const int64 a)
+static FORCEINLINE int32 ClampToI32(const int64 a)
{
if (a <= INT32_MIN) return INT32_MIN;
if (a >= INT32_MAX) return INT32_MAX;
@@ -175,7 +199,7 @@
* @return The 64-bit value reduced to a 16-bit value
* @see ClampU(uint, uint, uint)
*/
-static inline uint16 ClampToU16(const uint64 a)
+static FORCEINLINE uint16 ClampToU16(const uint64 a)
{
return (uint16)(a <= UINT16_MAX ? a : UINT16_MAX);
}
@@ -187,7 +211,9 @@
* @param b The second scalar
* @return The absolute difference between the given scalars
*/
-template <typename T> static inline T Delta(const T a, const T b) {
+template <typename T>
+static FORCEINLINE T Delta(const T a, const T b)
+{
return (a < b) ? b - a : a - b;
}
@@ -203,7 +229,8 @@
* @param size The size of the interval
* @return True if the value is in the interval, false else.
*/
-template<typename T> static inline bool IsInsideBS(const T x, const uint base, const uint size)
+template <typename T>
+static FORCEINLINE bool IsInsideBS(const T x, const uint base, const uint size)
{
return (uint)(x - base) < size;
}
@@ -218,7 +245,8 @@
* @param max The maximum of the interval
* @see IsInsideBS()
*/
-template<typename T> static inline bool IsInsideMM(const T x, const uint min, const uint max)
+template <typename T>
+static FORCEINLINE bool IsInsideMM(const T x, const uint min, const uint max)
{
return (uint)(x - min) < (max - min);
}
@@ -228,7 +256,8 @@
* @param a variable to swap with b
* @param b variable to swap with a
*/
-template<typename T> void Swap(T& a, T& b)
+template <typename T>
+static FORCEINLINE void Swap(T &a, T &b)
{
T t = a;
a = b;
--- a/src/core/mem_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/mem_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -16,7 +16,7 @@
* @param num number of items to be copied. (!not number of bytes!)
*/
template <typename T>
-FORCEINLINE void MemCpyT(T *destination, const T *source, uint num = 1)
+static FORCEINLINE void MemCpyT(T *destination, const T *source, uint num = 1)
{
memcpy(destination, source, num * sizeof(T));
}
@@ -29,7 +29,7 @@
* @param num number of items to be copied. (!not number of bytes!)
*/
template <typename T>
-FORCEINLINE void MemMoveT(T *destination, const T *source, uint num = 1)
+static FORCEINLINE void MemMoveT(T *destination, const T *source, uint num = 1)
{
memmove(destination, source, num * sizeof(T));
}
@@ -42,7 +42,7 @@
* @param num number of items to be set (!not number of bytes!)
*/
template <typename T>
-FORCEINLINE void MemSetT(T *ptr, int value, uint num = 1)
+static FORCEINLINE void MemSetT(T *ptr, int value, uint num = 1)
{
memset(ptr, value, num * sizeof(T));
}
@@ -56,7 +56,7 @@
* @return an int value indicating the relationship between the content of the two buffers
*/
template <typename T>
-FORCEINLINE int MemCmpT(const T *ptr1, const T *ptr2, uint num = 1)
+static FORCEINLINE int MemCmpT(const T *ptr1, const T *ptr2, uint num = 1)
{
return memcmp(ptr1, ptr2, num * sizeof(T));
}
@@ -69,8 +69,8 @@
* @param ptr1 Start-pointer to the block of memory.
* @param ptr2 End-pointer to the block of memory.
*/
-template<typename T>
-FORCEINLINE void MemReverseT(T *ptr1, T *ptr2)
+template <typename T>
+static FORCEINLINE void MemReverseT(T *ptr1, T *ptr2)
{
assert(ptr1 != NULL && ptr2 != NULL);
assert(ptr1 < ptr2);
@@ -86,8 +86,8 @@
* @param ptr Pointer to the block of memory.
* @param num The number of items we want to reverse.
*/
-template<typename T>
-FORCEINLINE void MemReverseT(T *ptr, uint num)
+template <typename T>
+static FORCEINLINE void MemReverseT(T *ptr, uint num)
{
assert(ptr != NULL);
--- a/src/core/random_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/random_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -59,12 +59,26 @@
#define RandomRange(max) DoRandomRange(max, __LINE__, __FILE__)
uint DoRandomRange(uint max, int line, const char *file);
#else
- static inline uint32 Random() { return _random.Next(); }
- static inline uint32 RandomRange(uint16 max) { return _random.Next(max); }
+ static FORCEINLINE uint32 Random()
+ {
+ return _random.Next();
+ }
+
+ static FORCEINLINE uint32 RandomRange(uint16 max)
+ {
+ return _random.Next(max);
+ }
#endif
-static inline uint32 InteractiveRandom() { return _interactive_random.Next(); }
-static inline uint32 InteractiveRandomRange(uint16 max) { return _interactive_random.Next(max); }
+static FORCEINLINE uint32 InteractiveRandom()
+{
+ return _interactive_random.Next();
+}
+
+static FORCEINLINE uint32 InteractiveRandomRange(uint16 max)
+{
+ return _interactive_random.Next(max);
+}
/**
* Checks if a given randomize-number is below a given probability.
@@ -81,7 +95,7 @@
* @param r The given randomize-number
* @return True if v is less or equals (a/b)
*/
-static inline bool Chance16I(const uint a, const uint b, const uint32 r)
+static FORCEINLINE bool Chance16I(const uint a, const uint b, const uint32 r)
{
assert(b != 0);
return (uint16)r < (uint16)(((a << 16) + b / 2) / b);
@@ -99,7 +113,7 @@
* @param b The denominator of the fraction
* @return True in (a/b) percent
*/
-static inline bool Chance16(const uint a, const uint b)
+static FORCEINLINE bool Chance16(const uint a, const uint b)
{
return Chance16I(a, b, Random());
}
@@ -119,7 +133,7 @@
* @param r The variable to save the randomize-number from Random()
* @return True in (a/b) percent
*/
-static inline bool Chance16R(const uint a, const uint b, uint32 &r)
+static FORCEINLINE bool Chance16R(const uint a, const uint b, uint32 &r)
{
r = Random();
return Chance16I(a, b, r);
--- a/src/core/smallvec_type.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/smallvec_type.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -36,7 +36,7 @@
/**
* Remove all items from the list.
*/
- void Clear()
+ FORCEINLINE void Clear()
{
/* In fact we just reset the item counter avoiding the need to
* probably reallocate the same amount of memory the list was
@@ -47,7 +47,7 @@
/**
* Compact the list down to the smallest block size boundary.
*/
- void Compact()
+ FORCEINLINE void Compact()
{
uint capacity = Align(this->items, S);
if (capacity >= this->capacity) return;
@@ -59,7 +59,7 @@
/**
* Append an item and return it.
*/
- T *Append()
+ FORCEINLINE T *Append()
{
if (this->items == this->capacity) {
this->capacity += S;
@@ -72,7 +72,7 @@
/**
* Get the number of items in the list.
*/
- uint Length() const
+ FORCEINLINE uint Length() const
{
return this->items;
}
@@ -82,7 +82,7 @@
*
* @return the pointer to the first item
*/
- const T *Begin() const
+ FORCEINLINE const T *Begin() const
{
return this->data;
}
@@ -92,7 +92,7 @@
*
* @return the pointer to the first item
*/
- T *Begin()
+ FORCEINLINE T *Begin()
{
return this->data;
}
@@ -102,7 +102,7 @@
*
* @return the pointer behind the last valid item
*/
- const T *End() const
+ FORCEINLINE const T *End() const
{
return &this->data[this->items];
}
@@ -112,7 +112,7 @@
*
* @return the pointer behind the last valid item
*/
- T *End()
+ FORCEINLINE T *End()
{
return &this->data[this->items];
}
@@ -123,7 +123,7 @@
* @param index the position of the item
* @return the pointer to the item
*/
- const T *Get(uint index) const
+ FORCEINLINE const T *Get(uint index) const
{
return &this->data[index];
}
@@ -134,7 +134,7 @@
* @param index the position of the item
* @return the pointer to the item
*/
- T *Get(uint index)
+ FORCEINLINE T *Get(uint index)
{
return &this->data[index];
}
@@ -145,7 +145,7 @@
* @param index the positon of the item
* @return the item
*/
- const T &operator[](uint index) const
+ FORCEINLINE const T &operator[](uint index) const
{
return this->data[index];
}
@@ -156,7 +156,7 @@
* @param index the positon of the item
* @return the item
*/
- T &operator[](uint index)
+ FORCEINLINE T &operator[](uint index)
{
return this->data[index];
}
--- a/src/core/sort_func.hpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/core/sort_func.hpp Wed Jul 09 13:32:13 2008 +0000
@@ -20,8 +20,8 @@
* @param comparator Function that compares two elements.
* @param desc Sort descending.
*/
-template<typename T>
-FORCEINLINE void QSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
+template <typename T>
+static FORCEINLINE void QSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
{
if (num < 2) return;
@@ -44,8 +44,8 @@
* @param comparator Function that compares two elements.
* @param desc Sort descending.
*/
-template<typename T>
-FORCEINLINE void GSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
+template <typename T>
+static inline void GSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
{
if (num < 2) return;
--- a/src/dock_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/dock_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -61,7 +61,7 @@
static void PlaceDocks_BuildCanal(TileIndex tile)
{
- VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_CREATE_WATER);
+ VpStartPlaceSizing(tile, (_game_mode == GM_EDITOR) ? VPM_X_AND_Y : VPM_X_OR_Y, DDSP_CREATE_WATER);
}
static void PlaceDocks_BuildLock(TileIndex tile)
@@ -69,6 +69,11 @@
DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_MSG(STR_CANT_BUILD_LOCKS));
}
+static void PlaceDocks_BuildRiver(TileIndex tile)
+{
+ VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
+}
+
static void PlaceDocks_Aqueduct(TileIndex tile)
{
VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE);
@@ -89,6 +94,7 @@
DTW_DEPOT, ///< Build depot button
DTW_STATION, ///< Build station button
DTW_BUOY, ///< Build buoy button
+ DTW_RIVER, ///< Build river button (in scenario editor)
DTW_BUILD_AQUEDUCT, ///< Build aqueduct button
DTW_END, ///< End of toolbar widgets
};
@@ -96,6 +102,7 @@
static void BuildDocksClick_Canal(Window *w)
{
+
HandlePlacePushButton(w, DTW_CANAL, SPR_CURSOR_CANAL, VHM_RECT, PlaceDocks_BuildCanal);
}
@@ -127,6 +134,12 @@
HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, VHM_RECT, PlaceDocks_Buoy);
}
+static void BuildDocksClick_River(Window *w)
+{
+ if (_game_mode != GM_EDITOR) return;
+ HandlePlacePushButton(w, DTW_RIVER, SPR_CURSOR_RIVER, VHM_RECT, PlaceDocks_BuildRiver);
+}
+
static void BuildDocksClick_Aqueduct(Window *w)
{
HandlePlacePushButton(w, DTW_BUILD_AQUEDUCT, SPR_CURSOR_AQUEDUCT, VHM_RECT, PlaceDocks_Aqueduct);
@@ -142,6 +155,7 @@
BuildDocksClick_Depot,
BuildDocksClick_Dock,
BuildDocksClick_Buoy,
+ BuildDocksClick_River,
BuildDocksClick_Aqueduct
};
@@ -177,8 +191,9 @@
case '4': BuildDocksClick_Depot(this); break;
case '5': BuildDocksClick_Dock(this); break;
case '6': BuildDocksClick_Buoy(this); break;
+ case '7': BuildDocksClick_River(this); break;
case 'B':
- case '7': BuildDocksClick_Aqueduct(this); break;
+ case '8': BuildDocksClick_Aqueduct(this); break;
default: return ES_NOT_HANDLED;
}
return ES_HANDLED;
@@ -207,7 +222,10 @@
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
break;
case DDSP_CREATE_WATER:
- DoCommandP(end_tile, start_tile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
+ DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR ? _ctrl_pressed : 0), CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
+ break;
+ case DDSP_CREATE_RIVER:
+ DoCommandP(end_tile, start_tile, 2, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_PLACE_RIVERS));
break;
default: break;
@@ -233,24 +251,25 @@
};
static const Widget _build_docks_toolb_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // DTW_CLOSEBOX
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 145, 0, 13, STR_9801_DOCK_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // DTW_CAPTION
-{ WWT_STICKYBOX, RESIZE_NONE, 7, 146, 157, 0, 13, 0x0, STR_STICKY_BUTTON}, // DTW_STICKY
-{ WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_BUILD_CANALS_TIP}, // DTW_CANAL
-{ WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, // DTW_LOCK
+{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // DTW_CLOSEBOX
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_9801_WATERWAYS_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // DTW_CAPTION
+{ WWT_STICKYBOX, RESIZE_NONE, 7, 148, 159, 0, 13, 0x0, STR_STICKY_BUTTON}, // DTW_STICKY
+{ WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_BUILD_CANALS_TIP}, // DTW_CANAL
+{ WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, // DTW_LOCK
-{ WWT_PANEL, RESIZE_NONE, 7, 44, 47, 14, 35, 0x0, STR_NULL}, // DTW_SEPERATOR
+{ WWT_PANEL, RESIZE_NONE, 7, 44, 48, 14, 35, 0x0, STR_NULL}, // DTW_SEPERATOR
-{ WWT_IMGBTN, RESIZE_NONE, 7, 48, 69, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // DTW_DEMOLISH
-{ WWT_IMGBTN, RESIZE_NONE, 7, 70, 91, 14, 35, SPR_IMG_SHIP_DEPOT, STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING}, // DTW_DEPOT
-{ WWT_IMGBTN, RESIZE_NONE, 7, 92, 113, 14, 35, SPR_IMG_SHIP_DOCK, STR_981D_BUILD_SHIP_DOCK}, // DTW_STATION
-{ WWT_IMGBTN, RESIZE_NONE, 7, 114, 135, 14, 35, SPR_IMG_BOUY, STR_9834_POSITION_BUOY_WHICH_CAN}, // DTW_BUOY
-{ WWT_IMGBTN, RESIZE_NONE, 7, 136, 157, 14, 35, SPR_IMG_AQUEDUCT, STR_BUILD_AQUEDUCT}, // DTW_BUILD_AQUEDUCT
+{ WWT_IMGBTN, RESIZE_NONE, 7, 49, 70, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // DTW_DEMOLISH
+{ WWT_IMGBTN, RESIZE_NONE, 7, 71, 92, 14, 35, SPR_IMG_SHIP_DEPOT, STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING}, // DTW_DEPOT
+{ WWT_IMGBTN, RESIZE_NONE, 7, 93, 114, 14, 35, SPR_IMG_SHIP_DOCK, STR_981D_BUILD_SHIP_DOCK}, // DTW_STATION
+{ WWT_IMGBTN, RESIZE_NONE, 7, 115, 136, 14, 35, SPR_IMG_BOUY, STR_9834_POSITION_BUOY_WHICH_CAN}, // DTW_BUOY
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_RIVER
+{ WWT_IMGBTN, RESIZE_NONE, 7, 137, 159, 14, 35, SPR_IMG_AQUEDUCT, STR_BUILD_AQUEDUCT}, // DTW_BUILD_AQUEDUCT
{ WIDGETS_END},
};
static const WindowDesc _build_docks_toolbar_desc = {
- WDP_ALIGN_TBR, 22, 158, 36, 158, 36,
+ WDP_ALIGN_TBR, 22, 160, 36, 160, 36,
WC_BUILD_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
_build_docks_toolb_widgets,
@@ -264,6 +283,38 @@
AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER);
}
+/* Widget definition for the build docks in scenario editor window */
+static const Widget _build_docks_scen_toolb_widgets[] = {
+{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // DTW_CLOSEBOX
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 102, 0, 13, STR_9801_WATERWAYS_CONSTRUCTION_SE, STR_018C_WINDOW_TITLE_DRAG_THIS}, // DTW_CAPTION
+{ WWT_STICKYBOX, RESIZE_NONE, 7, 103, 114, 0, 13, 0x0, STR_STICKY_BUTTON}, // DTW_STICKY
+{ WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_CREATE_LAKE}, // DTW_CANAL
+{ WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, // DTW_LOCK
+
+{ WWT_PANEL, RESIZE_NONE, 7, 44, 48, 14, 35, 0x0, STR_NULL}, // DTW_SEPERATOR
+
+{ WWT_IMGBTN, RESIZE_NONE, 7, 49, 70, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // DTW_DEMOLISH
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_DEPOT
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_STATION
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL}, // DTW_BUOY
+{ WWT_IMGBTN, RESIZE_NONE, 7, 71, 92, 14, 35, SPR_IMG_BUILD_RIVER, STR_CREATE_RIVER}, // DTW_RIVER
+{ WWT_IMGBTN, RESIZE_NONE, 7, 93, 114, 14, 35, SPR_IMG_AQUEDUCT, STR_BUILD_AQUEDUCT}, // DTW_BUILD_AQUEDUCT
+{ WIDGETS_END},
+};
+
+/* Window definition for the build docks in scenario editor window */
+static const WindowDesc _build_docks_scen_toolbar_desc = {
+ WDP_AUTO, WDP_AUTO, 115, 36, 115, 36,
+ WC_SCEN_BUILD_TOOLBAR, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+ _build_docks_scen_toolb_widgets,
+};
+
+void ShowBuildDocksScenToolbar()
+{
+ AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_scen_toolbar_desc, TRANSPORT_WATER);
+}
+
struct BuildDocksStationWindow : public PickerWindowBase {
private:
enum BuildDockStationWidgets {
--- a/src/driver.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/driver.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -156,7 +156,9 @@
strecpy(buf, GetDriverTypeName(type), lastof(buf));
strecpy(buf + 5, name, lastof(buf));
- std::pair<Drivers::iterator, bool> P = GetDrivers().insert(Drivers::value_type(buf, this));
+ const char *longname = strdup(buf);
+
+ std::pair<Drivers::iterator, bool> P = GetDrivers().insert(Drivers::value_type(longname, this));
assert(P.second);
}
@@ -194,7 +196,14 @@
strecpy(buf, GetDriverTypeName(type), lastof(buf));
strecpy(buf + 5, this->name, lastof(buf));
- GetDrivers().erase(buf);
+ Drivers::iterator it = GetDrivers().find(buf);
+ assert(it != GetDrivers().end());
+
+ const char *longname = (*it).first;
+
+ GetDrivers().erase(it);
+ free((void *)longname);
+
if (GetDrivers().empty()) delete &GetDrivers();
- free(this->name);
+ free((void *)this->name);
}
--- a/src/driver.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/driver.h Wed Jul 09 13:32:13 2008 +0000
@@ -8,7 +8,6 @@
#include "debug.h"
#include "core/enum_type.hpp"
#include "string_func.h"
-#include <string>
#include <map>
bool GetDriverParamBool(const char * const *parm, const char *name);
@@ -37,9 +36,17 @@
class DriverFactoryBase {
private:
Driver::Type type;
- char *name;
+ const char *name;
int priority;
- typedef std::map<std::string, DriverFactoryBase *> Drivers;
+
+ struct StringCompare {
+ bool operator () (const char *a, const char *b) const
+ {
+ return strcmp(a, b) < 0;
+ }
+ };
+
+ typedef std::map<const char *, DriverFactoryBase *, StringCompare> Drivers;
static Drivers &GetDrivers()
{
--- a/src/economy.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/economy.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -325,7 +325,7 @@
* removing his/her property doesn't fail because of lack of money.
* Not too drastically though, because it could overflow */
if (new_player == PLAYER_SPECTATOR) {
- GetPlayer(old_player)->player_money = MAX_UVALUE(uint64) >> 2; // jackpot ;p
+ GetPlayer(old_player)->player_money = UINT64_MAX >> 2; // jackpot ;p
}
if (new_player == PLAYER_SPECTATOR) {
@@ -1934,7 +1934,7 @@
SLE_CONDVAR(Economy, max_loan_unround, SLE_FILE_I32 | SLE_VAR_I64, 0, 64),
SLE_CONDVAR(Economy, max_loan_unround, SLE_INT64, 65, SL_MAX_VERSION),
SLE_CONDVAR(Economy, max_loan_unround_fract, SLE_UINT16, 70, SL_MAX_VERSION),
- SLE_VAR(Economy, fluct, SLE_FILE_I16 | SLE_VAR_I32),
+ SLE_VAR(Economy, fluct, SLE_INT16),
SLE_VAR(Economy, interest_rate, SLE_UINT8),
SLE_VAR(Economy, infl_amount, SLE_UINT8),
SLE_VAR(Economy, infl_amount_pr, SLE_UINT8),
--- a/src/economy_type.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/economy_type.h Wed Jul 09 13:32:13 2008 +0000
@@ -15,7 +15,7 @@
Money max_loan; ///< Maximum possible loan
Money max_loan_unround; ///< Economy fluctuation status
uint16 max_loan_unround_fract; ///< Fraction of the unrounded max loan
- int fluct;
+ int16 fluct;
byte interest_rate; ///< Interest
byte infl_amount; ///< inflation amount
byte infl_amount_pr; ///< inflation rate for payment rates
--- a/src/elrail.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/elrail.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -495,10 +495,13 @@
}
}
- /* setup total power for trains */
+ /* Fix the total power and acceleration for trains */
FOR_ALL_VEHICLES(v) {
- /* power is cached only for front engines */
- if (v->type == VEH_TRAIN && IsFrontEngine(v)) TrainPowerChanged(v);
+ /* power and acceleration is cached only for front engines */
+ if (v->type == VEH_TRAIN && IsFrontEngine(v)) {
+ TrainPowerChanged(v);
+ UpdateTrainAcceleration(v);
+ }
}
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
--- a/src/engine_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/engine_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -202,7 +202,7 @@
DrawStringMultiCenter(w->width >> 1, 57, STR_NEW_VEHICLE_TYPE, w->width - 2);
dei->engine_proc(w->width >> 1, 88, engine, 0);
- GfxFillRect(25, 56, w->width - 56, 112, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE));
+ GfxFillRect(25, 56, w->width - 56, 112, PALETTE_TO_STRUCT_GREY, FILLRECT_RECOLOR);
dei->info_proc(engine, w->width >> 1, 129, w->width - 52);
}
--- a/src/fileio.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/fileio.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -11,6 +11,7 @@
#include "core/alloc_func.hpp"
#include "core/math_func.hpp"
#include "string_func.h"
+#include "tar_type.h"
#ifdef WIN32
#include <windows.h>
#else
--- a/src/fileio.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/fileio.h Wed Jul 09 13:32:13 2008 +0000
@@ -5,8 +5,6 @@
#ifndef FILEIO_H
#define FILEIO_H
-#include <map>
-#include <string>
#include "core/enum_type.hpp"
void FioSeekTo(size_t pos, int mode);
@@ -64,23 +62,6 @@
extern const char *_searchpaths[NUM_SEARCHPATHS];
/**
- * The define of a TarList.
- */
-struct TarListEntry {
- const char *filename;
- const char *dirname;
-};
-struct TarFileListEntry {
- TarListEntry *tar;
- size_t size;
- size_t position;
-};
-typedef std::map<std::string, TarListEntry *> TarList;
-typedef std::map<std::string, TarFileListEntry> TarFileList;
-extern TarList _tar_list;
-extern TarFileList _tar_filelist;
-
-/**
* Checks whether the given search path is a valid search path
* @param sp the search path to check
* @return true if the search path is valid
@@ -92,10 +73,6 @@
/** Iterator for all the search paths */
#define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp))
-#define FOR_ALL_TARS(tar) for (tar = _tar_filelist.begin(); tar != _tar_filelist.end(); tar++)
-
-typedef bool FioTarFileListCallback(const char *filename, int size, void *userdata);
-FILE *FioTarFileList(const char *tar, const char *mode, size_t *filesize, FioTarFileListCallback *callback, void *userdata);
void FioFCloseFile(FILE *f);
FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR, size_t *filesize = NULL);
--- a/src/genworld_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/genworld_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -473,11 +473,11 @@
EventState state;
this->HandleEditBoxKey(GLAND_RANDOM_EDITBOX, key, keycode, state);
/* the seed is unsigned, therefore atoi cannot be used.
- * As 2^32 - 1 (MAX_UVALUE(uint32)) is a 'magic' value
+ * As 2^32 - 1 (UINT32_MAX) is a 'magic' value
* (use random seed) it should not be possible to be
* entered into the input field; the generate seed
* button can be used instead. */
- _settings_newgame.game_creation.generation_seed = minu(strtoul(this->edit_str_buf, NULL, 10), MAX_UVALUE(uint32) - 1);
+ _settings_newgame.game_creation.generation_seed = minu(strtoul(this->edit_str_buf, NULL, 10), UINT32_MAX - 1);
return state;
}
--- a/src/gfx.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/gfx.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -89,7 +89,21 @@
}
-void GfxFillRect(int left, int top, int right, int bottom, int color)
+/**
+ * Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
+ *
+ * @pre dpi->zoom == ZOOM_LVL_NORMAL, right >= left, bottom >= top
+ * @param left Minimum X (inclusive)
+ * @param top Minimum Y (inclusive)
+ * @param right Maximum X (inclusive)
+ * @param bottom Maximum Y (inclusive)
+ * @param color A 8 bit palette index (FILLRECT_OPAQUE and FILLRECT_CHECKER) or a recolor spritenumber (FILLRECT_RECOLOR)
+ * @param mode
+ * FILLRECT_OPAQUE: Fill the rectangle with the specified color
+ * FILLRECT_CHECKER: Like FILLRECT_OPAQUE, but only draw every second pixel (used to grey out things)
+ * FILLRECT_RECOLOR: Apply a recolor sprite to every pixel in the rectangle currently on screen
+ */
+void GfxFillRect(int left, int top, int right, int bottom, int color, FillRectMode mode)
{
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
const DrawPixelInfo *dpi = _cur_dpi;
@@ -116,18 +130,23 @@
dst = blitter->MoveTo(dpi->dst_ptr, left, top);
- if (!HasBit(color, PALETTE_MODIFIER_GREYOUT)) {
- if (!HasBit(color, USE_COLORTABLE)) {
+ switch (mode) {
+ default: // FILLRECT_OPAQUE
blitter->DrawRect(dst, right, bottom, (uint8)color);
- } else {
+ break;
+
+ case FILLRECT_RECOLOR:
blitter->DrawColorMappingRect(dst, right, bottom, GB(color, 0, PALETTE_WIDTH));
+ break;
+
+ case FILLRECT_CHECKER: {
+ byte bo = (oleft - left + dpi->left + otop - top + dpi->top) & 1;
+ do {
+ for (int i = (bo ^= 1); i < right; i += 2) blitter->SetPixel(dst, i, 0, (uint8)color);
+ dst = blitter->MoveTo(dst, 0, 1);
+ } while (--bottom > 0);
+ break;
}
- } else {
- byte bo = (oleft - left + dpi->left + otop - top + dpi->top) & 1;
- do {
- for (int i = (bo ^= 1); i < right; i += 2) blitter->SetPixel(dst, i, 0, (uint8)color);
- dst = blitter->MoveTo(dst, 0, 1);
- } while (--bottom > 0);
}
}
--- a/src/gfx_func.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/gfx_func.h Wed Jul 09 13:32:13 2008 +0000
@@ -99,7 +99,7 @@
void DrawCharCentered(uint32 c, int x, int y, uint16 color);
-void GfxFillRect(int left, int top, int right, int bottom, int color);
+void GfxFillRect(int left, int top, int right, int bottom, int color, FillRectMode mode = FILLRECT_OPAQUE);
void GfxDrawLine(int left, int top, int right, int bottom, int color);
void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
--- a/src/gfx_type.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/gfx_type.h Wed Jul 09 13:32:13 2008 +0000
@@ -149,7 +149,7 @@
uint8 b, g, r, a; ///< colour channels in LE order
#endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */
- operator uint32 () { return *(uint32 *)this; }
+ operator uint32 () const { return *(uint32 *)this; }
};
enum FontSize {
@@ -216,4 +216,11 @@
IS_PALETTE_COLOR = 0x100, ///< color value is already a real palette color index, not an index of a StringColor
};
+/** Define the operation GfxFillRect performs */
+enum FillRectMode {
+ FILLRECT_OPAQUE, ///< Fill rectangle with a single color
+ FILLRECT_CHECKER, ///< Draw only every second pixel, used for greying-out
+ FILLRECT_RECOLOR, ///< Apply a recolor sprite to the screen content
+};
+
#endif /* GFX_TYPE_H */
--- a/src/gui.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/gui.h Wed Jul 09 13:32:13 2008 +0000
@@ -40,6 +40,7 @@
/* dock_gui.cpp */
void ShowBuildDocksToolbar();
+void ShowBuildDocksScenToolbar();
/* aircraft_gui.cpp */
void ShowBuildAirToolbar();
--- a/src/industry_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/industry_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -963,10 +963,10 @@
/**
* Search callback function for ChopLumberMillTrees
* @param tile to test
- * @param data that is passed by the caller. In this case, nothing
+ * @param user_data that is passed by the caller. In this case, nothing
* @return the result of the test
*/
-static bool SearchLumberMillTrees(TileIndex tile, uint32 data)
+static bool SearchLumberMillTrees(TileIndex tile, void *user_data)
{
if (IsTileType(tile, MP_TREES) && GetTreeGrowth(tile) > 2) { ///< 3 and up means all fully grown trees
PlayerID old_player = _current_player;
@@ -995,7 +995,7 @@
if (!IsIndustryCompleted(tile)) return; ///< Can't proceed if not completed
- if (CircularTileSearch(&tile, 40, SearchLumberMillTrees, 0)) ///< 40x40 tiles to search
+ if (CircularTileSearch(&tile, 40, SearchLumberMillTrees, NULL)) ///< 40x40 tiles to search
i->produced_cargo_waiting[0] = min(0xffff, i->produced_cargo_waiting[0] + 45); ///< Found a tree, add according value to waiting cargo
}
--- a/src/lang/afrikaans.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/afrikaans.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2823,8 +2823,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Kies vrag tipe vir pad voertuig te ontvoer
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Werf konstruksie
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Werf konstruksie
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan nie werf hier bou nie...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Skip Depot
STR_9804_NEW_SHIPS :{BLACK}Nuwe Skepe
--- a/src/lang/brazilian_portuguese.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/brazilian_portuguese.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1292,6 +1292,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Construir eclusas
STR_LANDINFO_LOCK :Eclusa
+STR_CANT_PLACE_RIVERS :{WHITE}Impossível fazer rios aqui...
+STR_LANDINFO_RIVER :Rio
+
STR_BUOY_IS_IN_USE :{WHITE}...bóia está em uso!
STR_LANDINFO_COORDS :{BLACK}Coordenadas: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1944,6 +1947,7 @@
STR_3804_WATER :Água
STR_3805_COAST_OR_RIVERBANK :Costa ou margem
STR_3806_SHIP_DEPOT :Depósito naval
+STR_AQUEDUCT :Aqueduto
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Impossível construir na água
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Deve demolir o canal primeiro
@@ -2663,14 +2667,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Trem no caminho
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Sem parar
STR_ORDER_GO_TO :Vá para
STR_ORDER_GO_NON_STOP_TO :Ir sem parar para
STR_ORDER_GO_VIA :Vá via
STR_ORDER_GO_NON_STOP_VIA :Ir sem parar via
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar qualquer carga
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carregar se disponível
STR_ORDER_DROP_FULL_LOAD_ALL :Carregar tudo
STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente qualquer carga
STR_ORDER_DROP_NO_LOADING :Não carregar
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Descarregar tudo
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Descarregar se aceito
STR_ORDER_DROP_UNLOAD :Descarregar tudo
STR_ORDER_DROP_TRANSFER :Transferir
@@ -2951,8 +2958,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Selecionar tipo de carga para o automóvel
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construir doca
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construir doca
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Impossível construir doca aqui...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Depósito Naval
STR_9804_NEW_SHIPS :{BLACK}Novas Embarcações
@@ -3005,6 +3010,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Cidadãos celebram . . .{} Primeira embarcação chega a {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Posicione a bóia, que pode ser usada para marcar pontos de rota adicionais
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Impossível posicionar bóia aqui...
+STR_BUILD_AQUEDUCT :{BLACK}Construir aqueduto
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Impossível construir aqueduto aqui
STR_9836_RENAME :{BLACK}Renomear
STR_9837_RENAME_SHIP_TYPE :{BLACK}Renomear tipo de embarcação
STR_9838_RENAME_SHIP_TYPE :{WHITE}Renomear tipo de embarcação
@@ -3157,6 +3164,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} requer versão {STRING} ou maior do OpenTTD.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :o arquivo GRF foi designado para tradução
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Muitos NewGRFs foram carregados.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {STRING} como um NewGRF estático em conjunto com {STRING} pode causar desincronias.
STR_NEWGRF_ADD :{BLACK}Adicionar
STR_NEWGRF_ADD_TIP :{BLACK}Adiciona um NewGRF à lista
--- a/src/lang/bulgarian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/bulgarian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -488,6 +488,9 @@
STR_01A5_COST_TO_CLEAR :{BLACK}Цена за изчистване: {LTBLUE}{CURRENCY}
STR_01A6_N_A :Не се предлага
STR_01A7_OWNER :{BLACK}Собственик: {LTBLUE}{STRING}
+STR_ROAD_OWNER :{BLACK}Собственик на шосето: {LTBLUE}{STRING}
+STR_TRAM_OWNER :{BLACK}Собственик на трамваината линиа: {LTBLUE}{STRING}
+STR_RAIL_OWNER :{BLACK}Собственик на железопътната линиа: {LTBLUE}{STRING}
STR_01A8_LOCAL_AUTHORITY :{BLACK}Община: {LTBLUE}{STRING}
STR_01A9_NONE :Нищо
STR_01AA_NAME :{BLACK}Име
@@ -1289,6 +1292,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Строеж на шлюзове
STR_LANDINFO_LOCK :Заключване
+STR_CANT_PLACE_RIVERS :{WHITE}Не можеш да сложиш реката тук...
+STR_LANDINFO_RIVER :Река
+
STR_BUOY_IS_IN_USE :{WHITE}...шамандурата се използва!
STR_LANDINFO_COORDS :{BLACK}Координати: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1713,6 +1719,7 @@
STR_1816_TREE_LINED_ROAD :Асфалтов път с дървета
STR_1817_ROAD_VEHICLE_DEPOT :Авто депо
STR_1818_ROAD_RAIL_LEVEL_CROSSING :ЖП прелез
+STR_TRAMWAY :Трамваи
STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Не може да премахне автогарата...
STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Не може да премахне товарната гара...
STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Пътническата трамвайна гара неможе да бъде премахната...
@@ -2657,14 +2664,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Влак на пътя
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}NБез спирка
STR_ORDER_GO_TO :Отиди до
STR_ORDER_GO_NON_STOP_TO :Отиди без спиране до
STR_ORDER_GO_VIA :Отиди чрез
STR_ORDER_GO_NON_STOP_VIA :Отиди без спиране чрез
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}До пълно товарене на стоката
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Натовари ако е вазможно
STR_ORDER_DROP_FULL_LOAD_ALL :Напълно нотовари всичкиат товар
STR_ORDER_DROP_FULL_LOAD_ANY :Напълно нотовари какъвто и да е товар
STR_ORDER_DROP_NO_LOADING :Ненатаваряй
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Разтовари всичко
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Разтовари ако позволено
STR_ORDER_DROP_UNLOAD :Разтовари взичко
STR_ORDER_DROP_TRANSFER :Смени
@@ -2688,10 +2698,13 @@
STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Промени начинат на разтоваряне на осветената заповед
STR_GO_TO_STATION :{STRING} {STATION} {STRING}
+STR_ORDER_GO_TO_DROPDOWN_TOOLTIP :{BLACK}Вмъкни допълнителна заповед
STR_ORDER_GO_TO_NEAREST_DEPOT :Отиди до най-близкото депо
STR_ORDER_GO_TO_NEAREST_HANGAR :Отиди до най-близкият хангар
STR_ORDER_NEAREST_DEPOT :най-близкото депо
STR_ORDER_NEAREST_HANGAR :най-близкият хангар
+STR_ORDER_SERVICE_AT :Сервиз в
+STR_ORDER_SERVICE_NON_STOP_AT :Сервиз без спиране в
STR_ORDER_TRAIN_DEPOT :Депо за влакове
STR_ORDER_ROAD_DEPOT :Депо за пътни превозни средства
STR_ORDER_SHIP_DEPOT :Депо за кораби
@@ -2699,7 +2712,13 @@
STR_GO_TO_NEAREST_DEPOT :{STRING} {STRING} {STRING}
STR_GO_TO_HANGAR :{STRING} {STATION} хангар
+STR_ORDER_CONDITIONAL :Условна променяща се заповед
+STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Вкарай стойност за сравнение
+STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Процент товарене
+STR_ORDER_CONDITIONAL_RELIABILITY :Надеждност
STR_ORDER_CONDITIONAL_MAX_SPEED :Максимална скорост
+STR_ORDER_CONDITIONAL_AGE :Възраст на превозното средство (години)
+STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Нужен сервиз
STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Винаги
STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :е равно на
STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :не е равно на
@@ -2710,6 +2729,9 @@
STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :е правилно
STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :е неправилно
STR_CONDITIONAL_VALUE :{SKIP}{BLACK}{COMMA}
+STR_CONDITIONAL_UNCONDITIONAL :Премини на заповед {COMMA}
+STR_CONDITIONAL_NUM :Премини на заповед {COMMA} когато {STRING} {STRING} {COMMA}
+STR_CONDITIONAL_TRUE_FALSE :Премини на заповед {COMMA} когато {STRING} {STRING}
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Патувай (без разписание)
STR_TIMETABLE_TRAVEL_FOR :Патувай за {STRING}
@@ -2930,8 +2952,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Избор тип това за автомобила да превозва
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Създаване на Пристанище
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Създаване на Пристанище
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Не може да построиш пристанище тук...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Корабно депо
STR_9804_NEW_SHIPS :{BLACK}Нови Кораби
@@ -2984,6 +3004,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Гражданите празнуват . . .{}Първия кораб пристигнал в {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Поставете шамандура, използва се като отправна точка
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Не може да постави шамандура...
+STR_BUILD_AQUEDUCT :{BLACK}Построй акведукт
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Не може да построиш акведукт тук...
STR_9836_RENAME :{BLACK}Промяна на име
STR_9837_RENAME_SHIP_TYPE :{BLACK}Промяна името на кораб
STR_9838_RENAME_SHIP_TYPE :{WHITE}Промяна името на кораба
@@ -3167,6 +3189,7 @@
STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Липсва GRF файл(ове)
STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Може да счупи OpenTTD. Не пускайте съобщение за грешка за последвали счупвания.{}Желаете ли да се махне паузата?
+
STR_CURRENCY_WINDOW :{WHITE}Парична единица
STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Обменен курс: {ORANGE}{CURRENCY} = £ {COMMA}
STR_CURRENCY_SEPARATOR :{LTBLUE}Разделител:
@@ -3531,3 +3554,8 @@
STR_OSK_KEYBOARD_LAYOUT :`1234567890-.,уеишщксдзц;(ьяаожгтнвмчюйъэфхпрлб
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!?+"%=:/_№ІVыУЕИШЩКСДЗЦ§)ЬЯАОЖГТНВМЧЮЙЪЭФХПРЛБ
########
+
+############ town controlled noise level
+STR_NOISE_IN_TOWN :{BLACK}Лимит на шумът в градът: {ORANGE}{COMMA}{BLACK} най-много: {ORANGE}{COMMA}
+STR_STATION_NOISE :{BLACK}Произведен шум: {GOLD}{COMMA}
+########
--- a/src/lang/catalan.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/catalan.txt Wed Jul 09 13:32:13 2008 +0000
@@ -391,7 +391,7 @@
STR_ENGINE_SORT_CARGO_CAPACITY :Capacitat de càrrega
STR_NO_WAITING_CARGO :{BLACK}No hi ha càrrega d'aquest tipus esperant
STR_SELECT_ALL_FACILITIES :{BLACK}Seleccionar totes les instal·lacions
-STR_SELECT_ALL_TYPES :{BLACK}Selecciona tots els tipus de càrrega (inloent carga sense espera)
+STR_SELECT_ALL_TYPES :{BLACK}Selecciona tots els tipus de càrrega (incloent carga sense espera)
STR_AVAILABLE_TRAINS :{BLACK}Trens Disponibles
STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Vehicles Disponibles
STR_AVAILABLE_SHIPS :{BLACK}Vaixells Disponibles
@@ -1291,6 +1291,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Construeix rescloses
STR_LANDINFO_LOCK :Resclosa
+STR_CANT_PLACE_RIVERS :{WHITE}Aquí no es poden posar rius...
+STR_LANDINFO_RIVER :Riu
+
STR_BUOY_IS_IN_USE :{WHITE}...boia en ús!
STR_LANDINFO_COORDS :{BLACK}Coordenades: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1943,6 +1946,7 @@
STR_3804_WATER :Aigua
STR_3805_COAST_OR_RIVERBANK :Costa o marge de riu
STR_3806_SHIP_DEPOT :Drassana
+STR_AQUEDUCT :Aqüeducte
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...No es pot construir dins l'aigua
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Has de demolir el canal primer
@@ -2662,14 +2666,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Tren en el camí
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Sense parar
STR_ORDER_GO_TO :Ves a
STR_ORDER_GO_NON_STOP_TO :Ves sense parar a
STR_ORDER_GO_VIA :Ves via
STR_ORDER_GO_NON_STOP_VIA :Ves sense parar via
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Càrrega completa de qualsevol càrrega
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carrega si està disponible
STR_ORDER_DROP_FULL_LOAD_ALL :Carrega del tot totes les càrregues
-STR_ORDER_DROP_FULL_LOAD_ANY :Carrega del tot qualsevol càrrega
+STR_ORDER_DROP_FULL_LOAD_ANY :Càrrega completa de qualsevol càrrega
STR_ORDER_DROP_NO_LOADING :No carreguis
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Descarrega tot
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Descarrega si s'accepta
STR_ORDER_DROP_UNLOAD :Descarrega tot
STR_ORDER_DROP_TRANSFER :Transfereix
@@ -2827,7 +2834,7 @@
STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED :{BLACK}Mostra els detalls de càrrega transportada
STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES :{BLACK}Mostra els detalls d'elements del tren
STR_8851_SHOW_CAPACITIES_OF_EACH :{BLACK}Mostra les capacitats de cada element
-STR_SHOW_TOTAL_CARGO :{BLACK}Mostra la capacitat total del tren, separat per tipus de càrrega
+STR_SHOW_TOTAL_CARGO :{BLACK}Mostra la capacitat total del tren, separada per tipus de càrrega
STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Llista d'ordres - clica en una per seleccionar-la
STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}Salta l'ordre actual, i comença la següent. CTRL + clic salta l'ordre seleccionada
STR_8854_DELETE_THE_HIGHLIGHTED :{BLACK}Esborra l'ordre seleccionada
@@ -2950,8 +2957,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Selecciona el tipus de càrrega a transportar pel vehicle
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construcció de Port
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construcció de Port
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Aquí no es pot construir un port...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Drassana
STR_9804_NEW_SHIPS :{BLACK}Nous Vaixells
@@ -3004,6 +3009,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Celebració popular . . .{}El 1er. vaixell arriba a {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Situa boia, que pot ser útil per marques de ruta addicionals
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Aquí no es pot situar una boia...
+STR_BUILD_AQUEDUCT :{BLACK} Construeix aqüeducte
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Aquí no es pot construir un aqüeducte...
STR_9836_RENAME :{BLACK}Reanomena
STR_9837_RENAME_SHIP_TYPE :{BLACK}Reanomena tipus de vaixell
STR_9838_RENAME_SHIP_TYPE :{WHITE}Reanomena tipus de vaixell
@@ -3126,7 +3133,7 @@
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP :{BLACK}El benefici del vehicle amb els menors ingressos (de tots els vehicles més antics de 2 anys)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP :{BLACK}Quantitat de diners fets durant el mes amb el mínim benefici dels darrers 12 trimestres
STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP :{BLACK}Quantitat de diners fets durant el mes amb el màxim benefici dels darrers 12 trimestres
-STR_PERFORMANCE_DETAIL_DELIVERED_TIP :{BLACK}Unitats de càrrega entregada en els darrers quatre trimestres.
+STR_PERFORMANCE_DETAIL_DELIVERED_TIP :{BLACK}Unitats de càrrega entregades en els darrers quatre trimestres.
STR_PERFORMANCE_DETAIL_CARGO_TIP :{BLACK}Tipus de càrrega entregada durant el darrer trimestre.
STR_PERFORMANCE_DETAIL_MONEY_TIP :{BLACK}Quantitats de diners en efectiu
STR_PERFORMANCE_DETAIL_LOAN_TIP :{BLACK}Tens un prèstec elevat?
@@ -3156,6 +3163,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} necessita OpenTTD versió {STRING} o més modern.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :l'arxiu GRF dissenyat està pendent de traduir
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Hi ha massa arxius NewGRF carregats.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregant {STRING} com a NewGRF estàtic amb {STRING} podria causar desincronitzacions.
STR_NEWGRF_ADD :{BLACK}Afegeix
STR_NEWGRF_ADD_TIP :{BLACK}Afegeix un arxiu NewGRF a la llista
--- a/src/lang/croatian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/croatian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1283,6 +1283,7 @@
STR_BUILD_LOCKS_TIP :{BLACK}Izgradi brane
STR_LANDINFO_LOCK :Brana
+
STR_BUOY_IS_IN_USE :{WHITE}...plutača je u uporabi!
STR_LANDINFO_COORDS :{BLACK}Koordinate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1449,6 +1450,8 @@
STR_NETWORK_LANG_SWEDISH :Švedski
STR_NETWORK_LANG_TURKISH :Turski
STR_NETWORK_LANG_UKRAINIAN :Ukrajinski
+STR_NETWORK_LANG_GREEK :Grčki
+STR_NETWORK_LANG_LATVIAN :Latvijski
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Predvorje igre za više igrača
@@ -1697,6 +1700,7 @@
STR_1816_TREE_LINED_ROAD :Cesta s tri trake
STR_1817_ROAD_VEHICLE_DEPOT :Spremište cestovnih vozila
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Prijelaz ceste preko željezničke pruge
+STR_TRAMWAY :Tramvaj
STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nije moguće ukloniti autobusnu stanicu...
STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nije moguće ukloniti kamionsku stanicu...
STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Nije moguće ukloniti putničku tramvajsku stanicu...
@@ -1712,6 +1716,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Najprije moraš srušiti građevinu
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Grad)
STR_2006_POPULATION :{BLACK}Stanovništvo: {ORANGE}{COMMA}{BLACK} Kuće: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Preimenuj grad
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Nije moguće preimenovati grad...
@@ -1921,6 +1926,7 @@
STR_3804_WATER :Voda
STR_3805_COAST_OR_RIVERBANK :Obala ili riječni nasip
STR_3806_SHIP_DEPOT :Spremište brodova
+STR_AQUEDUCT :Akvadukt
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Nije moguće graditi na vodi
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Najprije moraš srušiti kanal
@@ -2854,8 +2860,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Odaberi vrstu tereta koje će cestovno vozilo prevoziti
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Izgradnja pristaništa
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Izgradnja pristaništa
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Ovdje nije moguće izgraditi pristanište...
STR_9803_SHIP_DEPOT :{WHITE} Spremište brodova grada {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Novi brodovi
--- a/src/lang/czech.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/czech.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1082,7 +1082,7 @@
STR_CONFIG_PATCHES_ON :zapnuto
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Ukazovat rychlost vozidla ve stavové liště: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Povolit výstavbu na svazích kopců a na pobřežích: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Úpravy terénu pod budovami, kolejemi atd. (tzv. autoslope): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Srovnání terénu pod budovami, kolejemi atd. (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Povolit u oblasti pokrytí realističtější velikost: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Povolit bourání více městských silnic, mostů, tunelů, atp.: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Povolit stavbu dlouhých vlaků: {ORANGE}{STRING}
@@ -1092,7 +1092,7 @@
STR_CONFIG_PATCHES_IMPROVEDLOAD :{LTBLUE}Použij vylepšený algoritmus nakládání: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GRADUAL_LOADING :{LTBLUE}Nakládat vozidla postupně: {ORANGE}{STRING}
STR_CONFIG_PATCHES_INFLATION :{LTBLUE}Inflace: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Vozit zboží do stanice jen když je poptávka: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Dodávat zboží do stanice jen když je poptávka: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGBRIDGES :{LTBLUE}Povolit stavbu velmi dlouhých mostů: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GOTODEPOT :{LTBLUE}Povolit příkaz 'jeď do depa': {ORANGE}{STRING}
STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Způsob manuálního budování primárního průmyslu: {ORANGE}{STRING}
@@ -1113,7 +1113,7 @@
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Činitel rychlosti letadel: {ORANGE}1/{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Stavba průjezdných zastávek na obecních silnicích: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Povolit stavění přilehlých stanic: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DYNAMIC_ENGINES :{LTBLUE}Více grafických setů s vozidly vedle sebe: {ORANGE}{STRING}
@@ -1126,7 +1126,7 @@
STR_CONFIG_PATCHES_ORDER_REVIEW_ON :ano, u všech vozidel
STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Varovat, pokud vlak prodělává: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Vozidlům se nikdy nezastaví výroba ('nezastarají'): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Automaticky obnovit dopravní prostředek, když je starý
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Automaticky nahradit dopravní prostředek, když zestárne
STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Obnovit vozidlo {ORANGE}{STRING}{LTBLUE} měsíců před / po dosažení maximálního stáří
STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Minimální částka pro automatické obnovení: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Doba zobrazení chybové zprávy: {ORANGE}{STRING}
@@ -1219,7 +1219,7 @@
STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}Zapnout omezení rychlosti vagonů: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}Vypnout elektrickou železnici: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Barevné noviny se objeví: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Barevné noviny se objeví v roce: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}Počáteční datum: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ENDING_YEAR :{LTBLUE}Ukončit hru v roce: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Plynulé změny ekonomiky (více menších změn)
@@ -1229,7 +1229,7 @@
STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI :{LTBLUE}Okno pro stavbu signálů: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Vzor "žádné silnice" se neuplatňuje v editoru scénářů
-STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Vyber vzor městských silnic: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Vzor městských silnic: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS :žádné silnice
STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :původní
STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS :lepší silnice
@@ -1249,9 +1249,9 @@
STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL :normální
STR_CONFIG_PATCHES_TOWN_GROWTH_FAST :rychlá
STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST :velmi rychlá
-STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}1 z {STRING}
-STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}žádné
-STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}Násobitel původní velikosti města: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Podíl měst, ze kterých se stanou velkoměsta: {ORANGE}1 z {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Podíl měst, ze kterých se stanou velkoměsta: {ORANGE}žádné
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}Činitel základní velikosti města: {ORANGE}{STRING}
STR_CONFIG_MODIFIED_ROAD_REBUILD :{LTBLUE}Odstraňovat nesmyslné prvky vozovky při výstavbě silnic
STR_CONFIG_PATCHES_GUI :{BLACK}Ovládaní
@@ -1349,6 +1349,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Stavět zdymadlo
STR_LANDINFO_LOCK :Zdymadlo
+STR_CANT_PLACE_RIVERS :{WHITE}Zde nelze vytvořit řeku...
+STR_LANDINFO_RIVER :Řeka
+
STR_BUOY_IS_IN_USE :{WHITE}... bójka je používána!
STR_LANDINFO_COORDS :{BLACK}Souřadnice: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -2001,6 +2004,7 @@
STR_3804_WATER :Voda
STR_3805_COAST_OR_RIVERBANK :Pobřeží nebo břeh
STR_3806_SHIP_DEPOT :Lodní depo
+STR_AQUEDUCT :Akvadukt
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}... nemohu stavět na vodě
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Nejprve je třeba zničit průplav
@@ -2726,14 +2730,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}V cestě je vlak
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Jet bez zastavení
STR_ORDER_GO_TO :Jet do
STR_ORDER_GO_NON_STOP_TO :Jet bez zastavení do
STR_ORDER_GO_VIA :Jet přes
STR_ORDER_GO_NON_STOP_VIA :Jet bez zastavení přes
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Plně naložit čímkoli
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Pokud možno naložit
STR_ORDER_DROP_FULL_LOAD_ALL :Plně naložit vším
STR_ORDER_DROP_FULL_LOAD_ANY :Plně naložit čímkoli
STR_ORDER_DROP_NO_LOADING :Nenakládat
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Vyložit vše
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Vyložit vyžadovaný náklad
STR_ORDER_DROP_UNLOAD :Vyložit vše
STR_ORDER_DROP_TRANSFER :Přeložit
@@ -3014,8 +3021,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Vyber typ nákladu, který má vozidlo převážet
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Stavba přístavu
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Stavba přístavu
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Zde nelze postavit přístav...
STR_9803_SHIP_DEPOT :{WHITE}Lodní depo {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Nové lodě
@@ -3068,6 +3073,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Obyvatelé oslavují...{}První loď přistála v {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Umístit bójku, kterou lze použít jako navigační bod
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Zde nelze umístit bójku...
+STR_BUILD_AQUEDUCT :{BLACK}Postavit akvadukt
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Tady není možné postavit akvadukt...
STR_9836_RENAME :{BLACK}Přejmenovat
STR_9837_RENAME_SHIP_TYPE :{BLACK}Přejmenovat typ lodi
STR_9838_RENAME_SHIP_TYPE :{WHITE}Přejmenovat typ lodi
--- a/src/lang/danish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/danish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2945,8 +2945,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Vælg lasttype som lastbilen skal transportere
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Havnekonstruktion
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Havnekonstruktion
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan ikke bygge en havn her...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} skibsdok
STR_9804_NEW_SHIPS :{BLACK}Nye skibe
--- a/src/lang/dutch.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/dutch.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1291,6 +1291,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Bouw sluis
STR_LANDINFO_LOCK :Sluis
+STR_CANT_PLACE_RIVERS :{WHITE}Kan hier geen rivier plaatsen...
+STR_LANDINFO_RIVER :Rivier
+
STR_BUOY_IS_IN_USE :{WHITE}... boei is in gebruik!
STR_LANDINFO_COORDS :{BLACK}Coördinaten: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1943,6 +1946,7 @@
STR_3804_WATER :Water
STR_3805_COAST_OR_RIVERBANK :Kust of rivierbed
STR_3806_SHIP_DEPOT :Scheepswerf
+STR_AQUEDUCT :Aquaduct
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Kan niet op water bouwen
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Het kanaal moet eerst verwijderd worden
@@ -2662,14 +2666,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Trein in de weg
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Non-stop
STR_ORDER_GO_TO :Ga naar
STR_ORDER_GO_NON_STOP_TO :Ga non-stop naar
STR_ORDER_GO_VIA :Ga via
STR_ORDER_GO_NON_STOP_VIA :Ga non-stop via
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Alle vracht vol laden
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Laden wanneer beschikbaar
STR_ORDER_DROP_FULL_LOAD_ALL :Volledig laden
STR_ORDER_DROP_FULL_LOAD_ANY :Volledig en stoort vracht laden
STR_ORDER_DROP_NO_LOADING :Niet laden
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Alles lossen
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Ontladen wanneeer geaccepteerd
STR_ORDER_DROP_UNLOAD :Alles ontladen
STR_ORDER_DROP_TRANSFER :Transfer
@@ -2950,8 +2957,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Selecteer welk type vracht het wagen moet vervoeren
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Havenbouw
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Havenbouw
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan hier geen haven bouwen...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Scheepswerf
STR_9804_NEW_SHIPS :{BLACK}Nieuwe schepen
@@ -3004,6 +3009,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Inwoners feesten...{}Eerste schip arriveert in {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Plaats boei, kan gebruikt worden voor extra tussenstops
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Kan boei hier niet plaatsen...
+STR_BUILD_AQUEDUCT :{BLACK}Bouw aquaduct
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Kan hier geen aquaduct bouwen...
STR_9836_RENAME :{BLACK}Hernoem
STR_9837_RENAME_SHIP_TYPE :{BLACK}Hernoem schiptype
STR_9838_RENAME_SHIP_TYPE :{WHITE}Hernoem schiptype
@@ -3156,6 +3163,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} heeft OpenTTD versie {STRING} of beter nodig.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :het GRF bestand is bedoelt voor het vertalen van
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Er zijn teveel NewGRFs geladen.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Laden {STRING} als statisch NewGRF met {STRING} kan desyncs veroorzaken.
STR_NEWGRF_ADD :{BLACK}Toevoegen
STR_NEWGRF_ADD_TIP :{BLACK}Voeg een NewGRF bestand toe aan te lijst
--- a/src/lang/english.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/english.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2959,8 +2959,9 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Select type of cargo for road vehicle to carry
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Dock construction
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Dock construction
+STR_9800_WATERWAYS_CONSTRUCTION :Waterways construction
+STR_9801_WATERWAYS_CONSTRUCTION :{WHITE}Waterways construction
+STR_9801_WATERWAYS_CONSTRUCTION_SE :{WHITE}Waterways
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Can't build dock here...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Ship Depot
STR_9804_NEW_SHIPS :{BLACK}New Ships
--- a/src/lang/english_US.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/english_US.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2834,8 +2834,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Select type of cargo for road vehicle to carry
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Dock construction
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Dock construction
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Can't build dock here...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Ship Depot
STR_9804_NEW_SHIPS :{BLACK}New Ships
--- a/src/lang/esperanto.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/esperanto.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2670,8 +2670,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Elektu portotan ŝarĝon de la vojveturilo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Havenkonstruado
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Havenkonstruado
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Ne povas konstrui havenon ĉi tie...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Ŝipdeponejo
STR_9804_NEW_SHIPS :{BLACK}Novaj Ŝipoj
--- a/src/lang/estonian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/estonian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -3034,8 +3034,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Vali, millist tüüpi laadungit veovahend veab
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Sadamate ehitamine
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Sadama ehitus
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Siia ei saa sadamat ehitada
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Laevaangaar
STR_9804_NEW_SHIPS :{BLACK}Uus laev
--- a/src/lang/finnish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/finnish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2821,8 +2821,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Valitse ajoneuvolla ajettava rahti
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Sataman rakentaminen
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Sataman rakentaminen
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Satamaa ei voi rakentaa tähän...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN}, telakka
STR_9804_NEW_SHIPS :{BLACK}Uusia laivoja
--- a/src/lang/french.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/french.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1292,6 +1292,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Construire des écluses
STR_LANDINFO_LOCK :Ecluse
+STR_CANT_PLACE_RIVERS :{WHITE}Impossible de construire une rivière ici...
+STR_LANDINFO_RIVER :Rivière
+
STR_BUOY_IS_IN_USE :{WHITE}... bouée utilisée !
STR_LANDINFO_COORDS :{BLACK}Coordonnées: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1944,6 +1947,7 @@
STR_3804_WATER :Eau
STR_3805_COAST_OR_RIVERBANK :Rivage ou berge
STR_3806_SHIP_DEPOT :Dépôt naval
+STR_AQUEDUCT :Aqueduc
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Impossible de construire sur l'eau
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Vous devez d'abord détruire le canal
@@ -2663,14 +2667,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Train présent
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Sans arrêt
STR_ORDER_GO_TO :Aller à
STR_ORDER_GO_NON_STOP_TO :Aller sans arrêt à
STR_ORDER_GO_VIA :Passer par
STR_ORDER_GO_NON_STOP_VIA :Passer sans arrêt par
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Chargement complet par un seul type
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Charger si possible
STR_ORDER_DROP_FULL_LOAD_ALL :Chargement complet
STR_ORDER_DROP_FULL_LOAD_ANY :Chargement complet par un seul type
STR_ORDER_DROP_NO_LOADING :Pas de chargement
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Décharger tout
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Décharger si accepté
STR_ORDER_DROP_UNLOAD :Décharger tout
STR_ORDER_DROP_TRANSFER :Transférer
@@ -2951,8 +2958,9 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Choisir le type de cargaison à transporter
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construction Portuaire
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construction Portuaire
+STR_9800_WATERWAYS_CONSTRUCTION :Construction de voies navigables
+STR_9801_WATERWAYS_CONSTRUCTION :{WHITE}Construction de voies navigables
+STR_9801_WATERWAYS_CONSTRUCTION_SE :{WHITE}Voies navigables
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Impossible de construire port ici...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Dépôt naval
STR_9804_NEW_SHIPS :{BLACK}Nouveaux navires
@@ -3005,6 +3013,8 @@
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_BUILD_AQUEDUCT :{BLACK}Construire un aqueduc
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Impossible de construire un aqueduc ici...
STR_9836_RENAME :{BLACK}Renommer
STR_9837_RENAME_SHIP_TYPE :{BLACK}Renommer type de navire
STR_9838_RENAME_SHIP_TYPE :{WHITE}Renommer type de navire
@@ -3157,6 +3167,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} nécessite OpenTTD version {STRING} ou supérieur.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :le fichier GRF qu'il doit traduire
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Trop de NewGRFs sont chargés.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Charger {STRING} comme NewGRF statique avec {STRING} peut provoquer des erreurs de synchronistation.
STR_NEWGRF_ADD :{BLACK}Ajouter
STR_NEWGRF_ADD_TIP :{BLACK}Ajouter un fichier NewGRF à la liste
--- a/src/lang/galician.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/galician.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2607,8 +2607,6 @@
STR_REFIT_ROAD_VEHICLE_CAN_T :{WHITE}Non se pode repara-lo vehículo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construcción de Peiraos
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construcción de Peiraos
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Non se pode construí-lo peirao aí...
STR_9803_SHIP_DEPOT :{WHITE}Depósito de Barcos de {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Novos Barcos
--- a/src/lang/german.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/german.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2856,8 +2856,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Wählen Sie aus, welche Fracht das Straßenfahrzeug transportieren soll
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Hafenanlage bauen
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Hafenanlage bauen
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Hafen kann hier nicht gebaut werden...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Werft
STR_9804_NEW_SHIPS :{BLACK}Neue Schiffe
--- a/src/lang/hungarian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/hungarian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2970,8 +2970,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Válaszd ki a közúti jármű által szállítandó rakományt
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Kikötőépítés
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Kikötőépítés
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Nem építhetsz ide kikötőt...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN}i dokk
STR_9804_NEW_SHIPS :{BLACK}Új hajók
--- a/src/lang/icelandic.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/icelandic.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2943,8 +2943,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Veldu tegund farms sem bifreið mun flytja
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Hafnarframkvæmdir
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Hafnarframkvæmdir
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Get ekki byggt höfn hér...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Slippur
STR_9804_NEW_SHIPS :{BLACK}Ný skip
--- a/src/lang/italian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/italian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1293,6 +1293,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Costruisci chiuse
STR_LANDINFO_LOCK :Chiuse
+STR_CANT_PLACE_RIVERS :{WHITE}Impossibile creare un fiume qui...
+STR_LANDINFO_RIVER :Fiume
+
STR_BUOY_IS_IN_USE :{WHITE}...la boa è in uso!
STR_LANDINFO_COORDS :{BLACK}Coordinate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1945,6 +1948,7 @@
STR_3804_WATER :Acqua
STR_3805_COAST_OR_RIVERBANK :Costa
STR_3806_SHIP_DEPOT :Deposito navale
+STR_AQUEDUCT :Acquedotto
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...impossibile costruire sull'acqua
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Bisogna demolire il canale prima
@@ -2664,14 +2668,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Treno di mezzo
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}No-stop
STR_ORDER_GO_TO :Vai a
STR_ORDER_GO_NON_STOP_TO :Vai no-stop a
STR_ORDER_GO_VIA :Passa per
STR_ORDER_GO_NON_STOP_VIA :Passa no-stop per
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Attendi pieno carico
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carica se possibile
STR_ORDER_DROP_FULL_LOAD_ALL :Attendi pieno carico
STR_ORDER_DROP_FULL_LOAD_ANY :Attendi qualsiasi carico
STR_ORDER_DROP_NO_LOADING :Non caricare
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Scarica tutto
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Scarica se accettato
STR_ORDER_DROP_UNLOAD :Scarica tutto
STR_ORDER_DROP_TRANSFER :Trasferisci
@@ -2952,8 +2959,9 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Selezionare il tipo di carico da far trasportare all'automezzo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Costruzione moli
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Costruzione moli
+STR_9800_WATERWAYS_CONSTRUCTION :Costruisci trasporti su acqua
+STR_9801_WATERWAYS_CONSTRUCTION :{WHITE}Costr. trasporti su acqua
+STR_9801_WATERWAYS_CONSTRUCTION_SE :{WHITE}Trasporti su acqua
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Impossibile costruire il molo qui...
STR_9803_SHIP_DEPOT :{WHITE}Deposito navale di {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Nuove navi
@@ -3006,6 +3014,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}La prima nave attracca a {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Posiziona una boa che può essere usata come waypoint
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Impossibile posizionare una boa qui...
+STR_BUILD_AQUEDUCT :{BLACK}Costruisci acquedotto
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Impossibile costruire un acquedotto qui...
STR_9836_RENAME :{BLACK}Rinomina
STR_9837_RENAME_SHIP_TYPE :{BLACK}Rinomina il tipo di nave
STR_9838_RENAME_SHIP_TYPE :{WHITE}Rinomina tipo di nave
@@ -3158,6 +3168,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} richiede OpenTTD versione {STRING} o superiore.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :il file GRF che era progettato per tradurre
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Troppi file NewGRF caricati.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Caricare {STRING} come NewGRF statico insieme a {STRING} può causare errori di sincronizzazione
STR_NEWGRF_ADD :{BLACK}Aggiungi
STR_NEWGRF_ADD_TIP :{BLACK}Aggiunge un file NewGRF all'elenco
--- a/src/lang/japanese.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/japanese.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2853,8 +2853,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}運送する貨物種類を選択します
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :埠頭の建設
-STR_9801_DOCK_CONSTRUCTION :{WHITE}埠頭の建設
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}ここに埠頭が建設できません...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN}造船所
STR_9804_NEW_SHIPS :{BLACK}新規船舶
--- a/src/lang/korean.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/korean.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2,7 +2,6 @@
##ownname 한국어
##isocode ko_KR
##plural 1
-##gender a b
#
@@ -1047,7 +1046,7 @@
STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}날짜를 일(日)단위까지 상세하게 표시 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_SIGNALSIDE :{LTBLUE}신호등을 통행 방식에 따라 다른 위치에 설치 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_SHOWFINANCES :{LTBLUE}연말에 재정 창을 띄움 : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTD패치에 적합한 급행(논스톱) 처리 : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTD패치에 적합한 직통(논스톱) 처리 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}(획기적 방법으로) 자동차를 대기하게 하기 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}가장자리에 마우스를 가져가면 화면을 움직이게 하기 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}지역 당국에 뇌물을 주는 행위 허용 : {ORANGE}{STRING}
@@ -1292,6 +1291,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}갑문 짓기
STR_LANDINFO_LOCK :갑문
+STR_CANT_PLACE_RIVERS :{WHITE}여기에 강을 만들 수 없습니다...
+STR_LANDINFO_RIVER :강
+
STR_BUOY_IS_IN_USE :{WHITE}...사용중인 부이입니다!
STR_LANDINFO_COORDS :{BLACK}좌표: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1944,6 +1946,7 @@
STR_3804_WATER :물
STR_3805_COAST_OR_RIVERBANK :해안 또는 강기슭
STR_3806_SHIP_DEPOT :정박소
+STR_AQUEDUCT :수도교
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...물 위에 지을 수 없습니다
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}운하를 먼저 제거하십시오
@@ -2663,28 +2666,31 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}중간에 기차가 있습니다
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}통과 설정
STR_ORDER_GO_TO :[운행]
-STR_ORDER_GO_NON_STOP_TO :급행
+STR_ORDER_GO_NON_STOP_TO :직통
STR_ORDER_GO_VIA :경유
STR_ORDER_GO_NON_STOP_VIA :직통 경유
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}적재 옵션
STR_ORDER_DROP_LOAD_IF_POSSIBLE :적재 옵션
STR_ORDER_DROP_FULL_LOAD_ALL :모든 화물을 가득 실음
-STR_ORDER_DROP_FULL_LOAD_ANY :종류에 상관 없이 화물을 가득 실음
+STR_ORDER_DROP_FULL_LOAD_ANY :화물 하나만 가득 실음
STR_ORDER_DROP_NO_LOADING :싣지 않기
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}하차 옵션
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :하차 옵션
STR_ORDER_DROP_UNLOAD :모든 화물 하차
STR_ORDER_DROP_TRANSFER :환승
STR_ORDER_DROP_NO_UNLOADING :화물 하차 않음
STR_ORDER_FULL_LOAD :(가득 실음)
-STR_ORDER_FULL_LOAD_ANY :(종류에 상관 없이 모든 화물 적재)
+STR_ORDER_FULL_LOAD_ANY :(화물 하나만 가득 실음)
STR_ORDER_NO_LOAD :(싣지 않기)
STR_ORDER_UNLOAD :(화물 하차 후 적재)
STR_ORDER_UNLOAD_FULL_LOAD :(화물 하차 후 모든 화물을 싣고 출발)
-STR_ORDER_UNLOAD_FULL_LOAD_ANY :(화물 하차 후 종류에 상관없이 모든 화물 적재)
+STR_ORDER_UNLOAD_FULL_LOAD_ANY :(화물 하차 후 화물 하나만 가득 실음)
STR_ORDER_UNLOAD_NO_LOAD :(화물 하차 후 빈 차로 출발)
STR_ORDER_TRANSFER :(환승 후 화물 받음)
STR_ORDER_TRANSFER_FULL_LOAD :(환승 후 모든 화물 적재)
-STR_ORDER_TRANSFER_FULL_LOAD_ANY :(환승 후 종류에 상관없이 모든 화물 적재)
+STR_ORDER_TRANSFER_FULL_LOAD_ANY :(환승 후 화물 하나만 가득 실음)
STR_ORDER_TRANSFER_NO_LOAD :(환승 후 빈 차로 출발)
STR_ORDER_NO_UNLOAD :(내리지 않고 화물을 받음)
STR_ORDER_NO_UNLOAD_FULL_LOAD :(내리지 않고 가득 찰 때까지 기다림)
@@ -2700,7 +2706,7 @@
STR_ORDER_NEAREST_DEPOT :가까운
STR_ORDER_NEAREST_HANGAR :가까운 격납고
STR_ORDER_SERVICE_AT :[점검]
-STR_ORDER_SERVICE_NON_STOP_AT :[점검, 급행]
+STR_ORDER_SERVICE_NON_STOP_AT :[점검, 직통]
STR_ORDER_TRAIN_DEPOT :차량기지
STR_ORDER_ROAD_DEPOT :차고
STR_ORDER_SHIP_DEPOT :정박소
@@ -2951,8 +2957,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}자동차가 수송할 화물의 종류를 선택하십시오.
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :항만 건설
-STR_9801_DOCK_CONSTRUCTION :{WHITE}항만 건설
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}여기에 항구를 건설할 수 없습니다...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} 정박소
STR_9804_NEW_SHIPS :{BLACK}새 선박
@@ -3005,6 +3009,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}첫 선박이 {STATION}에 도착했습니다!{}시민들이 환호하고 있습니다!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}웨이포인트로 사용할 부이를 설치합니다.
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}여기에 부이를 설치할 수 없습니다...
+STR_BUILD_AQUEDUCT :{BLACK}수도교 짓기
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}여기에 수도교를 지을 수 없습니다...
STR_9836_RENAME :{BLACK}이름 지정
STR_9837_RENAME_SHIP_TYPE :{BLACK}선박 타입의 이름 지정
STR_9838_RENAME_SHIP_TYPE :{WHITE}선박 타입의 이름 지정
--- a/src/lang/lithuanian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/lithuanian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2678,8 +2678,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Nurodykite šios transporto priemonės pervežamą krovinių tipą
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Doku konstrukcija
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Doku konstrukcija
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Neimanoma pastatyti uosto cia...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Laivu depas
STR_9804_NEW_SHIPS :{BLACK}Naujas laivas
--- a/src/lang/norwegian_bokmal.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/norwegian_bokmal.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2837,8 +2837,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Velg en type varer som kjøretøyet skal lastes med
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Bygg havn
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Bygg havn
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan ikke bygge havn her...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} skipsdepot
STR_9804_NEW_SHIPS :{BLACK}Nye skip
--- a/src/lang/norwegian_nynorsk.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/norwegian_nynorsk.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2835,8 +2835,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Vel ein type varer som køyretøyet skal lastast med
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Bygg hamn
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Bygg hamn
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan ikkje byggje hamn her...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} skipsdepot
STR_9804_NEW_SHIPS :{BLACK}Nye skip
--- a/src/lang/piglatin.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/piglatin.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2826,8 +2826,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Electsay ypetay ofway argocay orfay oadray ehiclevay otay arrycay
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Ockday onstructioncay
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Ockday onstructioncay
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}An'tcay uildbay ockday erehay...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Ipshay Epotday
STR_9804_NEW_SHIPS :{BLACK}Ewnay Ipsshay
--- a/src/lang/polish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/polish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2964,8 +2964,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Wybierz ładunek jaki ma przewozić ten samochód
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Konstrukcje portowe
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Konstrukcje portowe
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Nie można tutaj wybudować portu...
STR_9803_SHIP_DEPOT :{WHITE}Stocznia w {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Nowe statki
--- a/src/lang/portuguese.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/portuguese.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2864,8 +2864,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Seleccione o tipo de carga para o veículo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construir docas
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construir docas
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Não é possível construir doca aqui...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Depósito Naval
STR_9804_NEW_SHIPS :{BLACK}Novos Barcos
--- a/src/lang/romanian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/romanian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2935,8 +2935,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Alege tipul de marfă pe care o transportă autovehiculul
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construcţie port
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construcţie port
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Nu pot construi port aici...
STR_9803_SHIP_DEPOT :{WHITE}Şantierul Naval {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Nave noi
--- a/src/lang/russian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/russian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1293,6 +1293,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Построить шлюзы
STR_LANDINFO_LOCK :Шлюз
+STR_CANT_PLACE_RIVERS :{WHITE}Не возможно расположить реку здесь...
+STR_LANDINFO_RIVER :Река
+
STR_BUOY_IS_IN_USE :{WHITE}...этот буй используется!
STR_LANDINFO_COORDS :{BLACK}Координаты: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1945,6 +1948,7 @@
STR_3804_WATER :Вода
STR_3805_COAST_OR_RIVERBANK :Морской или речной берег
STR_3806_SHIP_DEPOT :Верфь
+STR_AQUEDUCT :Акведук
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Невозможно построить на воде
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Сначала надо уничтожить канал
@@ -2675,14 +2679,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Поезд мешает
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Без остановки
STR_ORDER_GO_TO :Идти на
STR_ORDER_GO_NON_STOP_TO :Идти без остановки на
STR_ORDER_GO_VIA :Идти через
STR_ORDER_GO_NON_STOP_VIA :Идти без остановки через
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Полн. загр. любым грузом
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Погрузить если доступно
STR_ORDER_DROP_FULL_LOAD_ALL :Полная загрузка всего груза
STR_ORDER_DROP_FULL_LOAD_ANY :Полная загрузка любым грузом
STR_ORDER_DROP_NO_LOADING :Не грузиться
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Выгрузить все
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Разгузиться если груз принимается
STR_ORDER_DROP_UNLOAD :Выгрузить все
STR_ORDER_DROP_TRANSFER :Передать
@@ -2963,8 +2970,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Выберите тип грузов для перевозки
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Морские коммуникации
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Морские коммуникации
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Невозможно построить пристань здесь...
STR_9803_SHIP_DEPOT :{WHITE}Док {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Новое судно
@@ -3017,6 +3022,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Жители празднуют!{}Первый корабль причалил к {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Буй помогает в навигации, если дистанция большая, исользуйте его как точку маршрута
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Не могу построить буй здесь...
+STR_BUILD_AQUEDUCT :{BLACK}Построить акведук
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Не могу построить акведук здесь...
STR_9836_RENAME :{BLACK}Переимен.
STR_9837_RENAME_SHIP_TYPE :{BLACK}Переименовать
STR_9838_RENAME_SHIP_TYPE :{WHITE}Переименовать
@@ -3169,6 +3176,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} требует OpenTTD версии {STRING} или выше.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :файл GRF, который им переводится.
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Слишком много загружено новой графики
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Загрузка {STRING} в качестве статического NewGRF с {STRING} Может вызвать ошибку синхронизации.
STR_NEWGRF_ADD :{BLACK}Добавить
STR_NEWGRF_ADD_TIP :{BLACK}Добавить файл NewGRF в список
--- a/src/lang/simplified_chinese.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/simplified_chinese.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2689,8 +2689,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}选择要运输的货物类型:
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :新建码头
-STR_9801_DOCK_CONSTRUCTION :{WHITE}新建码头
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}不能在这里新建码头……
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} 船坞
STR_9804_NEW_SHIPS :{BLACK}购买船只
--- a/src/lang/slovak.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/slovak.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2937,8 +2937,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Vyberte požadovaný typ nákladu pre cestné vozidlo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Stavba pristavu
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Stavba pristavu
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Tu nemozno postavit pristav ...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Lodenica
STR_9804_NEW_SHIPS :{BLACK}Nove lode
--- a/src/lang/slovenian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/slovenian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -528,6 +528,9 @@
STR_01A5_COST_TO_CLEAR :{BLACK}Cena za čiščenje: {LTBLUE}{CURRENCY}
STR_01A6_N_A :Ni na voljo
STR_01A7_OWNER :{BLACK}Lastnik: {LTBLUE}{STRING}
+STR_ROAD_OWNER :{BLACK}Lastnik ceste: {LTBLUE}{STRING}
+STR_TRAM_OWNER :{BLACK}Lastnik tramvaj proge: {LTBLUE}{STRING}
+STR_RAIL_OWNER :{BLACK}Lastnik železnice: {LTBLUE}{STRING}
STR_01A8_LOCAL_AUTHORITY :{BLACK}Lokalna oblast: {LTBLUE}{STRING}
STR_01A9_NONE :Brez
STR_01AA_NAME :{BLACK}Ime
@@ -1096,6 +1099,7 @@
STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Faktor hitrosti letal: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Dovoli prehodne postaje na cestah v lasti mest: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Dovoli gradnjo združljivih postaj: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DYNAMIC_ENGINES :{LTBLUE}Omogoči večkratni set NewGRF pogona: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Vedno dovoli majhna letališča: {ORANGE}{STRING}
@@ -1329,6 +1333,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Gradnja zapornic
STR_LANDINFO_LOCK :Zapornica
+STR_CANT_PLACE_RIVERS :{WHITE}Ni mogoča postavitev rek tukaj...
+STR_LANDINFO_RIVER :reka
+
STR_BUOY_IS_IN_USE :{WHITE} ... boja v uporabi!
STR_LANDINFO_COORDS :{BLACK}Koordinate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1755,6 +1762,7 @@
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_TRAMWAY :tramvaj
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...
STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Nemogoča odstranitev potniške tramvaj postaje...
@@ -1981,6 +1989,7 @@
STR_3804_WATER :Voda
STR_3805_COAST_OR_RIVERBANK :Obala ali nabrežje
STR_3806_SHIP_DEPOT :Ladjedelnica
+STR_AQUEDUCT :vodovod
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE} ... Nemogoča gradnja na vodi
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Najprej moraš porušiti kanal
@@ -2737,14 +2746,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Vlak v napoto
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Non-stop
STR_ORDER_GO_TO :Pojdi do
STR_ORDER_GO_NON_STOP_TO :Pojdi non-stop do
STR_ORDER_GO_VIA :Pojdi preko
STR_ORDER_GO_NON_STOP_VIA :Pojdi non-stop preko
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Napolni vse vrste tovora
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Napolni, če je na voljo
STR_ORDER_DROP_FULL_LOAD_ALL :Napolni ves tovor
STR_ORDER_DROP_FULL_LOAD_ANY :Napolni kakršenkoli tovor
STR_ORDER_DROP_NO_LOADING :Brez polnjenja
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Razloži vse
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Razloži, če je sprejeto
STR_ORDER_DROP_UNLOAD :Razloži vse
STR_ORDER_DROP_TRANSFER :Pretovori
@@ -2768,6 +2780,7 @@
STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Spremeni način praznjenja označenega ukaza
STR_GO_TO_STATION :{STRING} {STATION} {STRING}
+STR_ORDER_GO_TO_DROPDOWN_TOOLTIP :{BLACK}Vstavi napreden ukaz
STR_ORDER_GO_TO_NEAREST_DEPOT :Pojdi v najbližjo garažo
STR_ORDER_GO_TO_NEAREST_HANGAR :Pojdi v najbližji hangar
STR_ORDER_NEAREST_DEPOT :najbližjo
@@ -3024,8 +3037,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Izberi tip tovora, ki ga bo vozilo prevažalo
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Gradnja pomola
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Gradnja pomola
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Ni mogoče zgraditi pomola tukaj ...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Ladijska garaža
STR_9804_NEW_SHIPS :{BLACK}Nove ladje
@@ -3078,6 +3089,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Prebivalci praznujejo . . .{}Prva ladja prispela na postajo {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Postavi bojo, ki je lahko uporabljena kot točka poti
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Ni mogoče postaviti boje tukaj ...
+STR_BUILD_AQUEDUCT :{BLACK}Gradnja vodovoda
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Ni mogoča gradnja vodovoda tukaj...
STR_9836_RENAME :{BLACK}Preimenuj
STR_9837_RENAME_SHIP_TYPE :{BLACK}Preimenuj ladjo
STR_9838_RENAME_SHIP_TYPE :{WHITE}Preimenuj ladjo
@@ -3261,6 +3274,8 @@
STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Manjkajoče GRF datoteke
STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Izklop pavze lahko sesuje OpenTTD. Ne poročaj o napaki zaradi takih problemov.{}Zagotovo želiš izklopiti pavzo?
+STR_LOADGAME_REMOVED_TRAMS :{WHITE}Igra je bila shranjena brez podpore za tramvaj. Vsi tramvaji so bili odstranjeni.
+
STR_CURRENCY_WINDOW :{WHITE}Valuta po meri
STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Menjalni tečaj: {ORANGE}{CURRENCY} = £ {COMMA}
STR_CURRENCY_SEPARATOR :{LTBLUE}Ločitev:
@@ -3625,3 +3640,9 @@
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
########
+
+############ town controlled noise level
+STR_CONFIG_PATCHES_NOISE_LEVEL :{LTBLUE}Omogoči mestni nadzor hrupa za letališča: {ORANGE}{STRING}
+STR_NOISE_IN_TOWN :{BLACK}Meja hrupa v mestu: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
+STR_STATION_NOISE :{BLACK}Efektivni hrup: {GOLD}{COMMA}
+########
--- a/src/lang/spanish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/spanish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1292,6 +1292,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Constuir dársenas
STR_LANDINFO_LOCK :Dársena
+STR_CANT_PLACE_RIVERS :{WHITE}No se pueden situar ríos aquí...
+STR_LANDINFO_RIVER :Río
+
STR_BUOY_IS_IN_USE :{WHITE}...boya en uso!
STR_LANDINFO_COORDS :{BLACK}Coordenadas: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1944,6 +1947,7 @@
STR_3804_WATER :Agua
STR_3805_COAST_OR_RIVERBANK :Costa o rivera
STR_3806_SHIP_DEPOT :Astillero
+STR_AQUEDUCT :Acueducto
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...No se puede construir sobre el agua
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Debes demoler el canal primero
@@ -2663,14 +2667,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Tren en camino
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Sin paradas
STR_ORDER_GO_TO :Ir a
STR_ORDER_GO_NON_STOP_TO :Ir sin paradas a
STR_ORDER_GO_VIA :Ir vía
STR_ORDER_GO_NON_STOP_VIA :Ir sin paradas vía
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carga completa de cualquier carga
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Cargar si está disponible
STR_ORDER_DROP_FULL_LOAD_ALL :Carga completa de todas las cargas
STR_ORDER_DROP_FULL_LOAD_ANY :Carga completa de cualquier carga
STR_ORDER_DROP_NO_LOADING :Sin carga
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Descargar todo
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Descargar si es aceptado
STR_ORDER_DROP_UNLOAD :Descargar todo
STR_ORDER_DROP_TRANSFER :Transferir
@@ -2951,8 +2958,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Selecciona tipo de carga que transportará el vehículo de carretera
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Construir muelles
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Construir muelles
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}No se pueden construir muelles aquí...
STR_9803_SHIP_DEPOT :{WHITE}Astillero de {TOWN}
STR_9804_NEW_SHIPS :{BLACK}Nuevos barcos
@@ -3005,6 +3010,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}os ciudadanos celebran . . .{}¡Primer barco llega a {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Boya de posición, que puede usarse como itinerarios adicionales
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}No se puede colocar boya aquí...
+STR_BUILD_AQUEDUCT :{BLACK}Construir acueducto
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}No se puede construir un acueducto aquí
STR_9836_RENAME :{BLACK}Renombrar
STR_9837_RENAME_SHIP_TYPE :{BLACK}Renombrar tipo de barco
STR_9838_RENAME_SHIP_TYPE :{WHITE}Renombrar tipo de barco
@@ -3157,6 +3164,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} requiere OpenTTD versión {STRING} o superior.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :el fichero GRF ha sido diseñado para ser traducido
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRFs han sido cargados.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {STRING} como NewGRF estático con {STRING} puede causar desincronizaciones.
STR_NEWGRF_ADD :{BLACK}Añadir
STR_NEWGRF_ADD_TIP :{BLACK}Añadir un NewGRF a la lista
--- a/src/lang/swedish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/swedish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1291,6 +1291,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Bygg slussar
STR_LANDINFO_LOCK :Sluss
+STR_CANT_PLACE_RIVERS :{WHITE}Kan inte placera flod här...
+STR_LANDINFO_RIVER :Flod
+
STR_BUOY_IS_IN_USE :{WHITE}... bojen används!
STR_LANDINFO_COORDS :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1943,6 +1946,7 @@
STR_3804_WATER :Vatten
STR_3805_COAST_OR_RIVERBANK :Kust eller flodbank
STR_3806_SHIP_DEPOT :Skeppsdepå
+STR_AQUEDUCT :Akvedukt
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Kan inte bygga på vatten
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Måste först ta bort kanalen
@@ -2662,14 +2666,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Tåg i vägen
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Utan uppehåll
STR_ORDER_GO_TO :Åk till
STR_ORDER_GO_NON_STOP_TO :Åk non-stop till
STR_ORDER_GO_VIA :Åk via
STR_ORDER_GO_NON_STOP_VIA :Åk non-stop via
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Full last, vilket gods som helst
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Lasta om möjligt
STR_ORDER_DROP_FULL_LOAD_ALL :Full last alla frakttyper
STR_ORDER_DROP_FULL_LOAD_ANY :Full last någon frakttyp
STR_ORDER_DROP_NO_LOADING :Lasta ej
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Lasta av allt
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Lasta av om accepterat
STR_ORDER_DROP_UNLOAD :Lasta av allt
STR_ORDER_DROP_TRANSFER :Överför
@@ -2950,8 +2957,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Välj lasttyp för fordon
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Hamnbyggnation
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Hamnbyggnation
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Kan inte bygga hamn här...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} skeppsdepå
STR_9804_NEW_SHIPS :{BLACK}Nytt skepp
@@ -3004,6 +3009,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Invånarna firar . . .{}Första skeppet ankommer till {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Positionsboj, som kan som kan användas för ytterligare vägpunkter
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Kan inte placera boj här...
+STR_BUILD_AQUEDUCT :{BLACK}Bygg akvedukt
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Kan inte bygga akvedukt här...
STR_9836_RENAME :{BLACK}Byt namn på
STR_9837_RENAME_SHIP_TYPE :{BLACK}Byt namn på skeppstyp
STR_9838_RENAME_SHIP_TYPE :{WHITE}Byt namn på skeppstyp
--- a/src/lang/traditional_chinese.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/traditional_chinese.txt Wed Jul 09 13:32:13 2008 +0000
@@ -15,8 +15,10 @@
STR_0007_FLAT_LAND_REQUIRED :{WHITE}需要平地
STR_0008_WAITING :{BLACK}等候:{WHITE}{STRING}
STR_0009 :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM :{YELLOW}({SHORTCARGO} 轉送自 {STATION})
STR_000C_ACCEPTS :{BLACK}接受:{WHITE}
STR_000D_ACCEPTS :{BLACK}接受:{GOLD}
+STR_SUPPLIES :{BLACK}供應: {GOLD}
STR_000E :
STR_000F_PASSENGERS :乘客
STR_0010_COAL :煤炭
@@ -166,7 +168,7 @@
STR_00C7_QUIT :{WHITE}離開
STR_00C8_YES :{BLACK}是
STR_00C9_NO :{BLACK}否
-STR_00CA_ARE_YOU_SURE_YOU_WANT_TO :{YELLOW}你要放棄遊戲並回到 {STRING} 嗎?
+STR_00CA_ARE_YOU_SURE_YOU_WANT_TO :{YELLOW}您確定要放棄進行中的遊戲{}返回{STRING}?
STR_00CB_1 :{BLACK}1
STR_00CC_2 :{BLACK}2
STR_00CD_3 :{BLACK}3
@@ -281,12 +283,12 @@
STR_OSNAME_OS2 :OS/2
STR_OSNAME_SUNOS :SunOS
-STR_013B_OWNED_BY :{WHITE}...{STRING} 所有
+STR_013B_OWNED_BY :{WHITE}... 擁有者是 {STRING}
STR_013C_CARGO :{BLACK}貨物
STR_013D_INFORMATION :{BLACK}資訊
-STR_013E_CAPACITIES :{BLACK}載量
+STR_013E_CAPACITIES :{BLACK}容量
STR_TOTAL_CARGO :{BLACK}總貨物量
-STR_013F_CAPACITY :{BLACK}載量:{LTBLUE}{CARGO}
+STR_013F_CAPACITY :{BLACK}容量: {LTBLUE}{CARGO}
STR_CAPACITY_MULT :{BLACK}載量:{LTBLUE}{CARGO} (x{NUM})
STR_TOTAL_CAPACITY_TEXT :{BLACK}此列車的總載量:
STR_TOTAL_CAPACITY :{LTBLUE}- {CARGO} ({SHORTCARGO})
@@ -370,7 +372,7 @@
STR_SORT_BY_NUMBER :編號
STR_SORT_BY_PROFIT_LAST_YEAR :上年盈利
STR_SORT_BY_PROFIT_THIS_YEAR :本年盈利
-STR_SORT_BY_AGE :年齡
+STR_SORT_BY_AGE :使用年數
STR_SORT_BY_RELIABILITY :可靠性
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :總容量,依貨物種類排序
STR_SORT_BY_MAX_SPEED :最高速度
@@ -382,9 +384,9 @@
STR_SORT_BY_RATING_MAX :酬載評價
STR_ENGINE_SORT_ENGINE_ID :引擎編號
STR_ENGINE_SORT_COST :價值
-STR_ENGINE_SORT_POWER :輸出
+STR_ENGINE_SORT_POWER :功率
STR_ENGINE_SORT_INTRO_DATE :登場日期
-STR_ENGINE_SORT_RUNNING_COST :運作費用
+STR_ENGINE_SORT_RUNNING_COST :營運費用
STR_ENGINE_SORT_POWER_VS_RUNNING_COST :功率/營運費用
STR_ENGINE_SORT_CARGO_CAPACITY :載貨量
STR_NO_WAITING_CARGO :{BLACK}沒有任何酬載等候中
@@ -484,6 +486,9 @@
STR_01A5_COST_TO_CLEAR :{BLACK}整地花費:{LTBLUE}{CURRENCY}
STR_01A6_N_A :不適用
STR_01A7_OWNER :{BLACK}擁有人:{LTBLUE}{STRING}
+STR_ROAD_OWNER :{BLACK}道路擁有者: {LTBLUE}{STRING}
+STR_TRAM_OWNER :{BLACK}路面電車軌擁有者: {LTBLUE}{STRING}
+STR_RAIL_OWNER :{BLACK}鐵道擁有者: {LTBLUE}{STRING}
STR_01A8_LOCAL_AUTHORITY :{BLACK}地方政府:{LTBLUE}{STRING}
STR_01A9_NONE :無
STR_01AA_NAME :{BLACK}名稱
@@ -678,51 +683,51 @@
STR_025F_BUBBLE_GENERATOR :{BLACK}泡泡工場
STR_0260_TOFFEE_QUARRY :{BLACK}太妃糖礦場
STR_0261_SUGAR_MINE :{BLACK}砂糖礦場
-STR_0262_CONSTRUCT_COAL_MINE :{BLACK}興建煤礦場
+STR_0262_CONSTRUCT_COAL_MINE :{BLACK}興建煤礦
STR_0263_CONSTRUCT_POWER_STATION :{BLACK}興建發電廠
STR_0264_CONSTRUCT_SAWMILL :{BLACK}興建鋸木廠
-STR_0265_PLANT_FOREST :{BLACK}植林
+STR_0265_PLANT_FOREST :{BLACK}種植森林
STR_0266_CONSTRUCT_OIL_REFINERY :{BLACK}興建煉油廠
-STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY :{BLACK}興建油井 (只能在地圖邊緣興建)
+STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY :{BLACK}興建鑽油平台 (只能建在地圖邊緣)
STR_0268_CONSTRUCT_FACTORY :{BLACK}興建工廠
-STR_0269_CONSTRUCT_STEEL_MILL :{BLACK}興建鋼廠
+STR_0269_CONSTRUCT_STEEL_MILL :{BLACK}興建煉鋼廠
STR_026A_CONSTRUCT_FARM :{BLACK}興建農場
-STR_026B_CONSTRUCT_IRON_ORE_MINE :{BLACK}興建鐵礦場
+STR_026B_CONSTRUCT_IRON_ORE_MINE :{BLACK}興建鐵礦
STR_026C_CONSTRUCT_OIL_WELLS :{BLACK}興建油井
-STR_026D_CONSTRUCT_BANK_CAN_ONLY :{BLACK}開設銀行 (只能在人口高於 1200 的市鎮內開設)
+STR_026D_CONSTRUCT_BANK_CAN_ONLY :{BLACK}興建銀行 (只能建在1200人以上的城鎮)
STR_026E_CONSTRUCT_PAPER_MILL :{BLACK}興建造紙廠
-STR_026F_CONSTRUCT_FOOD_PROCESSING :{BLACK}興建食物加工廠
+STR_026F_CONSTRUCT_FOOD_PROCESSING :{BLACK}興建食物處理廠
STR_0270_CONSTRUCT_PRINTING_WORKS :{BLACK}興建印刷廠
-STR_0271_CONSTRUCT_GOLD_MINE :{BLACK}興建金礦場
-STR_0272_CONSTRUCT_BANK_CAN_ONLY :{BLACK}開設銀行 (只能在市鎮內開設)
-STR_0273_CONSTRUCT_LUMBER_MILL_TO :{BLACK}興建鋸木廠 (砍伐雨林出產木材)
+STR_0271_CONSTRUCT_GOLD_MINE :{BLACK}興建金礦
+STR_0272_CONSTRUCT_BANK_CAN_ONLY :{BLACK}興建銀行 (只能建在城鎮裡)
+STR_0273_CONSTRUCT_LUMBER_MILL_TO :{BLACK}興建鋸木場 (清除雨林製造木材)
STR_0274_PLANT_FRUIT_PLANTATION :{BLACK}種植蔬果園
-STR_0275_PLANT_RUBBER_PLANTATION :{BLACK}種植橡膠樹林
-STR_0276_CONSTRUCT_WATER_SUPPLY :{BLACK}興建供水站
-STR_0277_CONSTRUCT_WATER_TOWER_CAN :{BLACK}興建儲水塔 (只能在市鎮內興建)
-STR_0278_CONSTRUCT_DIAMOND_MINE :{BLACK}興建鑽石礦場
-STR_0279_CONSTRUCT_COPPER_ORE_MINE :{BLACK}興建銅礦場
+STR_0275_PLANT_RUBBER_PLANTATION :{BLACK}種植橡膠樹園
+STR_0276_CONSTRUCT_WATER_SUPPLY :{BLACK}興建供水場
+STR_0277_CONSTRUCT_WATER_TOWER_CAN :{BLACK}興建水塔 (只能建在城鎮裡)
+STR_0278_CONSTRUCT_DIAMOND_MINE :{BLACK}興建鑽石礦
+STR_0279_CONSTRUCT_COPPER_ORE_MINE :{BLACK}興建銅礦
STR_027A_PLANT_COTTON_CANDY_FOREST :{BLACK}種植棉花糖森林
STR_027B_CONSTRUCT_CANDY_FACTORY :{BLACK}興建糖果工廠
STR_027C_CONSTRUCT_BATTERY_FARM :{BLACK}興建電池農場
STR_027D_CONSTRUCT_COLA_WELLS :{BLACK}興建可樂井
-STR_027E_CONSTRUCT_TOY_SHOP :{BLACK}設立玩具店
+STR_027E_CONSTRUCT_TOY_SHOP :{BLACK}興建玩具店
STR_027F_CONSTRUCT_TOY_FACTORY :{BLACK}興建玩具工廠
STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS :{BLACK}興建塑膠噴泉
STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY :{BLACK}興建汽水工廠
STR_0282_CONSTRUCT_BUBBLE_GENERATOR :{BLACK}興建泡泡產生器
STR_0283_CONSTRUCT_TOFFEE_QUARRY :{BLACK}興建太妃糖礦場
-STR_0284_CONSTRUCT_SUGAR_MINE :{BLACK}興建砂糖礦場
+STR_0284_CONSTRUCT_SUGAR_MINE :{BLACK}興建糖礦
STR_0285_CAN_T_BUILD_HERE :{WHITE}不能在這裡建造 {STRING} ...
-STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...先要建造市鎮
+STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...應先建造市鎮
STR_0287_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}...每個市鎮僅允許一個
STR_0288_PLANT_TREES :{BLACK}植樹
STR_0289_PLACE_SIGN :{BLACK}設置標誌
STR_028A_RANDOM_TREES :{BLACK}隨機樹種
STR_028B_PLANT_TREES_RANDOMLY_OVER :{BLACK}在場景上隨機植樹
STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}在場景上產生岩石區
-STR_028D_PLACE_LIGHTHOUSE :{BLACK}建立燈塔
-STR_028E_PLACE_TRANSMITTER :{BLACK}建立發射站
+STR_028D_PLACE_LIGHTHOUSE :{BLACK}放置燈塔
+STR_028E_PLACE_TRANSMITTER :{BLACK}放置天線塔
STR_028F_DEFINE_DESERT_AREA :{BLACK}定義沙漠區。{}請按住 CTRL 移除
STR_CREATE_LAKE :{BLACK}劃出湖泊範圍。{}開鑿運河。在海平面上按 CTRL 鍵則會淹沒週遭土地
STR_CREATE_RIVER :{BLACK}劃出河流範圍
@@ -743,7 +748,7 @@
STR_QUIT_SCENARIO_QUERY :{YELLOW}你要離開這個場景嗎?
STR_029C_QUIT_EDITOR :{WHITE}離開編輯器
STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...只能在市鎮人口超過 1200 人的地方建造
-STR_029E_MOVE_THE_STARTING_DATE :{BLACK}將開始時間提早一年
+STR_029E_MOVE_THE_STARTING_DATE :{BLACK}將開始時間往前 1 年
STR_029F_MOVE_THE_STARTING_DATE :{BLACK}將開始時間往後一年
STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}...橋樑的兩端應該在陸地上
STR_02A1_SMALL :{BLACK}小型
@@ -810,9 +815,9 @@
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}將主視野移到視窗視野
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}將主視野移到這個視窗的視野位置
-STR_02E0_CURRENCY_UNITS :{BLACK}貨幣單位
+STR_02E0_CURRENCY_UNITS :{BLACK}幣值單位
STR_02E1 :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}選擇貨幣單位
+STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}選擇幣值單位
STR_MEASURING_UNITS :{BLACK}度量單位
STR_02E4 :{BLACK}{SKIP}{SKIP}{STRING}
STR_MEASURING_UNITS_SELECTION :{BLACK}度量單位
@@ -834,7 +839,7 @@
STR_02FA_EVERY_12_MONTHS :每十二個月
STR_02FB_START_A_NEW_GAME :{BLACK}開始新遊戲
STR_02FC_LOAD_A_SAVED_GAME :{BLACK}載入舊遊戲
-STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}建立自訂遊戲場景
+STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}建立自訂遊戲世界/劇本
STR_02FF_SELECT_SINGLE_PLAYER_GAME :{BLACK}選擇單人單機遊戲
STR_0300_SELECT_MULTIPLAYER_GAME :{BLACK}選擇 2 ~ 8 人的連線遊戲
STR_0301_DISPLAY_GAME_OPTIONS :{BLACK}顯示遊戲選項
@@ -961,8 +966,8 @@
STR_MONTH_NOV :十一月
STR_MONTH_DEC :十二月
-STR_HEADING_FOR_STATION :{LTBLUE}目的地:{STATION}
-STR_HEADING_FOR_STATION_VEL :{LTBLUE}目的地:{STATION},{VELOCITY}
+STR_HEADING_FOR_STATION :{LTBLUE}正前往: {STATION}
+STR_HEADING_FOR_STATION_VEL :{LTBLUE}正前往: {STATION}, {VELOCITY}
STR_NO_ORDERS :{LTBLUE}沒有指令
STR_NO_ORDERS_VEL :{LTBLUE}沒有指令, {VELOCITY}
@@ -1011,7 +1016,7 @@
STR_AIRCRAFT_AUTORENEW_FAILED :{WHITE}飛機 {COMMA}自動翻新失敗 (金錢限制)
STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}置換後列車 {COMMA} 過長
-STR_CONFIG_PATCHES :{BLACK}設置修正
+STR_CONFIG_PATCHES :{BLACK}設定補綴
STR_CONFIG_PATCHES_TIP :{BLACK}設置修正選項
STR_CONFIG_PATCHES_CAPTION :{WHITE}設置修正
@@ -1052,6 +1057,7 @@
STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}飛機速度比例:{ORANGE}{STRING} 分之一
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}可在鎮內興建路邊車站:{ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}容許興建相鄰車站: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DYNAMIC_ENGINES :{LTBLUE}允許載入多重 NewGRF 車輛組: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}永遠可以興建小型機場:{ORANGE}{STRING}
@@ -1064,7 +1070,7 @@
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}運輸工具永遠不會過期:{ORANGE}{STRING}
STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}運輸工具自動翻新
STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}當運具在使用年限 {ORANGE}{STRING}{LTBLUE} 個月前/後自動更新
-STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}自動翻新最低費用:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}自動翻新所需最低餘額: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}錯誤訊息顯示時間:{ORANGE}{STRING}
STR_CONFIG_PATCHES_POPULATION_IN_LABEL :{LTBLUE}於標籤顯示市鎮人口:{ORANGE}{STRING}
@@ -1133,35 +1139,35 @@
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}每位玩家可擁有列車數目:{ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}每位玩家可擁有車輛數目:{ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_AIRCRAFT :{LTBLUE}每位玩家可擁有飛機數目:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_SHIPS :{LTBLUE}每位玩家可擁有船舶數目:{ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_AI_BUILDS_TRAINS :{LTBLUE}電腦不可擁有列車:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH :{LTBLUE}電腦不可擁有路面車輛:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT :{LTBLUE}電腦不可擁有飛機:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_SHIPS :{LTBLUE}電腦不可擁有飛機:{ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}使用新人工智能 (開發階段):{ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER :{LTBLUE}可於連線遊戲加入電腦對手 (測試階段):{ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_SHIPS :{LTBLUE}每位玩家可擁有船舶數目: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}列車預設檢修頻率:{ORANGE}{STRING} 日/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}列車預設檢修頻率:{ORANGE}關閉
-STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}路面車輛預設檢修頻率:{ORANGE}{STRING} 日/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}路面車輛預設檢修頻率:{ORANGE}關閉
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}飛機預設檢修頻率:{ORANGE}{STRING} 日/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}飛機預設檢修頻率:{ORANGE}關閉
-STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}船隻預設檢修頻率:{ORANGE}{STRING} 日/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}船隻預設檢修頻率:{ORANGE}關閉
-STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}當故障關閉時不作定期檢查維修:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}載具速度限制:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}電氣化鐵路:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_TRAINS :{LTBLUE}不允許電腦使用鐵道: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH :{LTBLUE}不允許電腦使用汽車: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT :{LTBLUE}不允許電腦使用飛機: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_SHIPS :{LTBLUE}不允許電腦使用船舶: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}彩色報紙出現於:{ORANGE}{STRING} 年
-STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}開始時間:{ORANGE}{STRING} 年
-STR_CONFIG_PATCHES_ENDING_YEAR :{LTBLUE}終結遊戲年份:{ORANGE}{STRING} 年
-STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}平滑經濟模式 (更多而小的變化)
-STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}可以從對手購入股份
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}拖放時訊號燈之間距離:{ORANGE}{STRING} 格
-STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}於日期前自動建立舊式號誌臂:{ORANGE}{STRING}年
+STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}起動新 AI (早期測試中): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER :{LTBLUE}允許多人連線時使用 AI (實驗中): {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}列車預設維護間隔: {ORANGE}{STRING} 天/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}列車預設維護間隔: {ORANGE}關閉
+STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}汽車預設維護間隔: {ORANGE}{STRING} 天/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}汽車預設維護間隔: {ORANGE}關閉
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}飛機預設維護間隔: {ORANGE}{STRING} 天/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}飛機預設維護間隔: {ORANGE}關閉
+STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}船舶預設維護間隔: {ORANGE}{STRING} 天/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}船舶預設維護間隔: {ORANGE}關閉
+STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}關閉運具故障之後也不自動維護: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}起動列車車廂速限: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}關閉電氣化鐵道: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}彩色報紙登場年份: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}開始年份: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENDING_YEAR :{LTBLUE}遊戲結束年份: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}起動平順經濟 (更多、更小變動)
+STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}允許購買其它公司的股票
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}拖拉時每隔: {ORANGE}{STRING} 格自動建造號誌
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}自動在指定年份前建造臂木號誌: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI :{LTBLUE}啟用號誌介面:{ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}在場景編輯器中,"市鎮道路不再規劃" 是不可行的
@@ -1173,12 +1179,12 @@
STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID :3乘3網格
STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM :隨機
-STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}主工具列位置:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}主工具列位置: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :左
-STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :中
+STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :中央
STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT :右
-STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}視窗自動黏貼範圍:{ORANGE}{STRING} 像素
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED :{LTBLUE}視窗自動黏貼範圍:{ORANGE}關閉
+STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}視窗黏接距離: {ORANGE}{STRING} px
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED :{LTBLUE}視窗黏接距離: {ORANGE}關閉
STR_CONFIG_PATCHES_TOWN_GROWTH :{LTBLUE}城市增長速度: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_GROWTH_NONE :不會增長
STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW :慢
@@ -1191,18 +1197,18 @@
STR_CONFIG_MODIFIED_ROAD_REBUILD :{LTBLUE}在鋪設道路時移除不合理的路面
STR_CONFIG_PATCHES_GUI :{BLACK}介面
-STR_CONFIG_PATCHES_CONSTRUCTION :{BLACK}建築
-STR_CONFIG_PATCHES_VEHICLES :{BLACK}運輸工具
+STR_CONFIG_PATCHES_CONSTRUCTION :{BLACK}建造
+STR_CONFIG_PATCHES_VEHICLES :{BLACK}運具
STR_CONFIG_PATCHES_STATIONS :{BLACK}車站
STR_CONFIG_PATCHES_ECONOMY :{BLACK}經濟
-STR_CONFIG_PATCHES_AI :{BLACK}對手
+STR_CONFIG_PATCHES_AI :{BLACK}競爭對手
-STR_CONFIG_PATCHES_DISABLED :關
+STR_CONFIG_PATCHES_DISABLED :關閉
STR_CONFIG_PATCHES_INT32 :{NUM}
STR_CONFIG_PATCHES_CURRENCY :{CURRENCY}
-STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}改變設定值
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}以下預設檢修期與揀選項目不相容! 合法設定為 5-90% 或 30-800 日
+STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}修改設定值
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}下面有些預設維護間隔與選定的設定不相容!5-90% 與 30-800 天是允許範圍
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}列車的路徑搜尋方式:{ORANGE}{STRING}
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(不建議)
@@ -1218,78 +1224,79 @@
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(不建議)
STR_TEMPERATE_LANDSCAPE :溫帶
-STR_SUB_ARCTIC_LANDSCAPE :亞北極帶
+STR_SUB_ARCTIC_LANDSCAPE :寒帶
STR_SUB_TROPICAL_LANDSCAPE :亞熱帶
STR_TOYLAND_LANDSCAPE :玩具世界
STR_CHEATS :{WHITE}作弊
-STR_CHEATS_TIP :{BLACK}被勾選的項目表示你之前用過這個作弊
-STR_CHEATS_WARNING :{BLACK}注意! 你要背叛你的對手喔! 你要記住這種行為會被一輩子記著的。
+STR_CHEATS_TIP :{BLACK}勾選代表您用過這個密技
+STR_CHEATS_WARNING :{BLACK}警告!您正準備背叛競爭對手。請記得這種恥辱將永傳不朽。
STR_CHEAT_MONEY :{LTBLUE}增加金錢:{CURRENCY}
-STR_CHEAT_CHANGE_PLAYER :{LTBLUE}控制玩家:{ORANGE}{COMMA}
-STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}神奇剷泥車 (可以移除工業等平時拆不掉的東西):{ORANGE}{STRING}
-STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}隧道可以互相穿過:{ORANGE}{STRING}
-STR_CHEAT_BUILD_IN_PAUSE :{LTBLUE}於暫停模式建設:{ORANGE}{STRING}
-STR_CHEAT_NO_JETCRASH :{LTBLUE}噴射客機不會經常於小型機場失事:{ORANGE} {STRING}
-STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}改變氣候:{ORANGE} {STRING}
-STR_CHEAT_CHANGE_DATE :{LTBLUE}改變日期:{ORANGE} {DATE_SHORT}
-STR_CHEAT_SETUP_PROD :{LTBLUE}可改變產量:{ORANGE}{STRING}
+STR_CHEAT_CHANGE_PLAYER :{LTBLUE}切換玩家身分: {ORANGE}{COMMA}
+STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}無敵推土機 (可摧毀工業、所有東西): {ORANGE}{STRING}
+STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}允許隧道交叉: {ORANGE}{STRING}
+STR_CHEAT_BUILD_IN_PAUSE :{LTBLUE}在暫停時建造: {ORANGE}{STRING}
+STR_CHEAT_NO_JETCRASH :{LTBLUE}噴射機不會 (經常) 墜毀在小機場: {ORANGE} {STRING}
+STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}切換場景類型: {ORANGE} {STRING}
+STR_CHEAT_CHANGE_DATE :{LTBLUE}修改日期: {ORANGE} {DATE_SHORT}
+STR_CHEAT_SETUP_PROD :{LTBLUE}允許修改產量: {ORANGE}{STRING}
-STR_HEADING_FOR_WAYPOINT :{LTBLUE}目的地:{WAYPOINT}
-STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}目的地:{WAYPOINT},{VELOCITY}
-
-STR_GO_TO_WAYPOINT :經 {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT :經 {WAYPOINT},中途不停
+STR_HEADING_FOR_WAYPOINT :{LTBLUE}正前往 {WAYPOINT}
+STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正前往 {WAYPOINT}, {VELOCITY}
-STR_WAYPOINTNAME_CITY :路標 {TOWN}
-STR_WAYPOINTNAME_CITY_SERIAL :路標 {TOWN} #{COMMA}
-STR_LANDINFO_WAYPOINT :路標
+STR_GO_TO_WAYPOINT :前往 {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT :前往 {WAYPOINT} 不停靠
-STR_WAYPOINT :{WHITE}路標
-STR_WAYPOINT_GRAPHICS_TIP :{BLACK}選擇路標種類
+STR_WAYPOINTNAME_CITY :{TOWN} 號誌站
+STR_WAYPOINTNAME_CITY_SERIAL :{TOWN} 第 {COMMA} 號誌站
+STR_LANDINFO_WAYPOINT :號誌站
+
+STR_WAYPOINT :{WHITE}號誌站
+STR_WAYPOINT_GRAPHICS_TIP :{BLACK}顯示號誌站種類
STR_WAYPOINT_VIEWPORT :{WHITE}{WAYPOINT}
STR_WAYPOINT_VIEWPORT_TINY :{TINYFONT}{WHITE}{WAYPOINT}
STR_WAYPOINT_RAW :{WAYPOINT}
-STR_EDIT_WAYPOINT_NAME :{WHITE}更改路標名稱
+STR_EDIT_WAYPOINT_NAME :{WHITE}編輯導航點名稱
-STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}不能更改路標名稱
-STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}將路軌變為路標
-STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}不能建立鐵路路標
-STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}不能移除鐵路路標
+STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}無法修改號誌站...
+STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}將軌道轉成號誌站
+STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}無法在此建造列車號誌站...
+STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}無法移除號誌站...
-STR_BUILD_AUTORAIL_TIP :{BLACK}以自動模式鋪設路軌
+STR_BUILD_AUTORAIL_TIP :{BLACK}以自動鋪軌模式建造鐵軌
STR_NO_TOWN_IN_SCENARIO :{WHITE}...這個場景沒有市鎮
-STR_GENERATE_RANDOM_LANDSCAPE :{WHITE}你要建立一個隨機地形嗎?
-STR_MANY_RANDOM_TOWNS :{BLACK}隨機產生多個市鎮
+STR_GENERATE_RANDOM_LANDSCAPE :{WHITE}您確定要隨機建立地形嗎?
+STR_MANY_RANDOM_TOWNS :{BLACK}許多隨機城鎮
STR_RANDOM_TOWNS_TIP :{BLACK}以隨機放置的市鎮佈滿版圖
STR_MANY_RANDOM_INDUSTRIES :隨機產生多個工業
STR_RANDOM_INDUSTRIES_TIP :{BLACK}以隨機放置的工業佈滿版圖
-STR_CAN_T_GENERATE_INDUSTRIES :{WHITE}隨機產生工業失敗...
+STR_CAN_T_GENERATE_INDUSTRIES :{WHITE}無法產生工業...
-STR_LANDSCAPING_TOOLBAR_TIP :{BLACK}開啟地形工具列以修改地形,植樹等等
-STR_LANDSCAPING_TOOLBAR :{WHITE}地形改造
-STR_LEVEL_LAND_TOOLTIP :{BLACK}移平土地
+STR_LANDSCAPING_TOOLBAR_TIP :{BLACK}打開第型工具列,提升/降低地面,種樹等等。
+STR_LANDSCAPING_TOOLBAR :{WHITE}地形
+STR_LEVEL_LAND_TOOLTIP :{BLACK}整平地面
STR_TREES_RANDOM_TYPE :{BLACK}隨機種類樹木
STR_TREES_RANDOM_TYPE_TIP :{BLACK}種植隨機種類樹木
-STR_CANT_BUILD_CANALS :{WHITE}不可以在這裏開鑿運河...
-STR_BUILD_CANALS_TIP :{BLACK}開鑿運河。
+STR_CANT_BUILD_CANALS :{WHITE}無法在此建造運河...
+STR_BUILD_CANALS_TIP :{BLACK}建造運河。按住 CTRL 可在海面上建造 (僅限海平面)
STR_LANDINFO_CANAL :運河
-STR_CANT_BUILD_LOCKS :{WHITE}不可以在這裏興建水閘...
-STR_BUILD_LOCKS_TIP :{BLACK}興建水閘
+STR_CANT_BUILD_LOCKS :{WHITE}無法在此建造水閘...
+STR_BUILD_LOCKS_TIP :{BLACK}建造水閘
STR_LANDINFO_LOCK :水閘
-STR_BUOY_IS_IN_USE :{WHITE}...浮標正被使用!
+
+STR_BUOY_IS_IN_USE :{WHITE}...浮標正在使用!
STR_LANDINFO_COORDS :{BLACK}座標:{LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
-STR_CANT_REMOVE_PART_OF_STATION :{WHITE}不能移除車站部份...
+STR_CANT_REMOVE_PART_OF_STATION :{WHITE}無法移除局部車站...
STR_CANT_CONVERT_RAIL :{WHITE}無法轉換軌道種類...
STR_CONVERT_RAIL_TIP :{BLACK}轉換/升級軌道種類
@@ -1711,6 +1718,7 @@
STR_1816_TREE_LINED_ROAD :有行道樹的公路
STR_1817_ROAD_VEHICLE_DEPOT :車庫
STR_1818_ROAD_RAIL_LEVEL_CROSSING :公路/鐵道平交道
+STR_TRAMWAY :路面電車
STR_CAN_T_REMOVE_BUS_STATION :{WHITE}不能從這邊移除公車站...
STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}不能從這邊移除貨運站...
STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}不可移除載客電車站...
@@ -2691,6 +2699,8 @@
STR_ORDER_GO_TO_NEAREST_HANGAR :前往最近的機棚
STR_ORDER_NEAREST_DEPOT :最近的
STR_ORDER_NEAREST_HANGAR :最近的機棚
+STR_ORDER_SERVICE_AT :前往維護
+STR_ORDER_SERVICE_NON_STOP_AT :直接前往維護
STR_ORDER_TRAIN_DEPOT :機廠
STR_ORDER_ROAD_DEPOT :車庫
STR_ORDER_SHIP_DEPOT :船塢
@@ -2700,6 +2710,17 @@
STR_ORDER_CONDITIONAL :條件指令
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳躍指令依據
+STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}如何與指定數值比對載具資料
+STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}與載具資料比對的數值
+STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}輸入想比對的數值
+STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :負載比例
+STR_ORDER_CONDITIONAL_RELIABILITY :可靠度
+STR_ORDER_CONDITIONAL_MAX_SPEED :極速
+STR_ORDER_CONDITIONAL_AGE :運具年齡 (年)
+STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :需要維護
+STR_ORDER_CONDITIONAL_UNCONDITIONALLY :總是
+STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :等於
+STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :不等於
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :漫遊 (無時刻表)
STR_TIMETABLE_TRAVEL_FOR :通行於 {STRING}
@@ -2747,6 +2768,8 @@
STR_REFIT_ORDER :(改裝成 {STRING})
STR_TIMETABLE_VIEW :{BLACK}時刻表
STR_TIMETABLE_VIEW_TOOLTIP :{BLACK}切換至時刻表檢視模式
+STR_ORDER_VIEW :{BLACK}指令
+STR_ORDER_VIEW_TOOLTIP :{BLACK}切到指令列表
STR_8829_ORDERS :{WHITE}{VEHICLE} (指令)
STR_882A_END_OF_ORDERS :{SETX 10}- - 指令結束 - -
STR_SERVICE :{BLACK}維護
@@ -2755,6 +2778,7 @@
STR_882D_VALUE :{LTBLUE}{ENGINE}{BLACK} 價值:{LTBLUE}{CURRENCY}
STR_882E :{WHITE}{VEHICLE}
STR_882F_LOADING_UNLOADING :{LTBLUE}正在裝卸客貨
+STR_LEAVING :{LTBLUE}正在離開
STR_TRAIN_MUST_BE_STOPPED :{WHITE}列車必須停在機廠内
STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}無法將列車送往機廠...
STR_8831_NO_MORE_SPACE_FOR_ORDERS :{WHITE}無法新增指令
@@ -2836,6 +2860,7 @@
STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}{STRING} 問世了! - {ENGINE}
STR_CAN_T_SELL_DESTROYED_VEHICLE :{WHITE}損毀的運具不能出售...
+STR_CAN_T_REFIT_DESTROYED_VEHICLE :{WHITE}不能改造已撞毀的載具
STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}無法為運具加入時刻表...
STR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}運具只能等待於站點。
@@ -2916,8 +2941,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}選擇車輛要運送的酬載種類
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :建造碼頭
-STR_9801_DOCK_CONSTRUCTION :{WHITE}建造碼頭
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}無法在此建造碼頭...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} 船塢
STR_9804_NEW_SHIPS :{BLACK}購買船舶
@@ -3151,6 +3174,9 @@
STR_NEWGRF_DISABLED_WARNING :{WHITE}找不到的 GRF 檔已被關閉
STR_NEWGRF_NOT_FOUND_WARNING :{WHITE}找不到載入遊戲所需的 GRF 檔案
STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}一個或多個 GRF 檔案遺失
+STR_NEWGRF_UNPAUSE_WARNING :{WHITE}取消暫停可能會讓 OpenTTD 當掉。請不要回報之後的當機情形。{}您真的要取消暫停嗎?
+
+STR_LOADGAME_REMOVED_TRAMS :{WHITE}存檔版本不支援路面電車,已移除所有路面電車。
STR_CURRENCY_WINDOW :{WHITE}自訂幣值
STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}匯率:{ORANGE}{CURRENCY} = £ {COMMA}
@@ -3277,6 +3303,9 @@
########### For showing numbers in widgets
+STR_NUM_1 :{BLACK}{SKIP}{NUM}
+STR_NUM_2 :{BLACK}{SKIP}{SKIP}{NUM}
+STR_NUM_3 :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}
########### String for New Landscape Generator
@@ -3286,6 +3315,7 @@
STR_WORLD_GENERATION_CAPTION :{WHITE}產生世界
STR_RANDOM_SEED :{BLACK}亂數種子:
STR_RANDOM_SEED_HELP :{BLACK}點選可輸入亂數種子
+STR_RANDOM_SEED_OSKTITLE :{BLACK}輸入亂數種子
STR_LAND_GENERATOR :{BLACK}地形產生器
STR_TREE_PLACER :{BLACK}植樹演算法:
STR_HEIGHTMAP_ROTATION :{BLACK}高度圖旋轉:
@@ -3376,7 +3406,9 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}將透明度套用於建物,如車站、廠棚、路標及電線
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}將透明度套用於橋樑
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}將透明度套用於設施,如燈塔、天線塔等
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}切換供電線透明與否。CTRL+左鍵 可鎖定。
STR_TRANSPARENT_LOADING_DESC :{BLACK}將透明度套用於運載顯示表
+STR_TRANSPARENT_INVISIBLE_DESC :{BLACK}完全隱藏物件
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
STR_PERCENT_UP :{WHITE}{NUM}%{UPARROW}
@@ -3432,6 +3464,7 @@
#### Improved sign GUI
STR_NEXT_SIGN_TOOLTIP :{BLACK}前往下一個標誌
STR_PREVIOUS_SIGN_TOOLTIP :{BLACK}前往前一個標誌
+STR_SIGN_OSKTITLE :{BLACK}輸入標誌名稱
########
@@ -3506,4 +3539,12 @@
########
############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
########
+
+############ town controlled noise level
+STR_CONFIG_PATCHES_NOISE_LEVEL :{LTBLUE}允許城鎮控制機場噪音: {ORANGE}{STRING}
+STR_NOISE_IN_TOWN :{BLACK}城鎮噪音限制: {ORANGE}{COMMA}{BLACK} 最大: {ORANGE}{COMMA}
+STR_STATION_NOISE :{BLACK}產生噪音: {GOLD}{COMMA}
+########
--- a/src/lang/turkish.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/turkish.txt Wed Jul 09 13:32:13 2008 +0000
@@ -2905,8 +2905,6 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Kamyonun taşıyacağı kargo türünü seçin
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :İskele yapımı
-STR_9801_DOCK_CONSTRUCTION :{WHITE}İskele yapımı
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Buraya iskele yapılamaz...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Tersanesi
STR_9804_NEW_SHIPS :{BLACK}Yeni gemi
--- a/src/lang/ukrainian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/ukrainian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -34,9 +34,8 @@
STR_0012_OIL :нафта
STR_0012_OIL.r :нафти
STR_0012_OIL.z :нафту
-STR_0013_LIVESTOCK :тварини
-STR_0013_LIVESTOCK.r :тварин
-STR_0013_LIVESTOCK.z :тварин
+STR_0013_LIVESTOCK :худоба
+STR_0013_LIVESTOCK.z :худобу
STR_0014_GOODS :товари
STR_0014_GOODS.r :товарів
STR_0014_GOODS.z :товари
@@ -127,9 +126,8 @@
STR_0032_OIL :нафта
STR_0032_OIL.r :нафти
STR_0032_OIL.z :нафту
-STR_0033_LIVESTOCK :тварини
-STR_0033_LIVESTOCK.r :тварин
-STR_0033_LIVESTOCK.z :тварин
+STR_0033_LIVESTOCK :худоба
+STR_0033_LIVESTOCK.z :худобу
STR_0034_GOODS :товари
STR_0034_GOODS.r :товарів
STR_0034_GOODS.z :товари
@@ -213,7 +211,7 @@
STR_QUANTITY_COAL :{WEIGHT} вугілля
STR_QUANTITY_MAIL :{COMMA} сум{P ка ки ок} пошти
STR_QUANTITY_OIL :{VOLUME} нафти
-STR_QUANTITY_LIVESTOCK :{COMMA} гол{P ова ови ів} тварин{P и и ""}
+STR_QUANTITY_LIVESTOCK :{COMMA} кор{P ова ови ів}
STR_QUANTITY_GOODS :{COMMA} ящи{P к ки ків} товарів
STR_QUANTITY_GRAIN :{WEIGHT} зерна
STR_QUANTITY_WOOD :{WEIGHT} деревини
@@ -395,9 +393,9 @@
STR_012D :{WHITE}{STRING}
STR_012E_CANCEL :{BLACK}Відміна
STR_012F_OK :{BLACK}Так
-STR_0130_RENAME :{BLACK}Ім'я
-STR_0131_TOO_MANY_NAMES_DEFINED :{WHITE}Дуже багато імен
-STR_0132_CHOSEN_NAME_IN_USE_ALREADY :{WHITE}Таке ім'я вже є
+STR_0130_RENAME :{BLACK}Назва
+STR_0131_TOO_MANY_NAMES_DEFINED :{WHITE}Дуже багато назв
+STR_0132_CHOSEN_NAME_IN_USE_ALREADY :{WHITE}Така назва вже є
STR_OSNAME_WINDOWS :Windows
STR_OSNAME_UNIX :Unix
@@ -492,7 +490,7 @@
STR_SORT_BY_TYPE :за типом
STR_SORT_BY_TRANSPORTED :за перевезенням
STR_SORT_BY_NAME :{BLACK}за назвою
-STR_SORT_BY_DROPDOWN_NAME :Назва
+STR_SORT_BY_DROPDOWN_NAME :за назвою
STR_SORT_BY_DATE :{BLACK}за датою
STR_SORT_BY_NUMBER :за номером
STR_SORT_BY_PROFIT_LAST_YEAR :за прибутком минулого року
@@ -501,19 +499,19 @@
STR_SORT_BY_RELIABILITY :за надійністю
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :за місткістю
STR_SORT_BY_MAX_SPEED :за швидкістю
-STR_SORT_BY_MODEL :Модель
+STR_SORT_BY_MODEL :за моделлю
STR_SORT_BY_VALUE :за ціною
-STR_SORT_BY_LENGTH :Довжина
-STR_SORT_BY_FACILITY :Вид станцій
+STR_SORT_BY_LENGTH :за довжиною
+STR_SORT_BY_FACILITY :за типом станції
STR_SORT_BY_WAITING :за ціною вантажу
STR_SORT_BY_RATING_MAX :Рейтинг вантажів
-STR_ENGINE_SORT_ENGINE_ID :ID (класичне)
-STR_ENGINE_SORT_COST :Ціна
-STR_ENGINE_SORT_POWER :Потужність
-STR_ENGINE_SORT_INTRO_DATE :Дата випуску
-STR_ENGINE_SORT_RUNNING_COST :Вартість експлуатації
-STR_ENGINE_SORT_POWER_VS_RUNNING_COST :Потужність/Вартість експлуатації
-STR_ENGINE_SORT_CARGO_CAPACITY :Місткість
+STR_ENGINE_SORT_ENGINE_ID :за ID (класичне)
+STR_ENGINE_SORT_COST :за ціною
+STR_ENGINE_SORT_POWER :за потужністю
+STR_ENGINE_SORT_INTRO_DATE :за датою випуску
+STR_ENGINE_SORT_RUNNING_COST :за вартістю експлуатації
+STR_ENGINE_SORT_POWER_VS_RUNNING_COST :за потужністю/вартістю експлуатації
+STR_ENGINE_SORT_CARGO_CAPACITY :за місткістю
STR_NO_WAITING_CARGO :{BLACK}Звідси поки що нічого перевозити
STR_SELECT_ALL_FACILITIES :{BLACK}Вибрати весь транспорт
STR_SELECT_ALL_TYPES :{BLACK}Вибрати всі типи вантажів
@@ -728,7 +726,7 @@
STR_MESSAGES_ALL :{YELLOW}Відображати повідомлення: відкл. / коротко / повно
STR_MESSAGE_SOUND :{YELLOW}Звукове сповіщення для підсумкових новин
STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...дуже далеко від попереднього пункту призначення
-STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Кращі компанії, що досягли {NUM}{}({STRING} рівень)
+STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Кращі компанії, які досягли {NUM}{}({STRING} рівень)
STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Таблиця компаній з {NUM}
STR_0212 :{BIGFONT}{COMMA}.
STR_0213_BUSINESSMAN :Бізнесмен
@@ -768,7 +766,7 @@
STR_0239_SITE_UNSUITABLE :{WHITE}...невідповідне місце
STR_023A_TOO_MANY_TOWNS :{WHITE}...забагато міст
STR_CANNOT_GENERATE_TOWN :{WHITE}Не можна створити місто
-STR_NO_SPACE_FOR_TOWN :{WHITE}...На карті немає вільного місця
+STR_NO_SPACE_FOR_TOWN :{WHITE}...на карті немає вільного місця
STR_023B_INCREASE_SIZE_OF_TOWN :{BLACK}Збільшити розмір міста
STR_023C_EXPAND :{BLACK}Розширити
STR_023D_RANDOM_TOWN :{BLACK}Випадкове місто
@@ -919,7 +917,7 @@
############ range for menu starts
STR_02D5_LAND_BLOCK_INFO :Інформація про ділянку
STR_02D6 :
-STR_CONSOLE_SETTING :Вкл/викл консоль
+STR_CONSOLE_SETTING :Вкл./відкл. консоль
STR_02D7_SCREENSHOT_CTRL_S :Копія екрану (Ctrl-S)
STR_02D8_GIANT_SCREENSHOT_CTRL_G :Копія всієї карти (Ctrl-G)
STR_02D9_ABOUT_OPENTTD :Про гру 'OpenTTD'
@@ -971,7 +969,7 @@
STR_0302_DISPLAY_DIFFICULTY_OPTIONS :{BLACK}Показати налаштування складності
STR_0303_START_A_NEW_GAME_USING :{BLACK}Почати нову гру, використовуючи сценарій
STR_0304_QUIT :{BLACK}Вихід
-STR_0305_QUIT_OPENTTD :{BLACK}покинути 'OpenTTD'
+STR_0305_QUIT_OPENTTD :{BLACK}Вийти з OpenTTD
STR_0307_OPENTTD :{WHITE}OpenTTD {REV}
STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...можна будувати лише у містах
STR_030E_SELECT_TEMPERATE_LANDSCAPE :{BLACK}Вибрати 'помірний' клімат
@@ -1098,7 +1096,7 @@
STR_PASSENGERS :пасАжир
STR_BAGS :мішків
-STR_TONS :тонИ
+STR_TONS :тони
STR_LITERS :літрів
STR_ITEMS :штук
STR_CRATES :ЯщикИ
@@ -1216,7 +1214,7 @@
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION :{LTBLUE}Обертання карти висот: {ORANGE}{STRING}
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Проти годинникової
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE :За годинниковою
-STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT :{LTBLUE}Рівень висоти для карт з плоским рельєфом: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT :{LTBLUE}Рівень висоти для карт з пласким рельєфом: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Макс. довжина станції: {ORANGE}{STRING} {RED}Велике значення гальмує гру
STR_CONFIG_PATCHES_SERVICEATHELIPAD :{LTBLUE}Автоматичний техогляд гелікоптерів на площадках: {ORANGE}{STRING}
@@ -1416,6 +1414,9 @@
STR_BUILD_LOCKS_TIP :{BLACK}Будувати шлюз
STR_LANDINFO_LOCK :Шлюз
+STR_CANT_PLACE_RIVERS :{WHITE}Тут не можна зробити річку...
+STR_LANDINFO_RIVER :Річка
+
STR_BUOY_IS_IN_USE :{WHITE}...бакен використовується!
STR_LANDINFO_COORDS :{BLACK}Координати: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
@@ -1469,7 +1470,7 @@
STR_RAIL_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Виберіть вид вантажу для перевезення
STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED :{BLACK}Переобладнати поїзд для перевезення вибраного виду вантажу
STR_RAIL_CAN_T_REFIT_VEHICLE :{WHITE}Неможливо переобладнати поїзд...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Тривалість обслуговування у відсотках: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Інтервал техогляду у відсотках: {ORANGE}{STRING}
STR_CONFIG_GAME_PRODUCTION :{WHITE}Змінити виробництво
TEMP_AI_IN_PROGRESS :{WHITE}Ласкаво просимо до тестування нового інтелекту. Якщо Ви помітили недолік, надішліть копію екрану у форум.
@@ -1720,8 +1721,8 @@
STR_PNGMAP_ERROR :{WHITE}Неможливо завантажити ландшафт з PNG...
STR_PNGMAP_ERR_FILE_NOT_FOUND :{WHITE}...файл не знайдено
-STR_PNGMAP_ERR_IMAGE_TYPE :{WHITE}...неможливо конвертувати. треба 8 чи 24-bit PNG формат.
-STR_PNGMAP_ERR_MISC :{WHITE}...Помилка. (можливо зіпсований файл)
+STR_PNGMAP_ERR_IMAGE_TYPE :{WHITE}...неможливо конвертувати. Треба 8 чи 24-bit PNG формат.
+STR_PNGMAP_ERR_MISC :{WHITE}...помилка (можливо, зіпсований файл).
STR_BMPMAP_ERROR :{WHITE}Не можу завантажити ландшафт з BMP...
STR_BMPMAP_ERR_IMAGE_TYPE :{WHITE}...неможливо перетворити тип зображення
@@ -1803,7 +1804,7 @@
STR_1802_ROAD_CONSTRUCTION :{WHITE}Будівництво дороги
STR_WHITE_TRAMWAY_CONSTRUCTION :{WHITE}Будівництво трамвайної колії
STR_1803_SELECT_ROAD_BRIDGE :{WHITE}Виберіть дорожній міст
-STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... односторонні дороги не можуть перетинатись
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}...односторонні дороги не можуть перетинатись
STR_1804_CAN_T_BUILD_ROAD_HERE :{WHITE}Неможливо тут побудувати дорогу ...
STR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Тут не можна побудувати трамвайну колію...
STR_1805_CAN_T_REMOVE_ROAD_FROM :{WHITE}Неможливо прибрати дорогу звідси...
@@ -2068,6 +2069,7 @@
STR_3804_WATER :Вода
STR_3805_COAST_OR_RIVERBANK :Берег
STR_3806_SHIP_DEPOT :Корабельне депо
+STR_AQUEDUCT :Акведук
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Неможливо будувати на воді
STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Спочатку потрібно прибрати канал
@@ -2339,35 +2341,35 @@
STR_CITY_APPROVAL :{LTBLUE}Відношення влади до перебудови території міста: {ORANGE}{STRING}
############ range for difficulty settings ends
-STR_NONE :Нема
+STR_NONE :нема
STR_NUM_VERY_LOW :дуже мало
-STR_6816_LOW :МалО
-STR_6817_NORMAL :Нормально
-STR_6818_HIGH :Багато
+STR_6816_LOW :мало
+STR_6817_NORMAL :нормально
+STR_6818_HIGH :багато
STR_6819 :{BLACK}{SMALLLEFTARROW}
STR_681A :{BLACK}{SMALLRIGHTARROW}
STR_681B_VERY_SLOW :Дуже повільно
STR_681C_SLOW :Повільно
-STR_681D_MEDIUM :Середньо
-STR_681E_FAST :Швидко
-STR_681F_VERY_FAST :Дуже швидко
-STR_VERY_LOW :Дуже мало
-STR_6820_LOW :МаЛо
-STR_6821_MEDIUM :Середньо
-STR_6822_HIGH :Багато
-STR_6823_NONE :Відкл.
-STR_6824_REDUCED :Знижено
-STR_6825_NORMAL :Нормально
+STR_681D_MEDIUM :середньо
+STR_681E_FAST :швидко
+STR_681F_VERY_FAST :дуже швидко
+STR_VERY_LOW :дуже мало
+STR_6820_LOW :мало
+STR_6821_MEDIUM :середньо
+STR_6822_HIGH :багато
+STR_6823_NONE :відкл.
+STR_6824_REDUCED :знижено
+STR_6825_NORMAL :нормально
STR_6826_X1_5 :x1.5
STR_6827_X2 :x2
STR_6828_X3 :x3
STR_6829_X4 :x4
-STR_682A_VERY_FLAT :Дуже рівний
-STR_682B_FLAT :Рівнинний
-STR_682C_HILLY :Горбкуватий
-STR_682D_MOUNTAINOUS :Гористий
-STR_682E_STEADY :Стабільна
-STR_682F_FLUCTUATING :Нестійка
+STR_682A_VERY_FLAT :плаский
+STR_682B_FLAT :рівнинний
+STR_682C_HILLY :горбкуватий
+STR_682D_MOUNTAINOUS :гористий
+STR_682E_STEADY :стабільна
+STR_682F_FLUCTUATING :нестійка
STR_6830_IMMEDIATE :відразу
STR_6831_3_MONTHS_AFTER_PLAYER :3 місяці після гравця
STR_6832_6_MONTHS_AFTER_PLAYER :6 місяців після гравця
@@ -2377,9 +2379,9 @@
STR_6836_OFF :відкл.
STR_6837_ON :вкл.
STR_6838_SHOW_HI_SCORE_CHART :{BLACK}Показати таблицю рекордів
-STR_PERMISSIVE :Допустиме
-STR_TOLERANT :Терпиме
-STR_HOSTILE :Вороже
+STR_PERMISSIVE :допустиме
+STR_TOLERANT :терпиме
+STR_HOSTILE :вороже
##id 0x7000
STR_7000 :
@@ -2583,7 +2585,7 @@
STR_801C_MAIL_VAN :Поштовий
STR_801D_COAL_CAR :Вугільний
STR_801E_OIL_TANKER :Нафтовий
-STR_801F_LIVESTOCK_VAN :Вагон для тварин
+STR_801F_LIVESTOCK_VAN :Вагон для худоби
STR_8020_GOODS_VAN :Товарний
STR_8021_GRAIN_HOPPER :Вагон для зерна
STR_8022_WOOD_TRUCK :Вагон для деревини
@@ -2613,7 +2615,7 @@
STR_803A_MAIL_VAN :Вагон для пошти
STR_803B_COAL_CAR :Вагон для вугілля
STR_803C_OIL_TANKER :Цистерна для нафти
-STR_803D_LIVESTOCK_VAN :вантажівка для тварин
+STR_803D_LIVESTOCK_VAN :вантажівка для худоби
STR_803E_GOODS_VAN :вантажівка для товарів
STR_803F_GRAIN_HOPPER :вагон для зерна
STR_8040_WOOD_TRUCK :лісовоз
@@ -2824,14 +2826,17 @@
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Поїзд на шляху
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_ORDER_NON_STOP :{BLACK}Без зупинки
STR_ORDER_GO_TO :Прямувати до
STR_ORDER_GO_NON_STOP_TO :Прямувати без зупинок до
STR_ORDER_GO_VIA :Прямувати через
STR_ORDER_GO_NON_STOP_VIA :Прямувати без зупинок через
+STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Повністю завантажити будь-який вид вантажу
STR_ORDER_DROP_LOAD_IF_POSSIBLE :Завантажитись при нагоді
STR_ORDER_DROP_FULL_LOAD_ALL :Повністю завантажити всі вантажі
STR_ORDER_DROP_FULL_LOAD_ANY :Повністю завантажити будь-який вид вантажу
STR_ORDER_DROP_NO_LOADING :Не завантажуватись
+STR_ORDER_TOGGLE_UNLOAD :{BLACK}Розвантажити все
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Розвантажитись, якщо приймають
STR_ORDER_DROP_UNLOAD :Розвантажити все
STR_ORDER_DROP_TRANSFER :Передати
@@ -3112,8 +3117,9 @@
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Оберіть тип вантажу для перевезення
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Будувати порт
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Будівництво порту
+STR_9800_WATERWAYS_CONSTRUCTION :Будівництво водних шляхів
+STR_9801_WATERWAYS_CONSTRUCTION :{WHITE}Будівництво водних шляхів
+STR_9801_WATERWAYS_CONSTRUCTION_SE :{WHITE}Водні шляхи
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Неможливо будувати порт тут...
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Док
STR_9804_NEW_SHIPS :{BLACK}Нові кораблі
@@ -3166,6 +3172,8 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Жителі святкують . . .{}Перший корабель з'явився на {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Розмістити бакен, який можна використовувати як точку маршруту
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Неможливо розмістити бакен тут...
+STR_BUILD_AQUEDUCT :{BLACK}Побудувати акведук
+STR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Тут не можна побудувати акведук...
STR_9836_RENAME :{BLACK}Зміна назви
STR_9837_RENAME_SHIP_TYPE :{BLACK}Перейменувати тип корабля
STR_9838_RENAME_SHIP_TYPE :{WHITE}Перейменувати тип корабля
@@ -3318,6 +3326,7 @@
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} потребує версію OpenTTD не нижче {STRING}.
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF-файл, для якого це призначалось перекласти
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Завантажено забагато NewGRF-файлів.
+STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Завантаження {STRING} як статичного NewGRF з {STRING} може викликати десинхронізацію.
STR_NEWGRF_ADD :{BLACK}Додати
STR_NEWGRF_ADD_TIP :{BLACK}Додати файли NewGRF до списку
@@ -3550,7 +3559,7 @@
STR_SMALL_AIRPORTS :{BLACK}Малі аеропорти
STR_LARGE_AIRPORTS :{BLACK}Великі аеропорти
-STR_HUB_AIRPORTS :{BLACK}Мега-аеропорти
+STR_HUB_AIRPORTS :{BLACK}Вузлові аеропорти
STR_HELIPORTS :{BLACK}Геліко-аеропорт
############ Tooltip measurment
--- a/src/lang/unfinished/latvian.txt Mon Jun 30 21:31:23 2008 +0000
+++ b/src/lang/unfinished/latvian.txt Wed Jul 09 13:32:13 2008 +0000
@@ -1828,8 +1828,6 @@
##id 0x9800
-STR_9800_DOCK_CONSTRUCTION :Ostas uzbūve
-STR_9801_DOCK_CONSTRUCTION :{WHITE}Ostas uzbūve
STR_9802_CAN_T_BUILD_DOCK_HERE :{WHITE}Nevar uzbūvēt ostu šeit
STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Kuģu depo
STR_9804_NEW_SHIPS :{BLACK}Jauni kuģi
--- a/src/map.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/map.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -261,12 +261,12 @@
* @param tile to start the search from. Upon completion, it will return the tile matching the search
* @param size: number of tiles per side of the desired search area
* @param proc: callback testing function pointer.
- * @param data to be passed to the callback function. Depends on the implementation
+ * @param user_data to be passed to the callback function. Depends on the implementation
* @return result of the search
* @pre proc != NULL
* @pre size > 0
*/
-bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, uint32 data)
+bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, void *user_data)
{
uint n, x, y;
DiagDirection dir;
@@ -281,7 +281,7 @@
/* If the length of the side is uneven, the center has to be checked
* separately, as the pattern of uneven sides requires to go around the center */
n = 2;
- if (proc(TileXY(x, y), data)) {
+ if (proc(TileXY(x, y), user_data)) {
*tile = TileXY(x, y);
return true;
}
@@ -304,7 +304,7 @@
uint j;
for (j = n; j != 0; j--) {
if (x <= MapMaxX() && y <= MapMaxY() && ///< Is the tile within the map?
- proc(TileXY(x, y), data)) { ///< Is the callback successful?
+ proc(TileXY(x, y), user_data)) { ///< Is the callback successful?
*tile = TileXY(x, y);
return true; ///< then stop the search
}
--- a/src/map_func.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/map_func.h Wed Jul 09 13:32:13 2008 +0000
@@ -383,15 +383,15 @@
* A callback function type for searching tiles.
*
* @param tile The tile to test
- * @param data additional data for the callback function to use
+ * @param user_data additional data for the callback function to use
* @return A boolean value, depend on the definition of the function.
*/
-typedef bool TestTileOnSearchProc(TileIndex tile, uint32 data);
+typedef bool TestTileOnSearchProc(TileIndex tile, void *user_data);
/**
* Searches for some cirumstances of a tile around a given tile with a helper function.
*/
-bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, uint32 data);
+bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, void *user_data);
/**
* Get a random tile out of a given seed.
--- a/src/misc_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/misc_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -59,12 +59,12 @@
static const Widget _land_info_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
{ WWT_CAPTION, RESIZE_NONE, 14, 11, 279, 0, 13, STR_01A3_LAND_AREA_INFORMATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 279, 14, 92, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_BOTTOM, 14, 0, 279, 14, 99, 0x0, STR_NULL},
{ WIDGETS_END},
};
static const WindowDesc _land_info_desc = {
- WDP_AUTO, WDP_AUTO, 280, 93, 280, 93,
+ WDP_AUTO, WDP_AUTO, 280, 100, 280, 100,
WC_LAND_INFO, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
_land_info_widgets,
@@ -86,15 +86,15 @@
{
this->DrawWidgets();
- uint y = 16;
+ uint y = 21;
for (uint i = 0; i < LAND_INFO_CENTERED_LINES; i++) {
- if (StrEmpty(this->landinfo_data[i])) continue;
+ if (StrEmpty(this->landinfo_data[i])) break;
DoDrawStringCentered(140, y, this->landinfo_data[i], i == 0 ? TC_LIGHT_BLUE : TC_FROMSTRING);
- y += 11;
+ y += i == 0 ? 16 : 12;
}
- y += 5;
+ y += 6;
if (!StrEmpty(this->landinfo_data[LAND_INFO_MULTICENTER_LINE])) DrawStringMultiCenter(140, y, BindCString(this->landinfo_data[LAND_INFO_MULTICENTER_LINE]), this->width - 4);
}
@@ -181,10 +181,8 @@
line_nr++;
}
- /* Remaining lines stay empty */
- for (; line_nr < LAND_INFO_CENTERED_LINES; line_nr++) {
- this->landinfo_data[line_nr][0] = '\0';
- }
+ /* Mark last line empty */
+ this->landinfo_data[line_nr][0] = '\0';
/* Cargo acceptance is displayed in a extra multiline */
char *strp = GetString(this->landinfo_data[LAND_INFO_MULTICENTER_LINE], STR_01CE_CARGO_ACCEPTED, lastof(this->landinfo_data[LAND_INFO_MULTICENTER_LINE]));
@@ -211,6 +209,12 @@
}
if (!found) this->landinfo_data[LAND_INFO_MULTICENTER_LINE][0] = '\0';
+ if (found) line_nr += 2;
+
+ if (line_nr > 6) ResizeWindow(this, 0, 12 * (line_nr - 6));
+
+ this->FindWindowPlacementAndResize(&_land_info_desc);
+
#if defined(_DEBUG)
# define LANDINFOD_LEVEL 0
#else
@@ -226,8 +230,6 @@
DEBUG(misc, LANDINFOD_LEVEL, "m6 = %#x", _m[tile].m6);
DEBUG(misc, LANDINFOD_LEVEL, "m7 = %#x", _me[tile].m7);
#undef LANDINFOD_LEVEL
-
- this->FindWindowPlacementAndResize(&_land_info_desc);
}
};
--- a/src/network/network.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/network/network.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -41,7 +41,6 @@
#endif /* DEBUG_DUMP_COMMANDS */
#include "table/strings.h"
-bool _network_reload_cfg;
bool _network_server; ///< network-server is active
bool _network_available; ///< is network mode available?
bool _network_dedicated; ///< are we a dedicated server?
--- a/src/newgrf.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/newgrf.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -235,6 +235,23 @@
return file;
}
+/** Reset all NewGRFData that was used only while processing data */
+static void ClearTemporaryNewGRFData()
+{
+ /* Clear the GOTO labels used for GRF processing */
+ for (GRFLabel *l = _cur_grffile->label; l != NULL;) {
+ GRFLabel *l2 = l->next;
+ free(l);
+ l = l2;
+ }
+ _cur_grffile->label = NULL;
+
+ /* Clear the list of spritegroups */
+ free(_cur_grffile->spritegroups);
+ _cur_grffile->spritegroups = NULL;
+ _cur_grffile->spritegroups_count = 0;
+}
+
typedef std::map<StringID *, uint32> StringIDToGRFIDMapping;
StringIDToGRFIDMapping _string_to_grf_mapping;
@@ -3826,6 +3843,9 @@
c->error->data = strdup(_cur_grfconfig->name);
c->error->severity = STR_NEWGRF_ERROR_MSG_FATAL;
c->error->message = STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC;
+
+ ClearTemporaryNewGRFData();
+ _skip_sprites = -1;
}
/* Action 0x07 */
@@ -3984,6 +4004,7 @@
/* If an action 8 hasn't been encountered yet, disable the grf. */
if (_cur_grfconfig->status != GCS_ACTIVATED) {
_cur_grfconfig->status = GCS_DISABLED;
+ ClearTemporaryNewGRFData();
}
}
}
@@ -4156,7 +4177,7 @@
/* This is a fatal error, so make sure the GRF is deactivated and no
* more of it gets loaded. */
_cur_grfconfig->status = GCS_DISABLED;
-
+ ClearTemporaryNewGRFData();
_skip_sprites = -1;
}
@@ -4339,6 +4360,7 @@
/* Deactivate GRF */
grfmsg(0, "ParamSet: GRM: Unable to allocate %d %s, deactivating", count, type);
_cur_grfconfig->status = GCS_DISABLED;
+ ClearTemporaryNewGRFData();
_skip_sprites = -1;
return UINT_MAX;
}
@@ -4417,7 +4439,7 @@
if (_cur_spriteid + count >= 16384) {
grfmsg(0, "ParamSet: GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
_cur_grfconfig->status = GCS_DISABLED;
-
+ ClearTemporaryNewGRFData();
_skip_sprites = -1;
return;
}
@@ -4778,6 +4800,7 @@
grfmsg(0, "FeatureTownName: definition 0x%02X doesn't exist, deactivating", ref_id);
DelGRFTownName(grfid);
_cur_grfconfig->status = GCS_DISABLED;
+ ClearTemporaryNewGRFData();
_skip_sprites = -1;
return;
}
@@ -5068,6 +5091,7 @@
_cur_grfconfig->error = error;
_cur_grfconfig->status = GCS_DISABLED;
+ ClearTemporaryNewGRFData();
_skip_sprites = -1;
return;
}
@@ -5433,23 +5457,6 @@
InitializeSpriteGroupPool();
}
-/** Reset all NewGRFData that was used only while processing data */
-static void ClearTemporaryNewGRFData()
-{
- /* Clear the GOTO labels used for GRF processing */
- for (GRFLabel *l = _cur_grffile->label; l != NULL;) {
- GRFLabel *l2 = l->next;
- free(l);
- l = l2;
- }
- _cur_grffile->label = NULL;
-
- /* Clear the list of spritegroups */
- free(_cur_grffile->spritegroups);
- _cur_grffile->spritegroups = NULL;
- _cur_grffile->spritegroups_count = 0;
-}
-
static void BuildCargoTranslationMap()
{
memset(_cur_grffile->cargo_map, 0xFF, sizeof(_cur_grffile->cargo_map));
--- a/src/newgrf_config.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/newgrf_config.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -15,6 +15,7 @@
#include "gamelog.h"
#include "network/network_type.h"
+#include "tar_type.h"
#include "fileio.h"
#include "fios.h"
#include <sys/stat.h>
--- a/src/newgrf_house.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/newgrf_house.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -201,6 +201,113 @@
return GetNearbyTileInformation(tile);
}
+/** Structure with user-data for SearchNearbyHouseXXX - functions */
+typedef struct {
+ const HouseSpec *hs; ///< Specs of the house, that startet the search
+ TileIndex north_tile; ///< Northern tile of the house.
+} SearchNearbyHouseData;
+
+/** Callback function to search a house by its HouseID
+ * @param tile TileIndex to be examined
+ * @param user_data SearchNearbyHouseData
+ * @return true or false, if found or not
+ */
+static bool SearchNearbyHouseID(TileIndex tile, void *user_data)
+{
+ if (IsTileType(tile, MP_HOUSE)) {
+ HouseID house = GetHouseType(tile); // tile been examined
+ const HouseSpec *hs = GetHouseSpecs(house);
+ if (hs->grffile != NULL) { // must be one from a grf file
+ SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+ TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+ if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+ return hs->local_id == nbhd->hs->local_id && // same local id as the one requested
+ hs->grffile->grfid == nbhd->hs->grffile->grfid; // from the same grf
+ }
+ }
+ return false;
+}
+
+/** Callback function to search a house by its classID
+ * @param tile TileIndex to be examined
+ * @param user_data SearchNearbyHouseData
+ * @return true or false, if found or not
+ */
+static bool SearchNearbyHouseClass(TileIndex tile, void *user_data)
+{
+ if (IsTileType(tile, MP_HOUSE)) {
+ HouseID house = GetHouseType(tile); // tile been examined
+ const HouseSpec *hs = GetHouseSpecs(house);
+ if (hs->grffile != NULL) { // must be one from a grf file
+ SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+ TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+ if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+ return hs->class_id == nbhd->hs->class_id && // same classid as the one requested
+ hs->grffile->grfid == nbhd->hs->grffile->grfid; // from the same grf
+ }
+ }
+ return false;
+}
+
+/** Callback function to search a house by its grfID
+ * @param tile TileIndex to be examined
+ * @param user_data SearchNearbyHouseData
+ * @return true or false, if found or not
+ */
+static bool SearchNearbyHouseGRFID(TileIndex tile, void *user_data)
+{
+ if (IsTileType(tile, MP_HOUSE)) {
+ HouseID house = GetHouseType(tile); // tile been examined
+ const HouseSpec *hs = GetHouseSpecs(house);
+ if (hs->grffile != NULL) { // must be one from a grf file
+ SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+ TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+ if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+ return hs->grffile->grfid == nbhd->hs->grffile->grfid; // from the same grf
+ }
+ }
+ return false;
+}
+
+/** This function will activate a search around a central tile, looking for some houses
+ * that fit the requested characteristics
+ * @param parameter that is given by the callback.
+ * bits 0..6 radius of the search
+ * bits 7..8 search type i.e.: 0 = houseID/ 1 = classID/ 2 = grfID
+ * @param tile TileIndex from which to start the search
+ * @param house the HouseID that is associated to the house, the callback is called for
+ * @return the Manhattan distance from the center tile, if any, and 0 if failure
+ */
+static uint32 GetDistanceFromNearbyHouse(uint8 parameter, TileIndex tile, HouseID house)
+{
+ static TestTileOnSearchProc * const search_procs[3] = {
+ SearchNearbyHouseID,
+ SearchNearbyHouseClass,
+ SearchNearbyHouseGRFID,
+ };
+ TileIndex found_tile = tile;
+ uint8 searchtype = GB(parameter, 6, 2);
+ uint8 searchradius = GB(parameter, 0, 6);
+ if (searchtype >= lengthof(search_procs)) return 0; // do not run on ill-defined code
+ if (searchradius < 1) return 0; // do not use a too low radius
+
+ SearchNearbyHouseData nbhd;
+ nbhd.hs = GetHouseSpecs(house);
+ nbhd.north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+
+ /* Use a pointer for the tile to start the search. Will be required for calculating the distance*/
+ if (CircularTileSearch(&found_tile, 2 * searchradius + 1, search_procs[searchtype], &nbhd)) {
+ return DistanceManhattan(found_tile, tile);
+ }
+ return 0;
+}
+
/**
* HouseGetVariable():
*
@@ -260,6 +367,12 @@
return IsTileType(testtile, MP_HOUSE) ? GetHouseAnimationFrame(testtile) : 0;
}
+ /* Cargo acceptance history of nearby stations */
+ /*case 0x64: not implemented yet */
+
+ /* Distance test for some house types */
+ case 0x65: return GetDistanceFromNearbyHouse(parameter, tile, object->u.house.house_id);
+
/* Read GRF parameter */
case 0x7F: return GetGRFParameter(object->u.house.house_id, parameter);
}
--- a/src/newgrf_industries.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/newgrf_industries.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -135,7 +135,7 @@
static uint32 GetClosestIndustry(TileIndex tile, IndustryType type, const Industry *current)
{
- uint32 best_dist = MAX_UVALUE(uint32);
+ uint32 best_dist = UINT32_MAX;
const Industry *i;
FOR_ALL_INDUSTRIES(i) {
if (i->type != type || i == current) continue;
@@ -158,7 +158,7 @@
{
uint32 GrfID = GetRegister(0x100); ///< Get the GRFID of the definition to look for in register 100h
IndustryType ind_index;
- uint32 closest_dist = MAX_UVALUE(uint32);
+ uint32 closest_dist = UINT32_MAX;
byte count = 0;
/* Determine what will be the industry type to look for */
--- a/src/news_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/news_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -51,7 +51,7 @@
{
Player *p = GetPlayer((PlayerID)(ni->data_b));
DrawPlayerFace(p->face, p->player_color, 2, 23);
- GfxFillRect(3, 23, 3 + 91, 23 + 118, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE));
+ GfxFillRect(3, 23, 3 + 91, 23 + 118, PALETTE_TO_STRUCT_GREY, FILLRECT_RECOLOR);
SetDParam(0, p->index);
@@ -233,7 +233,7 @@
ViewPort *vp = this->viewport;
GfxFillRect(vp->left - this->left, vp->top - this->top,
vp->left - this->left + vp->width - 1, vp->top - this->top + vp->height - 1,
- (this->ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY) | (1 << USE_COLORTABLE)
+ (this->ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY), FILLRECT_RECOLOR
);
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
--- a/src/oldloader.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/oldloader.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -867,9 +867,13 @@
if (!LoadChunk(ls, p, player_chunk)) return false;
+ if (_old_string_id == 0) {
+ p->is_active = false;
+ return true;
+ }
+
p->name_1 = RemapOldStringID(_old_string_id);
p->president_name_1 = RemapOldStringID(_old_string_id_2);
- p->player_money = p->player_money;
if (num == 0) {
/* If the first player has no name, make sure we call it UNNAMED */
@@ -1411,7 +1415,7 @@
OCL_VAR ( OC_FILE_U32 | OC_VAR_I64, 1, &_economy.max_loan ),
OCL_VAR ( OC_FILE_U32 | OC_VAR_I64, 1, &_economy.max_loan_unround ),
- OCL_VAR ( OC_FILE_U16 | OC_VAR_U32, 1, &_economy.fluct ),
+ OCL_VAR ( OC_INT16, 1, &_economy.fluct ),
OCL_VAR ( OC_UINT16, 1, &_disaster_delay ),
--- a/src/openttd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/openttd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -693,6 +693,8 @@
static void MakeNewGameDone()
{
+ SettingsDisableElrail(_settings_game.vehicle.disable_elrails);
+
/* In a dedicated server, the server does not play */
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 0) {
SetLocalPlayer(PLAYER_SPECTATOR);
@@ -709,7 +711,6 @@
_current_player = _local_player;
DoCommandP(0, (_settings_client.gui.autorenew << 15 ) | (_settings_client.gui.autorenew_months << 16) | 4, _settings_client.gui.autorenew_money, NULL, CMD_SET_AUTOREPLACE);
- SettingsDisableElrail(_settings_game.vehicle.disable_elrails);
InitializeRailGUI();
#ifdef ENABLE_NETWORK
--- a/src/order_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/order_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -298,6 +298,18 @@
}
}
+static uint GetOrderDistance(const Order *prev, const Order *cur, const Vehicle *v, int conditional_depth = 0)
+{
+ if (cur->IsType(OT_CONDITIONAL)) {
+ if (conditional_depth > v->num_orders) return 0;
+
+ conditional_depth++;
+ return max(GetOrderDistance(prev, &v->orders[cur->GetConditionSkipToOrder()], v, conditional_depth),
+ GetOrderDistance(prev, (prev + 1 == &v->orders[v->num_orders]) ? v->orders : (prev + 1), v, conditional_depth));
+ }
+
+ return DistanceManhattan(GetOrderLocation(*prev), GetOrderLocation(*cur));
+}
/** Add an order to the orderlist of a vehicle.
* @param tile unused
@@ -419,7 +431,7 @@
}
if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN && v->type != VEH_ROAD) return CMD_ERROR;
- if (new_order.GetDepotOrderType() & ~ODTFB_PART_OF_ORDERS) return CMD_ERROR;
+ if (new_order.GetDepotOrderType() & ~(ODTFB_PART_OF_ORDERS | ((new_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0 ? ODTFB_SERVICE : 0))) return CMD_ERROR;
if (new_order.GetDepotActionType() & ~ODATFB_NEAREST_DEPOT) return CMD_ERROR;
break;
}
@@ -468,10 +480,7 @@
if (++n == sel_ord && prev != NULL) break;
}
if (prev != NULL) {
- uint dist = DistanceManhattan(
- GetOrderLocation(*prev),
- GetOrderLocation(new_order)
- );
+ uint dist = GetOrderDistance(prev, &new_order, v);
if (dist >= 130) {
return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO);
}
--- a/src/players.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/players.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -672,7 +672,7 @@
* if p1 = 2, then
* - p2 = minimum amount of money available
* if p1 = 3, then:
- * - p1 bits 8-15 = engine group
+ * - p1 bits 16-31 = engine group
* - p2 bits 0-15 = old engine type
* - p2 bits 16-31 = new engine type
* if p1 = 4, then:
--- a/src/rail_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/rail_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -1112,6 +1112,7 @@
if (!ValParamTrackOrientation(track) ||
!IsTileType(tile, MP_RAILWAY) ||
+ !HasTrack(tile, track) ||
!EnsureNoTrainOnTrack(tile, track) ||
!HasSignalOnTrack(tile, track)) {
return CMD_ERROR;
--- a/src/rail_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/rail_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -1070,7 +1070,7 @@
if (statspec != NULL && statspec->name != 0) {
if (HasBit(statspec->callbackmask, CBM_STATION_AVAIL) && GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) {
- GfxFillRect(8, y - 2, 127, y + 10, (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(8, y - 2, 127, y + 10, 0, FILLRECT_CHECKER);
}
DrawStringTruncated(9, y, statspec->name, i == _railstation.station_type ? TC_WHITE : TC_BLACK, 118);
@@ -1606,7 +1606,7 @@
if (statspec != NULL &&
HasBit(statspec->callbackmask, CBM_STATION_AVAIL) &&
GB(GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE), 0, 8) == 0) {
- GfxFillRect(4 + i * 68, 18, 67 + i * 68, 75, (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(4 + i * 68, 18, 67 + i * 68, 75, 0, FILLRECT_CHECKER);
}
}
}
--- a/src/road_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/road_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -576,6 +576,7 @@
case MP_TUNNELBRIDGE:
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return CMD_ERROR;
+ if (MirrorRoadBits(DiagDirToRoadBits(GetTunnelBridgeDirection(tile))) != pieces) return CMD_ERROR;
if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
/* Don't allow adding roadtype to the bridge/tunnel when vehicles are already driving on it */
if (GetVehicleTunnelBridge(tile, GetOtherTunnelBridgeEnd(tile)) != NULL) return CMD_ERROR;
@@ -734,6 +735,7 @@
if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
+ _error_message = INVALID_STRING_ID;
CommandCost ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
if (CmdFailed(ret)) {
if (_error_message != STR_1007_ALREADY_BUILT) return CMD_ERROR;
--- a/src/road_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/road_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -704,7 +704,7 @@
static const WindowDesc _build_road_scen_desc = {
WDP_AUTO, WDP_AUTO, 197, 36, 197, 36,
- WC_SCEN_BUILD_ROAD, WC_NONE,
+ WC_SCEN_BUILD_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
_build_road_scen_widgets,
};
--- a/src/roadveh_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/roadveh_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -730,7 +730,7 @@
TileIndex dest = INVALID_TILE;
const RoadStop *rs = GetStation(station)->GetPrimaryRoadStop(this);
if (rs != NULL) {
- uint mindist = MAX_UVALUE(uint);
+ uint mindist = UINT_MAX;
for (; rs != NULL; rs = rs->GetNextRoadStop(this)) {
uint dist = DistanceManhattan(this->tile, rs->xy);
@@ -1724,7 +1724,7 @@
v->u.road.frame == RVC_DRIVE_THROUGH_STOP_FRAME))) {
RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile));
- Station* st = GetStationByTile(v->tile);
+ Station *st = GetStationByTile(v->tile);
/* Vehicle is at the stop position (at a bay) in a road stop.
* Note, if vehicle is loading/unloading it has already been handled,
@@ -1759,19 +1759,13 @@
v->last_station_visited = st->index;
- if (IsDriveThroughStopTile(v->tile) || v->current_order.GetDestination() == st->index) {
+ if (IsDriveThroughStopTile(v->tile) || (v->current_order.IsType(OT_GOTO_STATION) && v->current_order.GetDestination() == st->index)) {
RoadVehArrivesAt(v, st);
v->BeginLoading();
- } else {
- v->current_order.MakeLeaveStation();
- InvalidateVehicleOrder(v);
+ return false;
}
-
- return false;
- }
-
- /* Vehicle is ready to leave a bay in a road stop */
- if (!v->current_order.IsType(OT_GOTO_DEPOT)) {
+ } else {
+ /* Vehicle is ready to leave a bay in a road stop */
if (rs->IsEntranceBusy()) {
/* Road stop entrance is busy, so wait as there is nowhere else to go */
v->cur_speed = 0;
--- a/src/roadveh_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/roadveh_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -23,7 +23,7 @@
void DrawRoadVehDetails(const Vehicle *v, int x, int y)
{
- uint y_offset = RoadVehHasArticPart(v) ? 15 :0;
+ uint y_offset = RoadVehHasArticPart(v) ? 15 : 0;
StringID str;
SetDParam(0, v->engine_type);
@@ -62,6 +62,8 @@
DrawStringTruncated(x, y + 10 + y_offset, STR_JUST_STRING, TC_BLUE, 380 - x);
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+ if (u->cargo_cap == 0) continue;
+
str = STR_8812_EMPTY;
if (!u->cargo.Empty()) {
SetDParam(0, u->cargo_type);
--- a/src/settings_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/settings_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -27,6 +27,7 @@
#include "widgets/dropdown_type.h"
#include "widgets/dropdown_func.h"
#include "station_func.h"
+#include <map>
#include "table/sprites.h"
#include "table/strings.h"
@@ -1005,7 +1006,7 @@
*/
void DrawArrowButtons(int x, int y, int ctab, byte state, bool clickable_left, bool clickable_right)
{
- int color = (1 << PALETTE_MODIFIER_GREYOUT) | _colour_gradient[COLOUR_YELLOW][2];
+ int color = _colour_gradient[COLOUR_YELLOW][2];
DrawFrameRect(x, y + 1, x + 9, y + 9, ctab, (state == 1) ? FR_LOWERED : FR_NONE);
DrawFrameRect(x + 10, y + 1, x + 19, y + 9, ctab, (state == 2) ? FR_LOWERED : FR_NONE);
@@ -1014,9 +1015,9 @@
/* Grey out the buttons that aren't clickable */
if (!clickable_left)
- GfxFillRect(x + 1, y + 1, x + 1 + 8, y + 8, color);
+ GfxFillRect(x + 1, y + 1, x + 1 + 8, y + 8, color, FILLRECT_CHECKER);
if (!clickable_right)
- GfxFillRect(x + 11, y + 1, x + 11 + 8, y + 8, color);
+ GfxFillRect(x + 11, y + 1, x + 11 + 8, y + 8, color, FILLRECT_CHECKER);
}
/** These are not, strickly speaking, widget enums,
--- a/src/spritecache.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/spritecache.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -24,10 +24,11 @@
struct SpriteCache {
void *ptr;
+ size_t file_pos;
uint32 id;
- size_t file_pos;
uint16 file_slot;
int16 lru;
+ bool real_sprite; ///< In some cases a single sprite is misused by two NewGRFs. Once as real sprite and once as non-real sprite. If the non-real sprite gets into the cache it might be drawn as real sprite which causes enormous trouble.
};
@@ -176,6 +177,7 @@
byte *dest = (byte *)AllocSprite(num);
sc->ptr = dest;
+ sc->real_sprite = false;
FioReadBlock(dest, num);
return sc->ptr;
@@ -217,9 +219,13 @@
}
}
+ sc->real_sprite = false;
+
return sc->ptr;
}
+ sc->real_sprite = true;
+
if (!real_sprite) {
static byte warning_level = 0;
DEBUG(sprite, warning_level, "Tried to load real sprite #%d as a non sprite. Probable cause: NewGRF interference", id);
@@ -255,6 +261,7 @@
sc->ptr = NULL;
sc->lru = 0;
sc->id = file_sprite_id;
+ sc->real_sprite = false;
return true;
}
@@ -269,6 +276,7 @@
scnew->file_pos = scold->file_pos;
scnew->ptr = NULL;
scnew->id = scold->id;
+ scnew->real_sprite = scold->real_sprite;
}
@@ -453,7 +461,7 @@
p = sc->ptr;
/* Load the sprite, if it is not loaded, yet */
- if (p == NULL) p = ReadSprite(sc, sprite, real_sprite);
+ if (p == NULL || sc->real_sprite != real_sprite) p = ReadSprite(sc, sprite, real_sprite);
return p;
}
--- a/src/station_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/station_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -168,16 +168,15 @@
/** Sort stations by their waiting cargo */
static int CDECL StationWaitingSorter(const Station* const *a, const Station* const *b)
{
- Money sum1 = 0;
- Money sum2 = 0;
+ Money diff = 0;
for (CargoID j = 0; j < NUM_CARGO; j++) {
if (!HasBit(cargo_filter, j)) continue;
- if (!(*a)->goods[j].cargo.Empty()) sum1 += GetTransportedGoodsIncome((*a)->goods[j].cargo.Count(), 20, 50, j);
- if (!(*b)->goods[j].cargo.Empty()) sum2 += GetTransportedGoodsIncome((*b)->goods[j].cargo.Count(), 20, 50, j);
+ if (!(*a)->goods[j].cargo.Empty()) diff += GetTransportedGoodsIncome((*a)->goods[j].cargo.Count(), 20, 50, j);
+ if (!(*b)->goods[j].cargo.Empty()) diff -= GetTransportedGoodsIncome((*b)->goods[j].cargo.Count(), 20, 50, j);
}
- return ClampToI32(sum1 - sum2);
+ return ClampToI32(diff);
}
/** Sort stations by their rating */
--- a/src/table/sprites.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/table/sprites.h Wed Jul 09 13:32:13 2008 +0000
@@ -1471,12 +1471,6 @@
PALETTE_MODIFIER_TRANSPARENT = TRANSPARENT_BIT,
///this bit is set when a recoloring process is in action
PALETTE_MODIFIER_COLOR = RECOLOR_BIT,
-
- //This is used for the GfxFillRect function
- ///Used to draw a "grey out" rectangle. @see GfxFillRect
- PALETTE_MODIFIER_GREYOUT = TRANSPARENT_BIT,
- ///Set when a colortable mode is used. @see GfxFillRect
- USE_COLORTABLE = RECOLOR_BIT,
};
/** Masks needed for sprite operations.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tar_type.h Wed Jul 09 13:32:13 2008 +0000
@@ -0,0 +1,33 @@
+/* $Id$ */
+
+#ifndef TAR_TYPE_H
+#define TAR_TYPE_H
+
+/** @file tar_type.h Structs, typedefs and macros used for TAR file handling. */
+
+#include <map>
+#include <string>
+
+/** The define of a TarList. */
+struct TarListEntry {
+ const char *filename;
+ const char *dirname;
+};
+
+struct TarFileListEntry {
+ TarListEntry *tar;
+ size_t size;
+ size_t position;
+};
+
+typedef std::map<std::string, TarListEntry *> TarList;
+typedef std::map<std::string, TarFileListEntry> TarFileList;
+extern TarList _tar_list;
+extern TarFileList _tar_filelist;
+
+#define FOR_ALL_TARS(tar) for (tar = _tar_filelist.begin(); tar != _tar_filelist.end(); tar++)
+
+typedef bool FioTarFileListCallback(const char *filename, int size, void *userdata);
+FILE *FioTarFileList(const char *tar, const char *mode, size_t *filesize, FioTarFileListCallback *callback, void *userdata);
+
+#endif /* TAR_TYPE_H */
--- a/src/terraform_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/terraform_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -131,12 +131,6 @@
case DDSP_CREATE_DESERT:
GenerateDesertArea(end_tile, start_tile);
break;
- case DDSP_CREATE_WATER:
- DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
- break;
- case DDSP_CREATE_RIVER:
- DoCommandP(end_tile, start_tile, 2, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_PLACE_RIVERS));
- break;
default:
return false;
}
@@ -368,8 +362,6 @@
DoCommandP(tile, SLOPE_N, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_MSG(msg));
} else {
- SndPlayTileFx(SND_1F_SPLAT, tile);
-
assert(_terraform_size != 0);
/* check out for map overflows */
sizex = min(MapSizeX() - TileX(tile) - 1, _terraform_size);
@@ -377,6 +369,8 @@
if (sizex == 0 || sizey == 0) return;
+ SndPlayTileFx(SND_1F_SPLAT, tile);
+
if (mode != 0) {
/* Raise land */
h = 15; // XXX - max height
@@ -443,34 +437,23 @@
VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT);
}
-static void PlaceProc_WaterArea(TileIndex tile)
-{
- VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_WATER);
-}
-
-static void PlaceProc_RiverArea(TileIndex tile)
-{
- VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_RIVER);
-}
static const Widget _scen_edit_land_gen_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // ETTW_CLOSEBOX
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 191, 0, 13, STR_0223_LAND_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // ETTW_CAPTION
-{ WWT_STICKYBOX, RESIZE_NONE, 7, 192, 203, 0, 13, STR_NULL, STR_STICKY_BUTTON}, // ETTW_STICKY
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 203, 14, 102, 0x0, STR_NULL}, // ETTW_BACKGROUND
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 150, 0, 13, STR_0223_LAND_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS}, // ETTW_CAPTION
+{ WWT_STICKYBOX, RESIZE_NONE, 7, 151, 162, 0, 13, STR_NULL, STR_STICKY_BUTTON}, // ETTW_STICKY
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 162, 14, 102, 0x0, STR_NULL}, // ETTW_BACKGROUND
{ WWT_IMGBTN, RESIZE_NONE, 14, 2, 23, 16, 37, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, // ETTW_DEMOLISH
{ WWT_IMGBTN, RESIZE_NONE, 14, 24, 45, 16, 37, SPR_IMG_TERRAFORM_DOWN, STR_018E_LOWER_A_CORNER_OF_LAND}, // ETTW_LOWER_LAND
{ WWT_IMGBTN, RESIZE_NONE, 14, 46, 67, 16, 37, SPR_IMG_TERRAFORM_UP, STR_018F_RAISE_A_CORNER_OF_LAND}, // ETTW_RAISE_LAND
{ WWT_IMGBTN, RESIZE_NONE, 14, 68, 89, 16, 37, SPR_IMG_LEVEL_LAND, STR_LEVEL_LAND_TOOLTIP}, // ETTW_LEVEL_LAND
-{ WWT_IMGBTN, RESIZE_NONE, 14, 90, 111, 16, 37, SPR_IMG_BUILD_CANAL, STR_CREATE_LAKE}, // ETTW_BUILD_CANAL
-{ WWT_IMGBTN, RESIZE_NONE, 14, 112, 133, 16, 37, SPR_IMG_BUILD_RIVER, STR_CREATE_RIVER}, // ETTW_BUILD_RIVER
-{ WWT_IMGBTN, RESIZE_NONE, 14, 134, 156, 16, 37, SPR_IMG_ROCKS, STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE}, // ETTW_PLACE_ROCKS
-{ WWT_IMGBTN, RESIZE_NONE, 14, 157, 179, 16, 37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL}, // ETTW_PLACE_DESERT_LIGHTHOUSE XXX - dynamic
-{ WWT_IMGBTN, RESIZE_NONE, 14, 180, 201, 16, 37, SPR_IMG_TRANSMITTER, STR_028E_PLACE_TRANSMITTER}, // ETTW_PLACE_TRANSMITTER
+{ WWT_IMGBTN, RESIZE_NONE, 14, 90, 111, 16, 37, SPR_IMG_ROCKS, STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE}, // ETTW_PLACE_ROCKS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 112, 133, 16, 37, SPR_IMG_LIGHTHOUSE_DESERT, STR_NULL}, // ETTW_PLACE_DESERT_LIGHTHOUSE XXX - dynamic
+{ WWT_IMGBTN, RESIZE_NONE, 14, 134, 156, 16, 37, SPR_IMG_TRANSMITTER, STR_028E_PLACE_TRANSMITTER}, // ETTW_PLACE_TRANSMITTER
{ WWT_IMGBTN, RESIZE_NONE, 14, 150, 161, 45, 56, SPR_ARROW_UP, STR_0228_INCREASE_SIZE_OF_LAND_AREA}, // ETTW_INCREASE_SIZE
{ WWT_IMGBTN, RESIZE_NONE, 14, 150, 161, 58, 69, SPR_ARROW_DOWN, STR_0229_DECREASE_SIZE_OF_LAND_AREA}, // ETTW_DECREASE_SIZE
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 24, 179, 76, 87, STR_SE_NEW_WORLD, STR_022A_GENERATE_RANDOM_LAND}, // ETTW_NEW_SCENARIO
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 24, 179, 89, 100, STR_022B_RESET_LANDSCAPE, STR_RESET_LANDSCAPE_TOOLTIP}, // ETTW_RESET_LANDSCAPE
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 161, 76, 87, STR_SE_NEW_WORLD, STR_022A_GENERATE_RANDOM_LAND}, // ETTW_NEW_SCENARIO
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 161, 89, 100, STR_022B_RESET_LANDSCAPE, STR_RESET_LANDSCAPE_TOOLTIP}, // ETTW_RESET_LANDSCAPE
{ WIDGETS_END},
};
@@ -497,8 +480,6 @@
ETTW_LOWER_LAND, ///< Lower land button
ETTW_RAISE_LAND, ///< Raise land button
ETTW_LEVEL_LAND, ///< Level land button
- ETTW_BUILD_CANAL, ///< Build canal button
- ETTW_BUILD_RIVER, ///< Build river button
ETTW_PLACE_ROCKS, ///< Place rocks button
ETTW_PLACE_DESERT_LIGHTHOUSE, ///< Place desert button (in tropical climate) / place lighthouse button (else)
ETTW_PLACE_TRANSMITTER, ///< Place transmitter button
@@ -533,16 +514,6 @@
HandlePlacePushButton(w, ETTW_LEVEL_LAND, SPR_CURSOR_LEVEL_LAND, VHM_POINT, PlaceProc_LevelLand);
}
-static void EditorTerraformClick_WaterArea(Window *w)
-{
- HandlePlacePushButton(w, ETTW_BUILD_CANAL, SPR_CURSOR_CANAL, VHM_RECT, PlaceProc_WaterArea);
-}
-
-static void EditorTerraformClick_RiverArea(Window *w)
-{
- HandlePlacePushButton(w, ETTW_BUILD_RIVER, SPR_CURSOR_RIVER, VHM_RECT, PlaceProc_RiverArea);
-}
-
static void EditorTerraformClick_RockyArea(Window *w)
{
HandlePlacePushButton(w, ETTW_PLACE_ROCKS, SPR_CURSOR_ROCKY_AREA, VHM_RECT, PlaceProc_RockyArea);
@@ -565,9 +536,7 @@
'E',
'R',
'T',
- 'Y',
- 'U',
- 'I'
+ 'Y'
};
typedef void OnButtonClick(Window *w);
@@ -576,8 +545,6 @@
EditorTerraformClick_LowerBigLand,
EditorTerraformClick_RaiseBigLand,
EditorTerraformClick_LevelLand,
- EditorTerraformClick_WaterArea,
- EditorTerraformClick_RiverArea,
EditorTerraformClick_RockyArea,
EditorTerraformClick_DesertLightHouse,
EditorTerraformClick_Transmitter
@@ -708,8 +675,6 @@
default: NOT_REACHED();
case DDSP_CREATE_ROCKS:
case DDSP_CREATE_DESERT:
- case DDSP_CREATE_WATER:
- case DDSP_CREATE_RIVER:
case DDSP_RAISE_AND_LEVEL_AREA:
case DDSP_LOWER_AND_LEVEL_AREA:
case DDSP_LEVEL_AREA:
@@ -728,7 +693,7 @@
};
static const WindowDesc _scen_edit_land_gen_desc = {
- WDP_AUTO, WDP_AUTO, 204, 103, 204, 103,
+ WDP_AUTO, WDP_AUTO, 163, 103, 163, 103,
WC_SCEN_LAND_GEN, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
_scen_edit_land_gen_widgets,
--- a/src/texteff.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/texteff.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -241,7 +241,7 @@
_screen.height - _chatmsg_box.y - count * 13 - 2,
_chatmsg_box.x + _chatmsg_box.width - 1,
_screen.height - _chatmsg_box.y - 2,
- PALETTE_TO_TRANSPARENT | (1 << USE_COLORTABLE) // black, but with some alpha for background
+ PALETTE_TO_TRANSPARENT, FILLRECT_RECOLOR // black, but with some alpha for background
);
/* Paint the chat messages starting with the lowest at the bottom */
--- a/src/tgp.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/tgp.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -173,14 +173,21 @@
uint total_size; //< height map total size
uint size_x; //< MapSizeX()
uint size_y; //< MapSizeY()
+
+ /**
+ * Height map accessor
+ * @param x X position
+ * @param y Y position
+ * @return height as fixed point number
+ */
+ inline height_t &height(uint x, uint y) {
+ return h[x + y * dim_x];
+ }
};
/** Global height map instance */
static HeightMap _height_map = {NULL, 0, 0, 0, 0};
-/** Height map accessors */
-#define HeightMapXY(x, y) _height_map.h[(x) + (y) * _height_map.dim_x]
-
/** Conversion: int to height_t */
#define I2H(i) ((i) << height_decimal_bits)
/** Conversion: height_t to int */
@@ -198,17 +205,21 @@
/** Walk through all items of _height_map.h */
#define FOR_ALL_TILES_IN_HEIGHT(h) for (h = _height_map.h; h < &_height_map.h[_height_map.total_size]; h++)
+/** Maximum index into array of noise amplitudes */
+static const int TGP_FREQUENCY_MAX = 6;
+
/** Noise amplitudes (multiplied by 1024)
* - indexed by "smoothness setting" and log2(frequency) */
-static const amplitude_t _amplitudes_by_smoothness_and_frequency[4][12] = {
+static const amplitude_t _amplitudes_by_smoothness_and_frequency[4][TGP_FREQUENCY_MAX + 1] = {
+ /* lowest frequncy.... ...highest (every corner) */
/* Very smooth */
- {1000, 350, 123, 43, 15, 1, 1, 0, 0, 0, 0, 0},
+ {16000, 5600, 1968, 688, 240, 16, 16},
/* Smooth */
- {1000, 1000, 403, 200, 64, 8, 1, 0, 0, 0, 0, 0},
+ {16000, 16000, 6448, 3200, 1024, 128, 16},
/* Rough */
- {1000, 1200, 800, 500, 200, 16, 4, 0, 0, 0, 0, 0},
+ {16000, 19200, 12800, 8000, 3200, 256, 64},
/* Very Rough */
- {1500, 1000, 1200, 1000, 500, 32, 20, 0, 0, 0, 0, 0},
+ {24000, 16000, 19200, 16000, 8000, 512, 320},
};
/** Desired water percentage (100% == 1024) - indexed by _settings_game.difficulty.quantity_sea_lakes */
@@ -233,7 +244,10 @@
}
-/** Allocate array of (MapSizeX()+1)*(MapSizeY()+1) heights and init the _height_map structure members */
+/**
+ * Allocate array of (MapSizeX()+1)*(MapSizeY()+1) heights and init the _height_map structure members
+ * @return true on success
+ */
static inline bool AllocHeightMap()
{
height_t *h;
@@ -261,25 +275,45 @@
_height_map.h = NULL;
}
-/** RandomHeight() generator */
+/**
+ * Generates new random height in given amplitude (generated numbers will range from - amplitude to + amplitude)
+ * @param rMax Limit of result
+ * @return generated height
+ */
static inline height_t RandomHeight(amplitude_t rMax)
{
amplitude_t ra = (Random() << 16) | (Random() & 0x0000FFFF);
height_t rh;
- /* Scale the amplitude for better resolution */
- rMax *= 16;
/* Spread height into range -rMax..+rMax */
rh = A2H(ra % (2 * rMax + 1) - rMax);
return rh;
}
-/** One interpolation and noise round */
+/**
+ * One interpolation and noise round
+ *
+ * The heights on the map are generated in an iterative process.
+ * We start off with a frequency of 1 (log_frequency == 0), and generate heights only for corners on the most coarsly mesh
+ * (i.e. only for x/y coordinates which are multiples of the minimum edge length).
+ *
+ * After this initial step the frequency is doubled (log_frequency incremented) each iteration to generate corners on the next finer mesh.
+ * The heights of the newly added corners are first set by interpolating the heights from the previous iteration.
+ * Finally noise with the given amplitude is applied to all corners of the new mesh.
+ *
+ * Generation terminates, when the frequency has reached the map size. I.e. the mesh is as fine as the map, and every corner height
+ * has been set.
+ *
+ * @param log_frequency frequency (logarithmic) to apply noise for
+ * @param amplitude Amplitude for the noise
+ * @return false if we are finished (reached the minimal step size / highest frequency)
+ */
static bool ApplyNoise(uint log_frequency, amplitude_t amplitude)
{
uint size_min = min(_height_map.size_x, _height_map.size_y);
uint step = size_min >> log_frequency;
uint x, y;
+ /* Trying to apply noise to uninitialized height map */
assert(_height_map.h != NULL);
/* Are we finished? */
@@ -290,7 +324,7 @@
for (y = 0; y <= _height_map.size_y; y += step) {
for (x = 0; x <= _height_map.size_x; x += step) {
height_t height = (amplitude > 0) ? RandomHeight(amplitude) : 0;
- HeightMapXY(x, y) = height;
+ _height_map.height(x, y) = height;
}
}
return true;
@@ -300,28 +334,30 @@
* Interpolate height values at odd x, even y tiles */
for (y = 0; y <= _height_map.size_y; y += 2 * step) {
for (x = 0; x < _height_map.size_x; x += 2 * step) {
- height_t h00 = HeightMapXY(x + 0 * step, y);
- height_t h02 = HeightMapXY(x + 2 * step, y);
+ height_t h00 = _height_map.height(x + 0 * step, y);
+ height_t h02 = _height_map.height(x + 2 * step, y);
height_t h01 = (h00 + h02) / 2;
- HeightMapXY(x + 1 * step, y) = h01;
+ _height_map.height(x + 1 * step, y) = h01;
}
}
/* Interpolate height values at odd y tiles */
for (y = 0; y < _height_map.size_y; y += 2 * step) {
for (x = 0; x <= _height_map.size_x; x += step) {
- height_t h00 = HeightMapXY(x, y + 0 * step);
- height_t h20 = HeightMapXY(x, y + 2 * step);
+ height_t h00 = _height_map.height(x, y + 0 * step);
+ height_t h20 = _height_map.height(x, y + 2 * step);
height_t h10 = (h00 + h20) / 2;
- HeightMapXY(x, y + 1 * step) = h10;
+ _height_map.height(x, y + 1 * step) = h10;
}
}
+ /* Add noise for next higher frequency (smaller steps) */
for (y = 0; y <= _height_map.size_y; y += step) {
for (x = 0; x <= _height_map.size_x; x += step) {
- HeightMapXY(x, y) += RandomHeight(amplitude);
+ _height_map.height(x, y) += RandomHeight(amplitude);
}
}
+
return (step > 1);
}
@@ -332,23 +368,31 @@
uint iteration_round = 0;
amplitude_t amplitude;
bool continue_iteration;
- uint log_size_min, log_frequency_min;
+ int log_size_min, log_frequency_min;
int log_frequency;
- /* Find first power of two that fits */
- for (log_size_min = 6; (1U << log_size_min) < size_min; log_size_min++) { }
- log_frequency_min = log_size_min - 6;
+ /* Find first power of two that fits, so that later log_frequency == TGP_FREQUENCY_MAX in the last iteration */
+ for (log_size_min = TGP_FREQUENCY_MAX; (1U << log_size_min) < size_min; log_size_min++) { }
+ log_frequency_min = log_size_min - TGP_FREQUENCY_MAX;
+ /* Zero must be part of the iteration, else initialization will fail. */
+ assert(log_frequency_min >= 0);
+
+ /* Keep increasing the frequency until we reach the step size equal to one tile */
do {
log_frequency = iteration_round - log_frequency_min;
if (log_frequency >= 0) {
+ /* Apply noise for the next frequency */
+ assert(log_frequency <= TGP_FREQUENCY_MAX);
amplitude = _amplitudes_by_smoothness_and_frequency[_settings_game.game_creation.tgen_smoothness][log_frequency];
} else {
+ /* Amplitude for the low frequencies on big maps is 0, i.e. initialise with zero height */
amplitude = 0;
}
continue_iteration = ApplyNoise(iteration_round, amplitude);
iteration_round++;
- } while(continue_iteration);
+ } while (continue_iteration);
+ assert(log_frequency == TGP_FREQUENCY_MAX);
}
/** Returns min, max and average height from height map */
@@ -356,7 +400,7 @@
{
height_t h_min, h_max, h_avg, *h;
int64 h_accu = 0;
- h_min = h_max = HeightMapXY(0, 0);
+ h_min = h_max = _height_map.height(0, 0);
/* Get h_min, h_max and accumulate heights into h_accu */
FOR_ALL_TILES_IN_HEIGHT(h) {
@@ -380,7 +424,7 @@
int *hist = hist_buf - h_min;
height_t *h;
- /* Fill histogram */
+ /* Count the heights and fill the histogram */
FOR_ALL_TILES_IN_HEIGHT(h) {
assert(*h >= h_min);
assert(*h <= h_max);
@@ -544,7 +588,7 @@
max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
for (x = 0; x < max_x; x++) {
- HeightMapXY(x, y) = 0;
+ _height_map.height(x, y) = 0;
}
/* Bottom left */
@@ -552,7 +596,7 @@
max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
for (x = _height_map.size_x; x > (_height_map.size_x - 1 - max_x); x--) {
- HeightMapXY(x, y) = 0;
+ _height_map.height(x, y) = 0;
}
}
@@ -563,7 +607,7 @@
max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
for (y = 0; y < max_y; y++) {
- HeightMapXY(x, y) = 0;
+ _height_map.height(x, y) = 0;
}
@@ -572,7 +616,7 @@
max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
for (y = _height_map.size_y; y > (_height_map.size_y - 1 - max_y); y--) {
- HeightMapXY(x, y) = 0;
+ _height_map.height(x, y) = 0;
}
}
}
@@ -595,21 +639,21 @@
/* Search for the coast (first non-water tile) */
for (x = org_x, y = org_y, ed = 0; IsValidXY(x, y) && ed < max_coast_dist_from_edge; x += dir_x, y += dir_y, ed++) {
/* Coast found? */
- if (HeightMapXY(x, y) > 15) break;
+ if (_height_map.height(x, y) > 15) break;
/* Coast found in the neighborhood? */
- if (IsValidXY(x + dir_y, y + dir_x) && HeightMapXY(x + dir_y, y + dir_x) > 0) break;
+ if (IsValidXY(x + dir_y, y + dir_x) && _height_map.height(x + dir_y, y + dir_x) > 0) break;
/* Coast found in the neighborhood on the other side */
- if (IsValidXY(x - dir_y, y - dir_x) && HeightMapXY(x - dir_y, y - dir_x) > 0) break;
+ if (IsValidXY(x - dir_y, y - dir_x) && _height_map.height(x - dir_y, y - dir_x) > 0) break;
}
/* Coast found or max_coast_dist_from_edge has been reached.
* Soften the coast slope */
for (depth = 0; IsValidXY(x, y) && depth <= max_coast_Smooth_depth; depth++, x += dir_x, y += dir_y) {
- h = HeightMapXY(x, y);
+ h = _height_map.height(x, y);
h = min(h, h_prev + (4 + depth)); // coast softening formula
- HeightMapXY(x, y) = h;
+ _height_map.height(x, y) = h;
h_prev = h;
}
}
@@ -642,14 +686,14 @@
int x, y;
for (y = 1; y <= (int)_height_map.size_y; y++) {
for (x = 1; x <= (int)_height_map.size_x; x++) {
- height_t h_max = min(HeightMapXY(x - 1, y), HeightMapXY(x, y - 1)) + dh_max;
- if (HeightMapXY(x, y) > h_max) HeightMapXY(x, y) = h_max;
+ height_t h_max = min(_height_map.height(x - 1, y), _height_map.height(x, y - 1)) + dh_max;
+ if (_height_map.height(x, y) > h_max) _height_map.height(x, y) = h_max;
}
}
for (y = _height_map.size_y - 1; y >= 0; y--) {
for (x = _height_map.size_x - 1; x >= 0; x--) {
- height_t h_max = min(HeightMapXY(x + 1, y), HeightMapXY(x, y + 1)) + dh_max;
- if (HeightMapXY(x, y) > h_max) HeightMapXY(x, y) = h_max;
+ height_t h_max = min(_height_map.height(x + 1, y), _height_map.height(x, y + 1)) + dh_max;
+ if (_height_map.height(x, y) > h_max) _height_map.height(x, y) = h_max;
}
}
}
@@ -677,12 +721,6 @@
HeightMapSmoothSlopes(16);
}
-static inline int perlin_landXY(uint x, uint y)
-{
- return HeightMapXY(x, y);
-}
-
-
/**
* The Perlin Noise calculation using large primes
* The initial number is adjusted by two values; the generation_seed, and the
@@ -776,7 +814,7 @@
}
-/** A small helper function */
+/** A small helper function to initialize the terrain */
static void TgenSetTileHeight(TileIndex tile, int height)
{
SetTileHeight(tile, height);
@@ -808,7 +846,7 @@
/* Transfer height map into OTTD map */
for (y = 2; y < _height_map.size_y - 2; y++) {
for (x = 2; x < _height_map.size_x - 2; x++) {
- int height = H2I(HeightMapXY(x, y));
+ int height = H2I(_height_map.height(x, y));
if (height < 0) height = 0;
if (height > 15) height = 15;
TgenSetTileHeight(TileXY(x, y), height);
--- a/src/timetable_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/timetable_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -261,7 +261,7 @@
uint64 time = StrEmpty(str) ? 0 : strtoul(str, NULL, 10);
if (!_settings_client.gui.timetable_in_ticks) time *= DAY_TICKS;
- uint32 p2 = minu(time, MAX_UVALUE(uint16));
+ uint32 p2 = minu(time, UINT16_MAX);
DoCommandP(0, p1, p2, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
}
--- a/src/toolbar_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/toolbar_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -53,6 +53,17 @@
RailType _last_built_railtype;
RoadType _last_built_roadtype;
+/** This enum gathers properties of both toolbars */
+enum ToolBarProperties {
+ TBP_BUTTONWIDTH = 22, ///< width of a button
+ TBP_BUTTONHEIGHT = 22, ///< height of a button as well as the toolbars
+ TBP_DATEPANELWIDTH = 130, ///< used in scenario editor to calculate width of the toolbar.
+
+ TBP_TOOLBAR_MINBUTTON = 14, ///< references both toolbars
+ TBP_NORMAL_MAXBUTTON = 19, ///< normal toolbar has this many buttons
+ TBP_SCENARIO_MAXBUTTON = 16, ///< while the scenario has these
+};
+
enum ToolbarMode {
TB_NORMAL,
TB_UPPER,
@@ -96,7 +107,7 @@
TBSE_FASTFORWARD,
TBSE_SAVESCENARIO = 3,
TBSE_SPACERPANEL,
- TBSE_SEPARATOR,
+ TBSE_DATEPANEL,
TBSE_DATEBACKWARD,
TBSE_DATEFORWARD,
TBSE_SMALLMAP,
@@ -106,13 +117,14 @@
TBSE_TOWNGENERATE,
TBSE_INDUSTRYGENERATE,
TBSE_BUILDROAD,
+ TBSE_BUILDDOCKS,
TBSE_PLANTTREES,
TBSE_PLACESIGNS,
};
/** The idea of this enum is to allow a separation between widget position
* and _menu_clicked_procs's entry. By shifting, the "action" id is extracted and
- * kept safe for usage when reuired.
+ * kept safe for usage when required.
* @see ToolbarMenuWindow::OnMouseLoop */
enum ScenarioEditorMenuActions {
SEMA_MAP_CLICK = 17 << 8,
@@ -270,7 +282,7 @@
PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_0292_SAVE_SCENARIO, SLEME_MENUCOUNT);
}
-static void MenuClickSaveLoad(int index)
+static void MenuClickSaveLoad(int index = 0)
{
if (_game_mode == GM_EDITOR) {
switch (index) {
@@ -297,8 +309,8 @@
MME_SHOW_EXTRAVIEWPORTS,
MME_SHOW_SIGNLISTS,
MME_SHOW_TOWNDIRECTORY, ///< This entry is only used in Editor mode
- MME_MENUCOUNT_NORMAL = 3,
- MME_MENUCOUNT_EDITOR = 4,
+ MME_MENUCOUNT_NORMAL = 3,
+ MME_MENUCOUNT_EDITOR = 4,
};
static void ToolbarMapClick(Window *w)
@@ -509,7 +521,7 @@
static void ToolbarZoomInClick(Window *w)
{
if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(TBN_ZOOMIN);
+ w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMIN : (byte)TBN_ZOOMIN);
SndPlayFx(SND_15_BEEP);
}
}
@@ -519,7 +531,7 @@
static void ToolbarZoomOutClick(Window *w)
{
if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(TBN_ZOOMOUT);
+ w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMOUT : (byte)TBN_ZOOMOUT);
SndPlayFx(SND_15_BEEP);
}
}
@@ -557,7 +569,7 @@
static void ToolbarBuildWaterClick(Window *w)
{
- PopupMainToolbMenu(w, TBN_WATER, STR_9800_DOCK_CONSTRUCTION, 1);
+ PopupMainToolbMenu(w, TBN_WATER, STR_9800_WATERWAYS_CONSTRUCTION, 1);
}
static void MenuClickBuildWater(int index)
@@ -694,22 +706,6 @@
_left_button_clicked = false;
}
-static void ToolbarScenZoomIn(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(TBSE_ZOOMIN);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
-static void ToolbarScenZoomOut(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(TBSE_ZOOMOUT);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
static void ToolbarScenGenLand(Window *w)
{
w->HandleButtonClick(TBSE_LANDGENERATE);
@@ -740,6 +736,13 @@
ShowBuildRoadScenToolbar();
}
+static void ToolbarScenBuildDocks(Window *w)
+{
+ w->HandleButtonClick(TBSE_BUILDDOCKS);
+ SndPlayFx(SND_15_BEEP);
+ ShowBuildDocksScenToolbar();
+}
+
static void ToolbarScenPlantTrees(Window *w)
{
w->HandleButtonClick(TBSE_PLANTTREES);
@@ -767,15 +770,15 @@
uint spacing;
uint widgetcount = w->widget_count - 1;
- if (w->width >= (int)widgetcount * 22) {
- button_width = 22;
+ if (w->width >= (int)widgetcount * TBP_BUTTONWIDTH) {
+ button_width = TBP_BUTTONWIDTH;
spacing = w->width - (widgetcount * button_width);
} else {
button_width = w->width / widgetcount;
spacing = 0;
}
- uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
+ static const uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
uint i = 0;
for (uint x = 0, j = 0; i < widgetcount; i++) {
if (extra_spacing_at[j] == i) {
@@ -826,10 +829,9 @@
static const byte *arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
- static const uint icon_size = 22;
- uint max_icons = max(14U, (w->width + icon_size / 2) / icon_size);
+ uint max_icons = max(TBP_TOOLBAR_MINBUTTON, (ToolBarProperties)((w->width + TBP_BUTTONWIDTH / 2) / TBP_BUTTONWIDTH));
- assert(max_icons >= 14 && max_icons <= 19);
+ assert(max_icons >= TBP_TOOLBAR_MINBUTTON && max_icons <= TBP_NORMAL_MAXBUTTON);
/* first hide all icons */
for (uint i = 0; i < w->widget_count - 1; i++) {
@@ -837,7 +839,7 @@
}
/* now activate them all on their proper positions */
- for (uint i = 0, x = 0, n = max_icons - 14; i < max_icons; i++) {
+ for (uint i = 0, x = 0, n = max_icons - TBP_TOOLBAR_MINBUTTON; i < max_icons; i++) {
uint icon = arrangements[n][i + ((_toolbar_mode == TB_LOWER) ? max_icons : 0)];
w->widget[icon].type = WWT_IMGBTN;
w->widget[icon].left = x;
@@ -898,7 +900,7 @@
{
/* Draw brown-red toolbar bg. */
GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
- GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER);
/* If spectator, disable all construction buttons
* ie : Build road, rail, ships, airports and landscaping
@@ -923,7 +925,7 @@
switch (keycode) {
case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
case WKC_F2: ShowGameOptions(); break;
- case WKC_F3: MenuClickSaveLoad(0); break;
+ case WKC_F3: MenuClickSaveLoad(); break;
case WKC_F4: ShowSmallMap(); break;
case WKC_F5: ShowTownDirectory(); break;
case WKC_F6: ShowSubsidiesList(); break;
@@ -983,7 +985,7 @@
virtual void OnResize(Point new_size, Point delta)
{
- if (this->width <= 19 * 22) {
+ if (this->width <= TBP_NORMAL_MAXBUTTON * TBP_BUTTONWIDTH) {
SplitToolbar(this);
} else {
ResizeToolbar(this);
@@ -1007,45 +1009,45 @@
};
static const Widget _toolb_normal_widgets[] = {
-{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
-{ WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW},
+{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, // TBN_PAUSE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, // TBN_FASTFORWARD
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, // TBN_SETTINGS
+{ WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME}, // TBN_SAVEGAME
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP}, // TBN_SMALLMAP
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY}, // TBN_TOWNDIRECTORY
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES}, // TBN_SUBSIDIES
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY}, // TBN_STATIONS
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES}, // TBN_FINANCES
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL}, // TBN_PLAYERS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS}, // TBN_GRAPHICS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE}, // TBN_LEAGUE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW}, // TBN_INDUSTRIES
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_SWITCH_TOOLBAR, STR_EMPTY}, // switch toolbar button. only active when toolbar has been split
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY}, // TBN_TRAINS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY}, // TBN_ROADVEHS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY}, // TBN_SHIPS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY}, // TBN_AIRCRAFTS
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, // TBN_ZOOMIN
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, // TBN_ZOOMOUT
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK}, // TBN_RAILS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS}, // TBN_ROADS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, // TBN_WATER
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS}, // TBN_AIR
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // TBN_LANDSCAPE tree icon is SPR_IMG_PLANTTREES
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW}, // TBN_MUSICSOUND
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS}, // TBN_NEWSREPORT
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION}, // TBN_HELP
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_SWITCH_TOOLBAR, STR_EMPTY}, // TBN_SWITCHBAR
{ WIDGETS_END},
};
static const WindowDesc _toolb_normal_desc = {
- 0, 0, 0, 22, 640, 22,
+ 0, 0, 0, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT,
WC_MAIN_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
_toolb_normal_widgets,
@@ -1064,12 +1066,13 @@
ToolbarScenDateBackward,
ToolbarScenDateForward,
ToolbarScenMapTownDir,
- ToolbarScenZoomIn,
- ToolbarScenZoomOut,
+ ToolbarZoomInClick,
+ ToolbarZoomOutClick,
ToolbarScenGenLand,
ToolbarScenGenTown,
ToolbarScenGenIndustry,
ToolbarScenBuildRoad,
+ ToolbarScenBuildDocks,
ToolbarScenPlantTrees,
ToolbarScenPlaceSign,
NULL,
@@ -1078,7 +1081,6 @@
NULL,
NULL,
NULL,
- NULL,
ToolbarMusicClick,
NULL,
ToolbarHelpClick,
@@ -1102,7 +1104,7 @@
/* Draw brown-red toolbar bg. */
GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
- GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER);
this->DrawWidgets();
@@ -1128,15 +1130,16 @@
switch (keycode) {
case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
case WKC_F2: ShowGameOptions(); break;
- case WKC_F3: MenuClickSaveLoad(0); break;
+ case WKC_F3: MenuClickSaveLoad(); break;
case WKC_F4: ToolbarScenGenLand(this); break;
case WKC_F5: ToolbarScenGenTown(this); break;
case WKC_F6: ToolbarScenGenIndustry(this); break;
case WKC_F7: ToolbarScenBuildRoad(this); break;
- case WKC_F8: ToolbarScenPlantTrees(this); break;
- case WKC_F9: ToolbarScenPlaceSign(this); break;
- case WKC_F10: ShowMusicWindow(); break;
- case WKC_F11: PlaceLandBlockInfo(); break;
+ case WKC_F8: ToolbarScenBuildDocks(this); break;
+ case WKC_F9: ToolbarScenPlantTrees(this); break;
+ case WKC_F10: ToolbarScenPlaceSign(this); break;
+ case WKC_F11: ShowMusicWindow(); break;
+ case WKC_F12: PlaceLandBlockInfo(); break;
case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
@@ -1144,13 +1147,13 @@
case WKC_NUM_PLUS:
case WKC_EQUALS:
case WKC_SHIFT | WKC_EQUALS:
- case WKC_SHIFT | WKC_F5: ToolbarScenZoomIn(this); break;
+ case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break;
/* those following are all fall through */
case WKC_NUM_MINUS:
case WKC_MINUS:
case WKC_SHIFT | WKC_MINUS:
- case WKC_SHIFT | WKC_F6: ToolbarScenZoomOut(this); break;
+ case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
case 'L': ShowEditorTerraformToolbar(); break;
case 'M': ShowSmallMap(); break;
@@ -1167,23 +1170,23 @@
virtual void OnResize(Point new_size, Point delta)
{
- /* There are 15 buttons plus some spacings if the space allows it.
+ /* There are 16 buttons plus some spacings if the space allows it.
* Furthermore there are two panels of which one is non - essential
- * and that one can be removed is the space is too small. */
+ * and that one can be removed if the space is too small. */
uint buttons_width;
uint spacing;
- static int normal_min_width = (15 * 22) + (2 * 130);
- static int one_less_panel_min_width = (15 * 22) + 130;
+ static const int normal_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + (2 * TBP_DATEPANELWIDTH);
+ static const int one_less_panel_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + TBP_DATEPANELWIDTH;
if (this->width >= one_less_panel_min_width) {
- buttons_width = 15 * 22;
+ buttons_width = TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH;
spacing = this->width - ((this->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
} else {
- buttons_width = this->width - 130;
+ buttons_width = this->width - TBP_DATEPANELWIDTH;
spacing = 0;
}
- uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
+ static const uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 17, 0 };
for (uint i = 0, x = 0, j = 0, b = 0; i < this->widget_count; i++) {
switch (i) {
@@ -1195,18 +1198,18 @@
continue;
}
- x += 130;
+ x += TBP_DATEPANELWIDTH;
this->widget[i].right = x - 1;
break;
- case TBSE_SEPARATOR: {
+ case TBSE_DATEPANEL: {
int offset = x - this->widget[i].left;
this->widget[i + 1].left += offset;
this->widget[i + 1].right += offset;
this->widget[i + 2].left += offset;
this->widget[i + 2].right += offset;
this->widget[i].left = x;
- x += 130;
+ x += TBP_DATEPANELWIDTH;
this->widget[i].right = x - 1;
i += 2;
} break;
@@ -1215,9 +1218,9 @@
if (this->widget[i].bottom == 0) continue;
this->widget[i].left = x;
- x += buttons_width / (15 - b);
+ x += buttons_width / (TBP_SCENARIO_MAXBUTTON - b);
this->widget[i].right = x - 1;
- buttons_width -= buttons_width / (15 - b);
+ buttons_width -= buttons_width / (TBP_SCENARIO_MAXBUTTON - b);
b++;
break;
}
@@ -1251,30 +1254,30 @@
};
static const Widget _toolb_scen_widgets[] = {
-{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
+{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, // TBSE_PAUSE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, // TBSE_FASTFORWARD
{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
-{WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
-
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 0, 0, 21, 0x0, STR_NULL},
-
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 129, 0, 21, 0x0, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE},
+{WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO}, // TBSE_SAVESCENARIO
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 0, 0, 21, 0x0, STR_NULL}, // TBSE_SPACERPANEL
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN},
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 129, 0, 21, 0x0, STR_NULL}, // TBSE_DATEPANEL
+{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE}, // TBSE_DATEBACKWARD
+{ WWT_IMGBTN, RESIZE_NONE, 14, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE}, // TBSE_DATEFORWARD
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY}, // TBSE_SMALLMAP
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN}, // TBSE_ZOOMIN
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT}, // TBSE_ZOOMOUT
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION}, // TBSE_LANDGENERATE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION}, // TBSE_TOWNGENERATE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION}, // TBSE_INDUSTRYGENERATE
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION}, // TBSE_BUILDROAD
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS}, // TBSE_BUILDDOCKS
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES}, // TBSE_PLANTTREES
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN}, // TBSE_PLACESIGNS
+
{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
@@ -1288,7 +1291,7 @@
};
static const WindowDesc _toolb_scen_desc = {
- 0, 0, 130, 22, 640, 22,
+ 0, 0, 130, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT,
WC_MAIN_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_toolb_scen_widgets,
--- a/src/town.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/town.h Wed Jul 09 13:32:13 2008 +0000
@@ -299,6 +299,8 @@
return &_house_specs[house_id];
}
+TileIndex GetHouseNorthPart(HouseID &house);
+
/**
* Check if a TownID is valid.
* @param index to inquiry in the pool of town
--- a/src/town_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/town_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -47,6 +47,7 @@
#include "functions.h"
#include "animated_tile_func.h"
#include "date_func.h"
+#include <map>
#include "table/strings.h"
#include "table/sprites.h"
@@ -2010,7 +2011,7 @@
* @param house Is changed to the HouseID of the north tile of the same house
* @return TileDiff from the tile of the given HouseID to the north tile
*/
-static TileIndex GetHouseNorthPart(HouseID &house)
+TileIndex GetHouseNorthPart(HouseID &house)
{
if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks.
if (GetHouseSpecs(house - 1)->building_flags & TILE_SIZE_2x1) {
@@ -2181,12 +2182,13 @@
/**
* Search callback function for TownActionBuildStatue
* @param tile on which to perform the search
- * @param town_id The town_id for which we want a statue
+ * @param user_data The town_id for which we want a statue
* @return the result of the test
*/
-static bool SearchTileForStatue(TileIndex tile, uint32 town_id)
+static bool SearchTileForStatue(TileIndex tile, void *user_data)
{
- return DoBuildStatueOfCompany(tile, town_id);
+ TownID *town_id = (TownID *)user_data;
+ return DoBuildStatueOfCompany(tile, *town_id);
}
/**
@@ -2198,7 +2200,7 @@
{
TileIndex tile = t->xy;
- if (CircularTileSearch(&tile, 9, SearchTileForStatue, t->index)) {
+ if (CircularTileSearch(&tile, 9, SearchTileForStatue, &t->index)) {
SetBit(t->statues, _current_player); // Once found and built, "inform" the Town
}
}
--- a/src/town_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/town_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -113,27 +113,6 @@
return buttons;
}
-/**
- * Get the position of the Nth set bit.
- *
- * If there is no Nth bit set return -1
- *
- * @param bits The value to search in
- * @param n The Nth set bit from which we want to know the position
- * @return The position of the Nth set bit
- */
-static int GetNthSetBit(uint32 bits, int n)
-{
- if (n >= 0) {
- uint i;
- FOR_EACH_SET_BIT(i, bits) {
- n--;
- if (n < 0) return i;
- }
- }
- return -1;
-}
-
struct TownAuthorityWindow : Window {
private:
Town *town;
@@ -149,6 +128,27 @@
TWA_EXECUTE,
};
+ /**
+ * Get the position of the Nth set bit.
+ *
+ * If there is no Nth bit set return -1
+ *
+ * @param bits The value to search in
+ * @param n The Nth set bit from which we want to know the position
+ * @return The position of the Nth set bit
+ */
+ static int GetNthSetBit(uint32 bits, int n)
+ {
+ if (n >= 0) {
+ uint i;
+ FOR_EACH_SET_BIT(i, bits) {
+ n--;
+ if (n < 0) return i;
+ }
+ }
+ return -1;
+ }
+
public:
TownAuthorityWindow(const WindowDesc *desc, WindowNumber window_number) :
Window(desc, window_number), sel_index(-1)
--- a/src/tunnelbridge_cmd.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -160,15 +160,18 @@
return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
}
-bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len)
+bool CheckBridge_Stuff(BridgeType bridge_type, uint bridge_len, uint32 flags)
{
- const BridgeSpec *b = GetBridgeSpec(bridge_type);
- uint max; // max possible length of a bridge (with patch 100)
+ if (flags & DC_QUERY_COST) {
+ return bridge_len <= (_settings_game.construction.longbridges ? 100U : 16U);
+ }
if (bridge_type >= MAX_BRIDGES) return false;
+
+ const BridgeSpec *b = GetBridgeSpec(bridge_type);
if (b->avail_year > _cur_year) return false;
- max = b->max_length;
+ uint max = b->max_length;
if (max >= 16 && _settings_game.construction.longbridges) max = 100;
return b->min_length <= bridge_len && bridge_len <= max;
@@ -255,7 +258,7 @@
bridge_len = sx + sy - x - y - 1;
if (transport_type != TRANSPORT_WATER) {
/* set and test bridge length, availability */
- if (!CheckBridge_Stuff(bridge_type, bridge_len)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+ if (!CheckBridge_Stuff(bridge_type, bridge_len, flags)) return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
}
/* retrieve landscape height and ensure it's on land */
--- a/src/vehicle.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/vehicle.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -1648,7 +1648,7 @@
if (v->u.rail.track == TRACK_BIT_DEPOT) // We'll assume the train is facing outwards
return DiagDirToDiagTrackdir(GetRailDepotDirection(v->tile)); // Train in depot
- if (v->u.rail.track == TRACK_BIT_WORMHOLE) // train in tunnel, so just use his direction and assume a diagonal track
+ if (v->u.rail.track == TRACK_BIT_WORMHOLE) // train in tunnel or on bridge, so just use his direction and assume a diagonal track
return DiagDirToDiagTrackdir(DirToDiagDir(v->direction));
return TrackDirectionToTrackdir(FindFirstTrack(v->u.rail.track), v->direction);
@@ -1658,6 +1658,9 @@
// We'll assume the ship is facing outwards
return DiagDirToDiagTrackdir(GetShipDepotDirection(v->tile));
+ if (v->u.ship.state == TRACK_BIT_WORMHOLE) // ship on aqueduct, so just use his direction and assume a diagonal track
+ return DiagDirToDiagTrackdir(DirToDiagDir(v->direction));
+
return TrackDirectionToTrackdir(FindFirstTrack(v->u.ship.state), v->direction);
case VEH_ROAD:
--- a/src/vehicle_gui.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/vehicle_gui.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -219,7 +219,7 @@
}
}
}
- } while (v->type == VEH_TRAIN && (u = u->Next()) != NULL && num_lines < max_lines);
+ } while ((v->type == VEH_TRAIN || v->type == VEH_ROAD) && (u = u->Next()) != NULL && num_lines < max_lines);
list->num_lines = num_lines;
list->items = refit;
@@ -1309,7 +1309,7 @@
/* Add space for the cargo amount for each part. */
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
- height_extension += 11;
+ if (u->cargo_cap != 0) height_extension += 11;
}
ResizeWindow(this, 0, height_extension);
--- a/src/widget.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/widget.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -162,7 +162,7 @@
uint light = _colour_gradient[ctab][7];
if (flags & FR_TRANSPARENT) {
- GfxFillRect(left, top, right, bottom, PALETTE_TO_TRANSPARENT | (1 << USE_COLORTABLE));
+ GfxFillRect(left, top, right, bottom, PALETTE_TO_TRANSPARENT, FILLRECT_RECOLOR);
} else {
uint interior;
@@ -317,7 +317,7 @@
/* draw "shaded" background */
GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
- GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1, FILLRECT_CHECKER);
/* draw shaded lines */
GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
@@ -348,7 +348,7 @@
/* draw "shaded" background */
GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
- GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1, FILLRECT_CHECKER);
/* draw shaded lines */
GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
@@ -379,7 +379,7 @@
/* draw "shaded" background */
GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
- GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1, FILLRECT_CHECKER);
/* draw shaded lines */
GfxFillRect(r.left + 10, r.top + 2, r.right - 10, r.top + 2, c1);
@@ -490,7 +490,7 @@
}
if (this->IsWidgetDisabled(i)) {
- GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[wi->color & 0xF][2] | (1 << PALETTE_MODIFIER_GREYOUT));
+ GfxFillRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, _colour_gradient[wi->color & 0xF][2], FILLRECT_CHECKER);
}
}
--- a/src/widgets/dropdown.cpp Mon Jun 30 21:31:23 2008 +0000
+++ b/src/widgets/dropdown.cpp Wed Jul 09 13:32:13 2008 +0000
@@ -146,7 +146,7 @@
if (item->masked) {
GfxFillRect(x, y, x + width, y + item_height - 1,
- (1 << PALETTE_MODIFIER_GREYOUT) | _colour_gradient[this->widget[0].color][5]
+ _colour_gradient[this->widget[0].color][5], FILLRECT_CHECKER
);
}
} else {
--- a/src/window_type.h Mon Jun 30 21:31:23 2008 +0000
+++ b/src/window_type.h Wed Jul 09 13:32:13 2008 +0000
@@ -66,7 +66,7 @@
WC_SCEN_LAND_GEN,
WC_SCEN_TOWN_GEN,
WC_SCEN_INDUSTRY,
- WC_SCEN_BUILD_ROAD,
+ WC_SCEN_BUILD_TOOLBAR,
WC_BUILD_TREES,
WC_SEND_NETWORK_MSG,
WC_DROPDOWN_MENU,