(svn r11219) [NewGRF_ports] -Sync: with trunk r11035:11218.
--- a/Doxyfile Thu Sep 06 19:42:48 2007 +0000
+++ b/Doxyfile Sat Oct 06 21:16:00 2007 +0000
@@ -5,7 +5,6 @@
OUTPUT_DIRECTORY = docs/source/
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
-USE_WINDOWS_ENCODING = NO
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
@@ -186,13 +185,13 @@
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = NO
-EXPAND_ONLY_PREDEF = NO
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED =
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED = DEF_COMMAND
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
@@ -221,8 +220,6 @@
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
-MAX_DOT_GRAPH_WIDTH = 1024
-MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
--- a/Makefile.src.in Thu Sep 06 19:42:48 2007 +0000
+++ b/Makefile.src.in Sat Oct 06 21:16:00 2007 +0000
@@ -102,8 +102,14 @@
else
# Are we a git dir?
ifeq ($(shell if test -d $(SRC_DIR)/../.git; then echo 1; fi), 1)
-# Find the revision like: rXXXXM
-REV := g$(shell if head=`git rev-parse --verify HEAD 2>/dev/null`; then echo "$$head" | cut -c1-8; fi)$(shell if git diff-index HEAD | read dummy; then echo M; fi)$(shell git branch|grep '[*]'|sed 's/\* /-/;s/^-master$$//')
+# Find the revision like: gXXXXM-branch
+REV := g$(shell if head=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null`; then echo "$$head" | cut -c1-8; fi)$(shell if git diff-index HEAD | read dummy; then echo M; fi)$(shell git branch|grep '[*]' | sed 's/\* /-/;s/^-master$$//')
+else
+# Are we a hg (Mercurial) dir?
+ifeq ($(shell if test -d $(SRC_DIR)/../.hg; then echo 1; fi), 1)
+# Find the revision like: hXXXXM-branch
+REV := h$(shell if head=`LC_ALL=C hg tip 2>/dev/null`; then echo "$$head" | head -n 1 | cut -c19-26; fi)$(shell if hg status | grep -v '^?' | read dummy; then echo M; fi)$(shell hg branch | sed 's/^/-/;s/^-default$$//')
+endif
endif
endif
endif
@@ -249,15 +255,15 @@
$(BIN_DIR)/$(TTD): $(TTD)
$(Q)cp $< $@
-$(TTD): rev.o $(OBJS) $(CONFIG_CACHE_LINKER)
+$(TTD): $(OBJS) $(CONFIG_CACHE_LINKER)
$(E) '$(STAGE) Linking $@'
ifeq ($(OS), PSP)
# Because of a bug in the PSP GCC tools, linking via CXX results
# in total chaos and more problems then you can handle. So we need
# CC to link OpenTTD for PSP
- $(Q)$(CC_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
+ $(Q)$(CC_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
else
- $(Q)$(CXX_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
+ $(Q)$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
endif
ifdef STRIP
$(Q)$(STRIP) $@
@@ -275,19 +281,11 @@
# Revision files
-rev.cpp: $(CONFIG_CACHE_VERSION)
-# setting the revision number in a place, there the binary can read it
- @echo 'extern const char _openttd_revision[] = "$(REV)";' > rev.cpp
-# Some additions for MorphOS versions tag
-ifeq ($(OS),MORPHOS)
- @echo '#ifdef __MORPHOS__' >> rev.cpp
- @echo 'extern const char morphos_versions_tag[] = "\\0$$VER: OpenTTD $(REV) ('`date +%d.%m.%y`') (C) OpenTTD Team [MorphOS, PowerPC]";' >> rev.cpp
- @echo '#endif' >> rev.cpp
-endif
+$(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in
+ $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/rev.cpp
-rev.o: rev.cpp $(FILE_DEP)
- $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
- $(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $<
+$(SRC_DIR)/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/ottdres.rc.in
+ $(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s#@@VERSION@@#$(REV)#g;s#@@DATE@@#`date +%d.%m.%y`#g" > $(SRC_DIR)/ottdres.rc
FORCE:
@@ -295,10 +293,10 @@
clean:
$(E) '$(STAGE) Cleaning up object files'
- $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) rev.o rev.cpp
+ $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS)
mrproper: clean
- $(Q)rm -f rev.cpp
+ $(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/ottdres.rc
%.o:
@echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]'
--- a/changelog.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/changelog.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1,3 +1,42 @@
+0.5.3 (2007-09-15)
+------------------------------------------------------------------------
+- Fix: Possible NULL pointer dereference that could be triggered remotely (r11074)
+- Fix: Removing CMD_AUTO from some commands could remotely trigger an assertion [FS#1179] (r11040)
+- Fix: Underflow that caused overflows in the performance rating [FS#1179] (r11039)
+- Fix: [Windows] MIDI does not stop when closing openttd [FS#1164] (r11029)
+- Fix: Do not unconditionally assume that a tile has a depot (r11027)
+- Fix: Give a more correct error when building some things on tile 0 [FS#1173] (r11024)
+- Fix: Do not display income/expenses when they do not belong to a "valid" tile, like the money cheat and giving money [FS#1175] (r11021)
+- Fix: One could not give money when (s)he had too much money [FS#1174] (r11020)
+- Fix: Disallow buying/selling shares in your own company or a bankrupt company [FS#1169] (r11018)
+- Fix: Crash when quiting the game in one of the end score windows [FS#1218] (r11071)
+
+
+0.5.3-RC3 (2007-08-30)
+------------------------------------------------------------------------
+- Fix: Spectators are not allowed to issue commands (r11006)
+- Fix: Make the AI not crash when it has ships as the AI does not support them [FS#1133] (r10942)
+- Fix: Trains would not get flooded when they are at the lower part of a tile that would become a coast tile after flooding [FS#1127] (r10892)
+- Fix: Removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was [FS#1125] (r10890)
+- Fix: Some isocodes were wrong, resulting in some NewGRF not working properly for the affected languages (r10877)
+- Fix: [Windows] Do not try to minimise or restore the window when closing OpenTTD [FS#998] (r10835)
+- Fix: Trains going over bridges would get the "going down hill" accelerate bonus, which causes trains to go faster on bridges than they would be going on level land [FS#1096] (r10739)
+- Fix: Trains being split into two pieces when loading an old savegame [FS#1062] (r10735)
+- Fix: [OS/2] Fix chdir problem with open/save dialog (r10650)
+- Fix: One could not remove locks that were build in a (very) old version of OpenTTD [FS#1038] (r10593)
+- Fix: One cannot navigate using arrow keys in the game name text box [FS#1038] (r10500)
+- Fix: Ship's maximum speed wrongly shown [FS#1013] (r10497)
+- Fix: [OSX] Of the resolution is changed to something that is too high for the monitor, then it is reduced to fit the monitor size, solving several crashes and graphical glitches [FS#458] (r10410)
+- Fix: NPF was leaking memory each time it got initialized, except for the first time (r10357)
+- Fix: [YAPF] 'target_seen' flag that is set prematurely in some cases (1 tile long cached segment followed by target station) which caused asserts to trigger [FS#884] (r10199)
+
+
+0.5.3-RC2 (2007-07-07)
+------------------------------------------------------------------------
+- Fix: Visual glitches when a window is resized in the WE_CREATE callback (r10465)
+- Fix: [Windows] _wnd.has_focus was not properly set after using ALT-TAB [FS#962] (r10399)
+
+
0.5.3-RC1 (2007-06-28)
------------------------------------------------------------------------
- Feature: Make the client list window (for network games) stickyable (r10293)
--- a/config.lib Thu Sep 06 19:42:48 2007 +0000
+++ b/config.lib Sat Oct 06 21:16:00 2007 +0000
@@ -702,6 +702,9 @@
elif [ -d "$ROOT_DIR/.git" ] && [ -n "`git help`" ]; then
revision=""
log 1 "checking revision... git detection"
+ elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`hg help`" ]; then
+ revision=""
+ log 1 "checking revision... hg detection"
else
revision=""
log 1 "checking revision... no detection"
@@ -745,7 +748,7 @@
# General CFlags for BUILD
CFLAGS_BUILD=""
# General CFlags for HOST
- CFLAGS="$CFLAGS -D$os -DWITH_REV"
+ CFLAGS="$CFLAGS -D$os"
# CFlags for HOST and C-Compiler
CC_FLAGS=""
# Libs to compile. In fact this is just LDFLAGS
--- a/docs/landscape.html Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/landscape.html Sat Oct 06 21:16:00 2007 +0000
@@ -974,7 +974,7 @@
</ul>
</li>
<li>m2: index into the array of industries</li>
- <li>m5: type:<br>
+ <li>m5: type (plus m6 bit 2):<br>
<small>(note: this is not the same as the industry type, which is stored in the array of industries)</small>
<table>
@@ -1273,9 +1273,17 @@
</table>
</td>
</tr>
+ <tr>
+ <td nowrap valign=top><tt>AF</tt>..<tt>1FF</tt> </td>
+ <td align=left>NewGRF industries industry</td>
+ </tr>
</table>
</li>
<li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
+ <li>m3: animation state</li>
+ <li>m4: animation loop</li>
+ <li>m6 bits 3..5: random triggers (NewGRF)</li>
+ <li>m7: random bits (NewGRF)</li>
</ul>
</td>
</tr>
--- a/docs/landscape_grid.html Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/landscape_grid.html Sat Oct 06 21:16:00 2007 +0000
@@ -200,41 +200,17 @@
<td class="bits"><span class="free">OOOO OOOO</span></td>
</tr>
<tr>
- <td rowspan=3>8</td>
+ <td>8</td>
<td class="caption">industry</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="abuse">X</span><span class="free">OO</span><span class="abuse">X
XXXX</span></td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
- <td class="bits">XXXX XXXX</td>
- <td class="bits"><span class="free">OOOO OO</span>XX</td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
- </tr>
- <tr>
- <td>bubble/sugar/toffee,<BR>
- gold/copper/coal,<BR>
- oil wells, power station</td>
- <td class="bits">-inherit-</td>
- <td class="bits"><span class="abuse">X</span><span class="free">OOO OOOO</span></td>
- <td class="bits">-inherit-</td>
- <td class="bits">XXXX XXXX</td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
- <td class="bits">-inherit-</td>
- <td class="bits">-inherit-</td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
- </tr>
- <tr>
- <td>toy factory</td>
- <td class="bits">-inherit-</td>
- <td class="bits"><span class="abuse">X</span><span class="free">OOO OOOO</span></td>
- <td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
- <td class="bits">-inherit-</td>
- <td class="bits">-inherit-</td>
- <td class="bits"><span class="free">OOOO OOOO</span></td>
+ <td class="bits">XXXX XXXX</td>
+ <td class="bits"><span class="free">OO</span>XX XXXX</td>
+ <td class="bits">XXXX XXXX</td>
</tr>
<tr>
<td rowspan=2>9</td>
--- a/docs/openttd.6 Thu Sep 06 19:42:48 2007 +0000
+++ b/docs/openttd.6 Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
.\" Hey, EMACS: -*- nroff -*-
.\" Please adjust this date whenever revising the manpage.
-.Dd Jun 28, 2007
+.Dd Sep 15, 2007
.Dt OPENTTD 6
.Sh NAME
.Nm openttd
--- a/known-bugs.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/known-bugs.txt Sat Oct 06 21:16:00 2007 +0000
@@ -14,6 +14,7 @@
------------------------------------------------------------------------
URL: http://bugs.openttd.org
+-944 Incorrect el-rail catenary pole/wire offsets
-917 Load scenario with no towns failed without proper warning
-873 Assertion window fails to open on OSX
-820 Pillar drawing order glich, with newbridges
@@ -30,7 +31,6 @@
-501 Mouse pointer gets hidden, when draging out of window and back again. Only affects Wacom etc.
-494 Get free money abusing a stock bug
-474 Overtaking car doesn't hit the against-riding car.
--458 Crash when changing Resolution on Mac OS X (x86)
-435 Assertion window doesn't show when in fullscreen on Mac OS X
-423 Improved loading causes high CPU use with long trains
-410 Openttd in dedicated mode don't run without data files
--- a/os/debian/changelog Thu Sep 06 19:42:48 2007 +0000
+++ b/os/debian/changelog Sat Oct 06 21:16:00 2007 +0000
@@ -4,6 +4,24 @@
-- Matthijs Kooijman <m.kooijman@student.utwente.nl> Mon, 26 Feb 2007 21:07:05 +0100
+openttd (0.5.3-1) unstable; urgency=low
+
+ * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl> Sat, 15 Sep 2007 13:30:00 +0100
+
+openttd (0.5.3~rc3-1) unstable; urgency=low
+
+ * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl> Thu, 30 Aug 2007 23:30:00 +0100
+
+openttd (0.5.3~rc2-1) unstable; urgency=low
+
+ * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl> Sat, 7 Jul 2007 20:05:00 +0100
+
openttd (0.5.3~rc1-1) unstable; urgency=low
* New upstream release.
--- a/os/win32/installer/install.nsi Thu Sep 06 19:42:48 2007 +0000
+++ b/os/win32/installer/install.nsi Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
!define APPNAME "OpenTTD" ; Define application name
!define APPVERSION "0.5.3" ; Define application version
-!define INSTALLERVERSION 35 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define INSTALLERVERSION 38 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
!define APPURLLINK "http://www.openttd.org"
!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/determineversion.vbs Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,129 @@
+Option Explicit
+
+Dim FSO
+Set FSO = CreateObject("Scripting.FileSystemObject")
+
+Sub FindReplaceInFile(filename, to_find, replacement)
+ Dim file, data
+ Set file = FSO.OpenTextFile(filename, 1, 0, 0)
+ data = file.ReadAll
+ file.Close
+ data = Replace(data, to_find, replacement)
+ Set file = FSO.CreateTextFile(FileName, -1, 0)
+ file.Write data
+ file.Close
+End Sub
+
+Sub UpdateFile(version, cur_date, filename)
+ FSO.CopyFile filename & ".in", filename
+ FindReplaceInFile filename, "@@VERSION@@", version
+ FindReplaceInFile filename, "@@DATE@@", cur_date
+End Sub
+
+Sub UpdateFiles(version)
+ Dim cur_date
+ cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date)
+ UpdateFile version, cur_date, "../src/rev.cpp"
+ UpdateFile version, cur_date, "../src/ottdres.rc"
+End Sub
+
+Function DetermineSVNVersion()
+ Dim WshShell, version, url, oExec
+ Set WshShell = CreateObject("WScript.Shell")
+ On Error Resume Next
+
+ ' Try TortoiseSVN
+ ' Get the directory where TortoiseSVN (should) reside(s)
+ Dim sTortoise
+ sTortoise = WshShell.RegRead("HKLM\SOFTWARE\TortoiseSVN\Directory")
+
+ Dim file
+ ' Write some "magic" to a temporary file so we can acquire the svn revision/state
+ Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
+ file.WriteLine "r$WCREV$$WCMODS?M:$"
+ file.WriteLine "$WCURL$"
+ file.Close
+ Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
+ ' Wait till the application is finished ...
+ Do
+ OExec.StdOut.ReadLine()
+ Loop While Not OExec.StdOut.atEndOfStream
+
+ Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
+ version = file.ReadLine
+ url = file.ReadLine
+ file.Close
+
+ Set file = FSO.GetFile("tsvn_tmp")
+ file.Delete
+
+ ' Looks like there is no TortoiseSVN installed either. Then we don't know it.
+ If InStr(version, "$") Then
+ ' Reset error and version
+ Err.Clear
+ version = "norev000"
+ ' Do we have subversion installed? Check immediatelly whether we've got a modified WC.
+ Set oExec = WshShell.Exec("svnversion ../src")
+ If Err.Number = 0 Then
+ Dim modified
+ If InStr(OExec.StdOut.ReadLine(), "M") Then
+ modified = "M"
+ Else
+ modified = ""
+ End If
+
+ ' Set the environment to english
+ WshShell.Environment("PROCESS")("LANG") = "en"
+
+ ' And use svn info to get the correct revision and branch information.
+ Set oExec = WshShell.Exec("svn info ../src")
+ If Err.Number = 0 Then
+ Dim line
+ Do
+ line = OExec.StdOut.ReadLine()
+ If InStr(line, "URL") Then
+ url = line
+ End If
+ If InStr(line, "Last Changed Rev") Then
+ version = "r" & Mid(line, 19) & modified
+ End If
+ Loop While Not OExec.StdOut.atEndOfStream
+ End If
+ End If
+ End If
+
+ If version <> "norev000" Then
+ If InStr(url, "branches") Then
+ url = Mid(url, InStr(url, "branches") + 8)
+ url = Mid(url, 1, InStr(2, url, "/") - 1)
+ version = version & Replace(url, "/", "-")
+ End If
+ End If
+
+ DetermineSVNVersion = version
+End Function
+
+Function IsCachedVersion(version)
+ Dim cache_file, cached_version
+ cached_version = ""
+ Set cache_file = FSO.OpenTextFile("../config.cache.version", 1, True, 0)
+ If Not cache_file.atEndOfStream Then
+ cached_version = cache_file.ReadLine()
+ End If
+ cache_file.Close
+
+ If version <> cached_version Then
+ Set cache_file = fso.CreateTextFile("../config.cache.version", True)
+ cache_file.WriteLine(version)
+ cache_file.Close
+ IsCachedVersion = False
+ Else
+ IsCachedVersion = True
+ End If
+End Function
+
+Dim version
+version = DetermineSVNVersion
+If Not (IsCachedVersion(version) And FSO.FileExists("../src/rev.cpp") And FSO.FileExists("../src/ottdres.rc")) Then
+ UpdateFiles version
+End If
--- a/projects/openttd.vcproj Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd.vcproj Sat Oct 06 21:16:00 2007 +0000
@@ -73,7 +73,9 @@
<Tool
Name="VCPostBuildEventTool"/>
<Tool
- Name="VCPreBuildEventTool"/>
+ Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
@@ -135,7 +137,9 @@
<Tool
Name="VCPostBuildEventTool"/>
<Tool
- Name="VCPreBuildEventTool"/>
+ Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
@@ -326,6 +330,12 @@
RelativePath=".\..\src\rail.cpp">
</File>
<File
+ RelativePath=".\..\src\rev.cpp">
+ </File>
+ <File
+ RelativePath=".\..\src\road.cpp">
+ </File>
+ <File
RelativePath=".\..\src\saveload.cpp">
</File>
<File
@@ -399,6 +409,9 @@
RelativePath=".\..\src\articulated_vehicles.h">
</File>
<File
+ RelativePath=".\..\src\autoslope.h">
+ </File>
+ <File
RelativePath=".\..\src\aystar.h">
</File>
<File
@@ -573,6 +586,9 @@
RelativePath=".\..\src\newgrf_station.h">
</File>
<File
+ RelativePath=".\..\src\newgrf_storage.h">
+ </File>
+ <File
RelativePath=".\..\src\newgrf_text.h">
</File>
<File
@@ -1004,6 +1020,12 @@
RelativePath=".\..\src\blitter\32bpp_base.hpp">
</File>
<File
+ RelativePath=".\..\src\blitter\32bpp_optimized.cpp">
+ </File>
+ <File
+ RelativePath=".\..\src\blitter\32bpp_optimized.hpp">
+ </File>
+ <File
RelativePath=".\..\src\blitter\32bpp_simple.cpp">
</File>
<File
@@ -1121,6 +1143,9 @@
RelativePath=".\..\src\newgrf_station.cpp">
</File>
<File
+ RelativePath=".\..\src\newgrf_storage.cpp">
+ </File>
+ <File
RelativePath=".\..\src\newgrf_text.cpp">
</File>
<File
--- a/projects/openttd.vcproj.in Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd.vcproj.in Sat Oct 06 21:16:00 2007 +0000
@@ -73,7 +73,9 @@
<Tool
Name="VCPostBuildEventTool"/>
<Tool
- Name="VCPreBuildEventTool"/>
+ Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
@@ -135,7 +137,9 @@
<Tool
Name="VCPostBuildEventTool"/>
<Tool
- Name="VCPreBuildEventTool"/>
+ Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
--- a/projects/openttd_vs80.vcproj Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd_vs80.vcproj Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -144,6 +146,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -255,6 +259,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -350,6 +356,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -664,6 +672,14 @@
>
</File>
<File
+ RelativePath=".\..\src\rev.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\..\src\road.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\saveload.cpp"
>
</File>
@@ -760,6 +776,10 @@
>
</File>
<File
+ RelativePath=".\..\src\autoslope.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\aystar.h"
>
</File>
@@ -992,6 +1012,10 @@
>
</File>
<File
+ RelativePath=".\..\src\newgrf_storage.h"
+ >
+ </File>
+ <File
RelativePath=".\..\src\newgrf_text.h"
>
</File>
@@ -1560,6 +1584,14 @@
>
</File>
<File
+ RelativePath=".\..\src\blitter\32bpp_optimized.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\..\src\blitter\32bpp_optimized.hpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\blitter\32bpp_simple.cpp"
>
</File>
@@ -1712,6 +1744,10 @@
>
</File>
<File
+ RelativePath=".\..\src\newgrf_storage.cpp"
+ >
+ </File>
+ <File
RelativePath=".\..\src\newgrf_text.cpp"
>
</File>
--- a/projects/openttd_vs80.vcproj.in Thu Sep 06 19:42:48 2007 +0000
+++ b/projects/openttd_vs80.vcproj.in Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -144,6 +146,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -255,6 +259,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
@@ -350,6 +356,8 @@
>
<Tool
Name="VCPreBuildEventTool"
+ Description="Determining version number"
+ CommandLine=""$(InputDir)/determineversion.vbs""
/>
<Tool
Name="VCCustomBuildTool"
--- a/readme.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/readme.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,6 @@
OpenTTD README
-Last updated: 2007-06-28
-Release version: 0.5.3-RC1
+Last updated: 2007-09-15
+Release version: 0.5.3
------------------------------------------------------------------------
--- a/source.list Thu Sep 06 19:42:48 2007 +0000
+++ b/source.list Sat Oct 06 21:16:00 2007 +0000
@@ -59,6 +59,8 @@
players.cpp
queue.cpp
rail.cpp
+rev.cpp
+road.cpp
saveload.cpp
screenshot.cpp
#if SDL
@@ -100,6 +102,7 @@
aircraft.h
airport.h
articulated_vehicles.h
+autoslope.h
aystar.h
bmp.h
cargopacket.h
@@ -158,6 +161,7 @@
newgrf_sound.h
newgrf_spritegroup.h
newgrf_station.h
+newgrf_storage.h
newgrf_text.h
newgrf_town.h
newgrf_townname.h
@@ -305,6 +309,8 @@
blitter/32bpp_anim.hpp
blitter/32bpp_base.cpp
blitter/32bpp_base.hpp
+blitter/32bpp_optimized.cpp
+blitter/32bpp_optimized.hpp
blitter/32bpp_simple.cpp
blitter/32bpp_simple.hpp
blitter/8bpp_base.cpp
@@ -348,6 +354,7 @@
newgrf_sound.cpp
newgrf_spritegroup.cpp
newgrf_station.cpp
+newgrf_storage.cpp
newgrf_text.cpp
newgrf_town.cpp
newgrf_townname.cpp
--- a/src/ai/ai.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/ai.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -106,7 +106,6 @@
/* If we did a DC_EXEC, and the command did not return an error, execute it
* over the network */
- if (flags & DC_AUTO) procc |= CMD_AUTO;
if (flags & DC_NO_WATER) procc |= CMD_NO_WATER;
/* NetworkSend_Command needs _local_player to be set correctly, so
--- a/src/ai/default/default.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/default/default.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -305,7 +305,7 @@
static void AiHandleReplaceTrain(Player *p)
{
const Vehicle* v = p->ai.cur_veh;
- BackuppedOrders orderbak[1];
+ BackuppedOrders orderbak;
EngineID veh;
// wait until the vehicle reaches the depot.
@@ -318,13 +318,13 @@
if (veh != INVALID_ENGINE) {
TileIndex tile;
- BackupVehicleOrders(v, orderbak);
+ BackupVehicleOrders(v, &orderbak);
tile = v->tile;
if (CmdSucceeded(DoCommand(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON)) &&
CmdSucceeded(DoCommand(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE))) {
VehicleID veh = _new_vehicle_id;
- AiRestoreVehicleOrders(GetVehicle(veh), orderbak);
+ AiRestoreVehicleOrders(GetVehicle(veh), &orderbak);
DoCommand(0, veh, 0, DC_EXEC, CMD_START_STOP_TRAIN);
DoCommand(0, veh, _ai_service_interval, DC_EXEC, CMD_CHANGE_SERVICE_INT);
@@ -533,7 +533,6 @@
static void AiFindRandomIndustryRoute(FoundRoute *fr)
{
Industry* i;
- const IndustrySpec *indsp;
uint32 r;
CargoID cargo;
@@ -547,9 +546,8 @@
if (i == NULL) return;
// pick a random produced cargo
- indsp = GetIndustrySpec(i->type);
- cargo = indsp->produced_cargo[0];
- if (r & 1 && indsp->produced_cargo[1] != CT_INVALID) cargo = indsp->produced_cargo[1];
+ cargo = i->produced_cargo[0];
+ if (r & 1 && i->produced_cargo[1] != CT_INVALID) cargo = i->produced_cargo[1];
fr->cargo = cargo;
@@ -559,16 +557,10 @@
if (cargo != CT_GOODS && cargo != CT_FOOD) {
// pick a dest, and see if it can receive
Industry* i2 = AiFindRandomIndustry();
- if (i2 == NULL) {
- return;
- }
-
- indsp = GetIndustrySpec(i2->type);
-
- if (i == i2 ||
- (indsp->accepts_cargo[0] != cargo &&
- indsp->accepts_cargo[1] != cargo &&
- indsp->accepts_cargo[2] != cargo)) {
+ if (i2 == NULL || i == i2 ||
+ (i2->accepts_cargo[0] != cargo &&
+ i2->accepts_cargo[1] != cargo &&
+ i2->accepts_cargo[2] != cargo)) {
return;
}
@@ -671,10 +663,9 @@
}
} else {
const Industry* i = (const Industry*)fr->from;
- const IndustrySpec *indsp = GetIndustrySpec(i->type);
-
- if (i->last_month_pct_transported[fr->cargo != indsp->produced_cargo[0]] > 0x99 ||
- i->last_month_production[fr->cargo != indsp->produced_cargo[0]] == 0) {
+
+ if (i->last_month_pct_transported[fr->cargo != i->produced_cargo[0]] > 0x99 ||
+ i->last_month_production[fr->cargo != i->produced_cargo[0]] == 0) {
return false;
}
}
--- a/src/ai/trolly/trolly.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ai/trolly/trolly.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -270,7 +270,6 @@
}
if (type == AI_INDUSTRY) {
const Industry* i = GetIndustry(ic);
- const IndustrySpec *indsp = GetIndustrySpec(i->type);
const Station* st;
int count = 0;
int j = 0;
@@ -279,7 +278,7 @@
// No limits on delevering stations!
// Or for industry that does not give anything yet
- if (indsp->produced_cargo[0] == CT_INVALID || i->last_month_production[0] == 0) return true;
+ if (i->produced_cargo[0] == CT_INVALID || i->last_month_production[0] == 0) return true;
if (i->last_month_production[0] - i->last_month_transported[0] < AI_CHECKCITY_NEEDED_CARGO) return false;
@@ -302,13 +301,13 @@
// we want to know if this station gets the same good. If so,
// we want to know its rating. If it is too high, we are not going
// to build there
- if (indsp->produced_cargo[0] == CT_INVALID) continue;
+ if (i->produced_cargo[0] == CT_INVALID) continue;
// It does not take this cargo
- if (!st->goods[indsp->produced_cargo[0]].last_speed) continue;
+ if (!st->goods[i->produced_cargo[0]].last_speed) continue;
// Is it around our industry
if (DistanceManhattan(st->xy, i->xy) > 5) continue;
// It does take this cargo.. what is his rating?
- if (st->goods[indsp->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
+ if (st->goods[i->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
j++;
// The rating is high.. a little chance that we still continue
// But if there are 2 stations of this size, we never go on...
@@ -458,19 +457,17 @@
}
} else if (p->ainew.tbt == AI_TRUCK) {
const Industry* ind_from = GetIndustry(p->ainew.from_ic);
- const IndustrySpec *indsp_from = GetIndustrySpec(ind_from->type);
const Industry* ind_temp = GetIndustry(p->ainew.temp);
- const IndustrySpec *indsp_temp = GetIndustrySpec(ind_temp->type);
bool found = false;
int max_cargo = 0;
uint i;
// TODO: in max_cargo, also check other cargo (beside [0])
// First we check if the from_ic produces cargo that this ic accepts
- if (indsp_from->produced_cargo[0] != CT_INVALID && ind_from->last_month_production[0] != 0) {
- for (i = 0; i < lengthof(indsp_temp->accepts_cargo); i++) {
- if (indsp_temp->accepts_cargo[i] == CT_INVALID) break;
- if (indsp_from->produced_cargo[0] == indsp_temp->accepts_cargo[i]) {
+ if (ind_from->produced_cargo[0] != CT_INVALID && ind_from->last_month_production[0] != 0) {
+ for (i = 0; i < lengthof(ind_temp->accepts_cargo); i++) {
+ if (ind_temp->accepts_cargo[i] == CT_INVALID) break;
+ if (ind_from->produced_cargo[0] == ind_temp->accepts_cargo[i]) {
// Found a compatible industry
max_cargo = ind_from->last_month_production[0] - ind_from->last_month_transported[0];
found = true;
@@ -480,11 +477,11 @@
}
}
}
- if (!found && indsp_temp->produced_cargo[0] != CT_INVALID && ind_temp->last_month_production[0] != 0) {
+ if (!found && ind_temp->produced_cargo[0] != CT_INVALID && ind_temp->last_month_production[0] != 0) {
// If not check if the current ic produces cargo that the from_ic accepts
- for (i = 0; i < lengthof(indsp_from->accepts_cargo); i++) {
- if (indsp_from->accepts_cargo[i] == CT_INVALID) break;
- if (indsp_from->produced_cargo[0] == indsp_from->accepts_cargo[i]) {
+ for (i = 0; i < lengthof(ind_from->accepts_cargo); i++) {
+ if (ind_from->accepts_cargo[i] == CT_INVALID) break;
+ if (ind_from->produced_cargo[0] == ind_from->accepts_cargo[i]) {
// Found a compatbiel industry
found = true;
max_cargo = ind_temp->last_month_production[0] - ind_temp->last_month_transported[0];
@@ -503,9 +500,9 @@
distance <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
p->ainew.to_ic = p->ainew.temp;
if (p->ainew.from_deliver) {
- p->ainew.cargo = indsp_from->produced_cargo[0];
+ p->ainew.cargo = ind_from->produced_cargo[0];
} else {
- p->ainew.cargo = indsp_temp->produced_cargo[0];
+ p->ainew.cargo = ind_temp->produced_cargo[0];
}
p->ainew.state = AI_STATE_FIND_STATION;
--- a/src/aircraft.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft.h Sat Oct 06 21:16:00 2007 +0000
@@ -34,14 +34,13 @@
return (v->subtype & 0x07) <= AIR_AIRCRAFT;
}
-/** Checks if an aircraft is buildable at the tile in question
+/** Checks if an aircraft can use the station in question
* @param engine The engine to test
- * @param tile The tile where the hangar is
- * @return true if the aircraft can be build
+ * @param st The station
+ * @return true if the aircraft can use the station
*/
-static inline bool IsAircraftBuildableAtStation(EngineID engine, TileIndex tile)
+static inline bool CanAircraftUseStation(EngineID engine, const Station *st)
{
- const Station *st = GetStationByTile(tile);
const AirportFTAClass *apc = st->Airport();
const AircraftVehicleInfo *avi = AircraftVehInfo(engine);
@@ -49,6 +48,16 @@
return (apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS)) != 0;
}
+/** Checks if an aircraft can use the station at the tile in question
+ * @param engine The engine to test
+ * @param tile The tile where the station is
+ * @return true if the aircraft can use the station
+ */
+static inline bool CanAircraftUseStation(EngineID engine, TileIndex tile)
+{
+ return CanAircraftUseStation(engine, GetStationByTile(tile));
+}
+
/**
* Calculates cargo capacity based on an aircraft's passenger
* and mail capacities.
--- a/src/aircraft_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -312,7 +312,7 @@
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
/* Prevent building aircraft types at places which can't handle them */
- if (!IsAircraftBuildableAtStation(p1, tile)) return CMD_ERROR;
+ if (!CanAircraftUseStation(p1, tile)) return CMD_ERROR;
/* Allocate 2 or 3 vehicle structs, depending on type
* vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */
@@ -385,7 +385,7 @@
v->cargo_type = cargo;
- if (HASBIT(EngInfo(p1)->callbackmask, CBM_REFIT_CAPACITY)) {
+ if (HASBIT(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v);
}
@@ -609,6 +609,7 @@
* Now we change the setting to apply the new one and let the vehicle head for the same hangar.
* Note: the if is (true for requesting service == true for ordered to stop in hangar) */
if (flags & DC_EXEC) {
+ CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
}
@@ -685,7 +686,7 @@
/* Check the refit capacity callback */
uint16 callback = CALLBACK_FAILED;
- if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+ if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
/* Back up the existing cargo type */
CargoID temp_cid = v->cargo_type;
byte temp_subtype = v->cargo_subtype;
@@ -2282,7 +2283,7 @@
gp = GetNewVehiclePos(v_oldstyle);
/* set new position x,y,z */
- SetAircraftPosition(v_oldstyle, gp.x, gp.y, apc->MovingData(v_oldstyle->u.air.pos)->z + z_offset);
+ SetAircraftPosition(v_oldstyle, gp.x, gp.y, apc->MovingData(min(v_oldstyle->u.air.pos, apc->num_positions - 1))->z + z_offset);
v_oldstyle->u.air.owned_blocks.ResetAll();
}
}
--- a/src/aircraft_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/aircraft_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -23,6 +23,50 @@
#include "vehicle_gui.h"
#include "newgrf_engine.h"
+/**
+* Draw the details for the given vehicle at the position (x,y)
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+*/
+void DrawAircraftDetails(const Vehicle *v, int x, int y)
+{
+ int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;
+
+ for (const Vehicle *u = v ; u != NULL ; u = u->Next()) {
+ if (IsNormalAircraft(u)) {
+ SetDParam(0, u->engine_type);
+ SetDParam(1, u->build_year);
+ SetDParam(2, u->value);
+ DrawString(x, y, STR_A011_BUILT_VALUE, 0);
+
+ SetDParam(0, u->cargo_type);
+ SetDParam(1, u->cargo_cap);
+ SetDParam(2, u->Next()->cargo_type);
+ SetDParam(3, u->Next()->cargo_cap);
+ DrawString(x, y + 10, (u->Next()->cargo_cap != 0) ? STR_A019_CAPACITY : STR_A01A_CAPACITY, 0);
+ }
+
+ if (u->cargo_cap != 0) {
+ uint cargo_count = u->cargo.Count();
+
+ y_offset += 11;
+ if (cargo_count != 0) {
+ /* Cargo names (fix pluralness) */
+ SetDParam(0, u->cargo_type);
+ SetDParam(1, cargo_count);
+ SetDParam(2, u->cargo.Source());
+ DrawString(x, y + 21 + y_offset, STR_8813_FROM, 0);
+ }
+ }
+ }
+
+ SetDParam(0, v->cargo.FeederShare());
+ DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+}
+
+
void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selection)
{
SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
@@ -51,177 +95,8 @@
if (v->tile == _backup_orders_tile) {
_backup_orders_tile = 0;
- RestoreVehicleOrders(v, _backup_orders_data);
+ RestoreVehicleOrders(v);
}
ShowVehicleViewWindow(v);
}
}
-
-static void AircraftDetailsWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT: {
- const Vehicle *v = GetVehicle(w->window_number);
-
- SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-
- /* Disable service-scroller when interval is set to disabled */
- SetWindowWidgetDisabledState(w, 5, !_patches.servint_aircraft);
- SetWindowWidgetDisabledState(w, 6, !_patches.servint_aircraft);
-
- SetDParam(0, v->index);
- DrawWindowWidgets(w);
-
- /* Draw running cost */
- {
- int year = v->age / 366;
-
- SetDParam(1, year);
-
- SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
- SetDParam(2, v->max_age / 366);
- SetDParam(3, v->GetDisplayRunningCost());
- DrawString(2, 15, STR_A00D_AGE_RUNNING_COST_YR, 0);
- }
-
- /* Draw max speed */
- {
- SetDParam(0, v->GetDisplayMaxSpeed());
- DrawString(2, 25, STR_A00E_MAX_SPEED, 0);
- }
-
- /* Draw profit */
- {
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
- DrawString(2, 35, STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
- }
-
- /* Draw breakdown & reliability */
- {
- SetDParam(0, v->reliability * 100 >> 16);
- SetDParam(1, v->breakdowns_since_last_service);
- DrawString(2, 45, STR_A010_RELIABILITY_BREAKDOWNS, 0);
- }
-
- /* Draw service interval text */
- {
- SetDParam(0, v->service_interval);
- SetDParam(1, v->date_of_last_service);
- DrawString(13, 115, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0);
- }
-
- /* Draw Transfer credits text */
- {
- SetDParam(0, v->cargo.FeederShare());
- DrawString(60, 101, STR_FEEDER_CARGO_VALUE, 0);
- }
-
- DrawAircraftImage(v, 3, 57, INVALID_VEHICLE);
-
- {
- const Vehicle *u;
- int y = 57;
-
- do {
- if (IsNormalAircraft(v)) {
- SetDParam(0, v->engine_type);
- SetDParam(1, v->build_year);
- SetDParam(2, v->value);
- DrawString(60, y, STR_A011_BUILT_VALUE, 0);
- y += 10;
-
- SetDParam(0, v->cargo_type);
- SetDParam(1, v->cargo_cap);
- u = v->Next();
- SetDParam(2, u->cargo_type);
- SetDParam(3, u->cargo_cap);
- DrawString(60, y, (u->cargo_cap != 0) ? STR_A019_CAPACITY : STR_A01A_CAPACITY, 0);
- y += 14;
- }
-
- uint cargo_count = v->cargo.Count();
- if (cargo_count != 0) {
-
- /* Cargo names (fix pluralness) */
- SetDParam(0, v->cargo_type);
- SetDParam(1, cargo_count);
- SetDParam(2, v->cargo.Source());
- DrawString(60, y, STR_8813_FROM, 0);
-
- y += 10;
- }
- } while ((v = v->Next()) != NULL);
- }
- } break;
-
- case WE_CLICK: {
- int mod;
- const Vehicle *v;
- switch (e->we.click.widget) {
- case 2: /* rename */
- v = GetVehicle(w->window_number);
- SetDParam(0, v->index);
- ShowQueryString(STR_VEHICLE_NAME, STR_A030_NAME_AIRCRAFT, 31, 150, w, CS_ALPHANUMERAL);
- break;
- case 5: /* increase int */
- mod = _ctrl_pressed? 5 : 10;
- goto do_change_service_int;
- case 6: /* decrease int */
- mod = _ctrl_pressed?- 5 : -10;
-do_change_service_int:
- v = GetVehicle(w->window_number);
-
- mod = GetServiceIntervalClamped(mod + v->service_interval);
- if (mod == v->service_interval) return;
-
- DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
- break;
- }
- } break;
-
- case WE_ON_EDIT_TEXT:
- if (e->we.edittext.str[0] != '\0') {
- _cmd_text = e->we.edittext.str;
- DoCommandP(0, w->window_number, 0, NULL,
- CMD_NAME_VEHICLE | CMD_MSG(STR_A031_CAN_T_NAME_AIRCRAFT));
- }
- break;
- }
-}
-
-
-static const Widget _aircraft_details_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW },
-{ WWT_CAPTION, RESIZE_NONE, 14, 11, 349, 0, 13, STR_A00C_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS },
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 350, 389, 0, 13, STR_01AA_NAME, STR_A032_NAME_AIRCRAFT },
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 389, 14, 55, 0x0, STR_NULL },
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 389, 56, 113, 0x0, STR_NULL },
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 10, 114, 119, STR_0188, STR_884D_INCREASE_SERVICING_INTERVAL },
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 10, 120, 125, STR_0189, STR_884E_DECREASE_SERVICING_INTERVAL },
-{ WWT_PANEL, RESIZE_NONE, 14, 11, 389, 114, 125, 0x0, STR_NULL },
-{ WIDGETS_END},
-};
-
-static const WindowDesc _aircraft_details_desc = {
- WDP_AUTO, WDP_AUTO, 390, 126, 390, 126,
- WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
- WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
- _aircraft_details_widgets,
- AircraftDetailsWndProc
-};
-
-
-void ShowAircraftDetailsWindow(const Vehicle *v)
-{
- Window *w;
- VehicleID veh = v->index;
-
- DeleteWindowById(WC_VEHICLE_ORDERS, veh);
- DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
- w = AllocateWindowDescFront(&_aircraft_details_desc, veh);
- w->caption_color = v->owner;
-// w->vscroll.cap = 6;
-// w->traindetails_d.tab = 0;
-}
--- a/src/airport_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/airport_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -53,7 +53,7 @@
DoCommandP(tile,
_airport.layout_set | (_airport.numtracks << 8) | (_airport.platlength << 16) | (_ctrl_pressed << 24),
0x80 | (_airport.fsmports_class << 8) | (_airport.station_type << 16), CcBuildAirport,
- CMD_BUILD_AIRPORT | CMD_AUTO | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
+ CMD_BUILD_AIRPORT | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
}
static void PlaceAir_DemolishArea(TileIndex tile)
--- a/src/articulated_vehicles.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/articulated_vehicles.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -15,16 +15,24 @@
#include "newgrf_engine.h"
-uint CountArticulatedParts(EngineID engine_type)
+uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
{
- if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
+ if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return 0;
+
+ Vehicle *v = NULL;;
+ if (!purchase_window) {
+ v = new InvalidVehicle();
+ v->engine_type = engine_type;
+ }
uint i;
- for (i = 1; i < 10; i++) {
- uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, NULL);
+ for (i = 1; i < MAX_UVALUE(EngineID); i++) {
+ uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, engine_type, v);
if (callback == CALLBACK_FAILED || callback == 0xFF) break;
}
+ delete v;
+
return i - 1;
}
@@ -33,16 +41,15 @@
const Vehicle *v = vl[0];
Vehicle *u = vl[0];
- if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
+ if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) return;
- for (uint i = 1; i < 10; i++) {
+ for (uint i = 1; i < MAX_UVALUE(EngineID); i++) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ARTIC_ENGINE, i, 0, v->engine_type, v);
if (callback == CALLBACK_FAILED || callback == 0xFF) return;
/* Attempt to use pre-allocated vehicles until they run out. This can happen
* if the callback returns different values depending on the cargo type. */
u->SetNext(vl[i]);
- if (u->Next() == NULL) u->SetNext(new InvalidVehicle());
if (u->Next() == NULL) return;
Vehicle *previous = u;
@@ -77,6 +84,7 @@
const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type);
u = new (u) Train();
+ previous->SetNext(u);
u->u.rail.track = v->u.rail.track;
u->u.rail.railtype = v->u.rail.railtype;
u->u.rail.first_engine = v->engine_type;
@@ -92,6 +100,7 @@
const RoadVehicleInfo *rvi_artic = RoadVehInfo(engine_type);
u = new (u) RoadVehicle();
+ previous->SetNext(u);
u->u.road.first_engine = v->engine_type;
u->u.road.cached_veh_length = GetRoadVehLength(u);
u->u.road.state = RVSB_IN_DEPOT;
@@ -107,8 +116,6 @@
} break;
}
- previous->SetNext(u);
-
if (flip_image) u->spritenum++;
VehiclePositionChanged(u);
--- a/src/articulated_vehicles.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/articulated_vehicles.h Sat Oct 06 21:16:00 2007 +0000
@@ -5,7 +5,7 @@
#ifndef ARTICULATED_VEHICLES_H
#define ARTICULATED_VEHICLES_H
-uint CountArticulatedParts(EngineID engine_type);
+uint CountArticulatedParts(EngineID engine_type, bool purchase_window);
void AddArticulatedParts(Vehicle **vl, VehicleType type);
#endif /* ARTICULATED_VEHICLES_H */
--- a/src/autoreplace_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/autoreplace_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -202,7 +202,7 @@
/* Get the vehicle in front of the one we move out */
Vehicle *front = old_v->Previous();
/* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
- if (IsMultiheaded(front) && !IsTrainEngine(front)) front = front->Previous();
+ if (IsRearDualheaded(front)) front = front->Previous();
/* Now we move the old one out of the train */
DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
/* Add the new vehicle */
@@ -247,13 +247,17 @@
}
} else { // flags & DC_EXEC not set
CommandCost tmp_move;
- if (old_v->type == VEH_TRAIN && IsFrontEngine(old_v) && old_v->Next() != NULL) {
- /* Verify that the wagons can be placed on the engine in question.
- * This is done by building an engine, test if the wagons can be added and then sell the test engine. */
- DoCommand(old_v->tile, new_engine_type, 3, DC_EXEC, GetCmdBuildVeh(old_v));
- Vehicle *temp = GetVehicle(_new_vehicle_id);
- tmp_move = DoCommand(0, (temp->index << 16) | old_v->Next()->index, 1, 0, CMD_MOVE_RAIL_VEHICLE);
- DoCommand(0, temp->index, 0, DC_EXEC, GetCmdSellVeh(old_v));
+
+ if (old_v->type == VEH_TRAIN && IsFrontEngine(old_v)) {
+ Vehicle *next_veh = GetNextUnit(old_v); // don't try to move the rear multiheaded engine or articulated parts
+ if (next_veh != NULL) {
+ /* Verify that the wagons can be placed on the engine in question.
+ * This is done by building an engine, test if the wagons can be added and then sell the test engine. */
+ DoCommand(old_v->tile, new_engine_type, 3, DC_EXEC, GetCmdBuildVeh(old_v));
+ Vehicle *temp = GetVehicle(_new_vehicle_id);
+ tmp_move = DoCommand(0, (temp->index << 16) | next_veh->index, 1, 0, CMD_MOVE_RAIL_VEHICLE);
+ DoCommand(0, temp->index, 0, DC_EXEC, GetCmdSellVeh(old_v));
+ }
}
/* Ensure that the player will not end up having negative money while autoreplacing
@@ -332,7 +336,7 @@
cost = CommandCost();
w = v;
do {
- if (w->type == VEH_TRAIN && IsMultiheaded(w) && !IsTrainEngine(w)) {
+ if (w->type == VEH_TRAIN && IsRearDualheaded(w)) {
/* we build the rear ends of multiheaded trains with the front ones */
continue;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/autoslope.h Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+/** @file autoslope.h */
+
+#ifndef AUTOSLOPE_H
+#define AUTOSLOPE_H
+
+#include "depot.h"
+
+/**
+ * Autoslope check for tiles with an entrance on an edge.
+ * E.g. depots and non-drive-through-road-stops.
+ *
+ * The test succeeds if the slope is not steep and at least one corner of the entrance edge is on the TileMaxZ() level.
+ *
+ * @note The test does not check if autoslope is enabled at all.
+ *
+ * @param tile The tile.
+ * @param z_new New TileZ.
+ * @param tileh_new New TileSlope.
+ * @param entrance Entrance edge.
+ * @return true iff terraforming is allowed.
+ */
+static inline bool AutoslopeCheckForEntranceEdge(TileIndex tile, uint z_new, Slope tileh_new, DiagDirection entrance)
+{
+ if (IsSteepSlope(tileh_new) || (GetTileMaxZ(tile) != z_new + GetSlopeMaxZ(tileh_new))) return false;
+ return ((tileh_new == SLOPE_FLAT) || CanBuildDepotByTileh(entrance, tileh_new));
+}
+
+/**
+ * Tests if autoslope is enabled for _current_player.
+ *
+ * Autoslope is disabled for town/industry construction and old ai players.
+ *
+ * @return true iff autoslope is enabled.
+ */
+static inline bool AutoslopeEnabled()
+{
+ return (_patches.autoslope &&
+ ((IsValidPlayer(_current_player) && !_is_old_ai_player) ||
+ (_current_player == OWNER_NONE && _game_mode == GM_EDITOR)));
+}
+
+#endif /* AUTOSLOPE_H */
--- a/src/blitter/32bpp_anim.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_anim.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -10,6 +10,12 @@
void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
{
+ if (bp->dst < _screen.dst_ptr || bp->dst > (uint32 *)_screen.dst_ptr + _screen.width * _screen.height) {
+ /* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent Draw() */
+ Blitter_32bppOptimized::Draw(bp, mode, zoom);
+ return;
+ }
+
const SpriteLoader::CommonPixel *src, *src_line;
uint32 *dst, *dst_line;
uint8 *anim, *anim_line;
@@ -38,11 +44,22 @@
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) {
- if (src->a != 0) *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+ *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
*anim = 0;
} else {
if (bp->remap[src->m] != 0) {
@@ -58,19 +75,15 @@
* 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 */
- if (src->a != 0) {
- *dst = MakeTransparent(*dst, 75);
- *anim = bp->remap[*anim];
- }
+ *dst = MakeTransparent(*dst, 192);
+ *anim = bp->remap[*anim];
break;
default:
- if (src->a != 0) {
- /* 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;
- }
+ /* 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++;
@@ -90,7 +103,7 @@
if (pal == PALETTE_TO_TRANSPARENT) {
do {
for (int i = 0; i != width; i++) {
- *udst = MakeTransparent(*udst, 60);
+ *udst = MakeTransparent(*udst, 154);
*anim = 0;
udst++;
anim++;
--- a/src/blitter/32bpp_anim.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_anim.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -5,10 +5,10 @@
#ifndef BLITTER_32BPP_ANIM_HPP
#define BLITTER_32BPP_ANIM_HPP
-#include "32bpp_simple.hpp"
+#include "32bpp_optimized.hpp"
#include "factory.hpp"
-class Blitter_32bppAnim : public Blitter_32bppSimple {
+class Blitter_32bppAnim : public Blitter_32bppOptimized {
private:
uint8 *anim_buf; ///< In this buffer we keep track of the 8bpp indexes so we can do palette animation
int anim_buf_width;
--- a/src/blitter/32bpp_base.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_base.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -56,7 +56,7 @@
stepx = 1;
}
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
if (dx > dy) {
frac = dy - (dx / 2);
while (x != x2) {
@@ -66,7 +66,7 @@
}
x += stepx;
frac += dy;
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
}
} else {
frac = dx - (dy / 2);
@@ -77,7 +77,7 @@
}
y += stepy;
frac += dx;
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
}
}
}
--- a/src/blitter/32bpp_base.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_base.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -48,15 +48,19 @@
*/
static inline uint ComposeColourRGBA(uint r, uint g, uint b, uint a, uint 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);
+ /* The 256 is wrong, it should be 255, but 256 is much faster... */
return ComposeColour(0xFF,
- (r * a + cr * (255 - a)) / 255,
- (g * a + cg * (255 - a)) / 255,
- (b * a + cb * (255 - a)) / 255);
+ (r * a + cr * (256 - a)) / 256,
+ (g * a + cg * (256 - a)) / 256,
+ (b * a + cb * (256 - a)) / 256);
}
/**
@@ -64,24 +68,28 @@
*/
static inline uint ComposeColourPA(uint colour, uint a, uint 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);
+ 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 * (255 - a)) / 255,
- (g * a + cg * (255 - a)) / 255,
- (b * a + cb * (255 - a)) / 255);
+ (r * a + cr * (256 - a)) / 256,
+ (g * a + cg * (256 - a)) / 256,
+ (b * a + cb * (256 - a)) / 256);
}
/**
* Make a pixel looks like it is transparent.
* @param colour the colour already on the screen.
- * @param amount the amount of transparency, times 100.
+ * @param amount the amount of transparency, times 256.
* @return the new colour for the screen.
*/
static inline uint MakeTransparent(uint colour, uint amount)
@@ -91,7 +99,7 @@
g = GB(colour, 8, 8);
b = GB(colour, 0, 8);
- return ComposeColour(0xFF, r * amount / 100, g * amount / 100, b * amount / 100);
+ return ComposeColour(0xFF, r * amount / 256, g * amount / 256, b * amount / 256);
}
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/blitter/32bpp_optimized.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,108 @@
+#include "../stdafx.h"
+#include "../zoom.hpp"
+#include "../gfx.h"
+#include "../debug.h"
+#include "../table/sprites.h"
+#include "32bpp_optimized.hpp"
+
+static FBlitter_32bppOptimized iFBlitter_32bppOptimized;
+
+void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
+{
+ const SpriteLoader::CommonPixel *src, *src_line;
+ uint32 *dst, *dst_line;
+
+ /* 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;
+
+ 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);
+
+ 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;
+ 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);
+ } else {
+ if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->LookupColourInPalette(bp->remap[src->m]), src->a, *dst);
+ }
+ 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);
+ break;
+
+ default:
+ *dst = ComposeColourRGBA(src->r, src->g, src->b, src->a, *dst);
+ break;
+ }
+ dst++;
+ src += ScaleByZoom(1, zoom);
+ }
+ }
+}
+
+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));
+
+ 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;
+
+ 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--;
+ }
+ }
+ return dest_sprite;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/blitter/32bpp_optimized.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,26 @@
+/* $Id$ */
+
+/** @file 32bpp_optimized.hpp */
+
+#ifndef BLITTER_32BPP_OPTIMIZED_HPP
+#define BLITTER_32BPP_OPTIMIZED_HPP
+
+#include "32bpp_simple.hpp"
+#include "factory.hpp"
+
+class Blitter_32bppOptimized : public Blitter_32bppSimple {
+public:
+ /* 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"; }
+};
+
+class FBlitter_32bppOptimized: public BlitterFactory<FBlitter_32bppOptimized> {
+public:
+ /* virtual */ const char *GetName() { return "32bpp-optimized"; }
+ /* virtual */ const char *GetDescription() { return "32bpp Optimized Blitter (no palette animation)"; }
+ /* virtual */ Blitter *CreateInstance() { return new Blitter_32bppOptimized(); }
+};
+
+#endif /* BLITTER_32BPP_OPTIMIZED_HPP */
--- a/src/blitter/32bpp_simple.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/32bpp_simple.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -40,7 +40,7 @@
* 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 */
- if (src->a != 0) *dst = MakeTransparent(*dst, 75);
+ if (src->a != 0) *dst = MakeTransparent(*dst, 192);
break;
default:
@@ -60,7 +60,7 @@
if (pal == PALETTE_TO_TRANSPARENT) {
do {
for (int i = 0; i != width; i++) {
- *udst = MakeTransparent(*udst, 60);
+ *udst = MakeTransparent(*udst, 154);
udst++;
}
udst = udst - width + _screen.pitch;
--- a/src/blitter/8bpp_base.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/8bpp_base.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -60,7 +60,7 @@
stepx = 1;
}
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
if (dx > dy) {
frac = dy - (dx / 2);
while (x != x2) {
@@ -70,7 +70,7 @@
}
x += stepx;
frac += dy;
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
}
} else {
frac = dx - (dy / 2);
@@ -81,7 +81,7 @@
}
y += stepy;
frac += dx;
- if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+ if (x >= 0 && y >= 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
}
}
}
--- a/src/blitter/factory.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/blitter/factory.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -4,6 +4,8 @@
#define BLITTER_FACTORY_HPP
#include "base.hpp"
+#include "../string.h"
+#include "../debug.h"
#include <string>
#include <map>
@@ -61,15 +63,20 @@
*/
static Blitter *SelectBlitter(const char *name)
{
+ const char *default_blitter = "8bpp-optimized";
+
if (GetBlitters().size() == 0) return NULL;
+ const char *bname = (StrEmpty(name)) ? default_blitter : name;
Blitters::iterator it = GetBlitters().begin();
for (; it != GetBlitters().end(); it++) {
BlitterFactoryBase *b = (*it).second;
- if (strcasecmp(name, b->name) == 0) {
+ if (strcasecmp(bname, b->name) == 0) {
Blitter *newb = b->CreateInstance();
delete *GetActiveBlitter();
*GetActiveBlitter() = newb;
+
+ DEBUG(driver, 1, "Successfully %s blitter '%s'",StrEmpty(name) ? "probed" : "loaded", bname);
return newb;
}
}
--- a/src/bridge_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/bridge_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -36,7 +36,7 @@
DeleteWindow(w);
DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
_bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
- CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
+ CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
}
static void BuildBridgeWndProc(Window *w, WindowEvent *e)
--- a/src/build_vehicle_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/build_vehicle_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -621,7 +621,7 @@
int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
SetDParam(0, rvi->cargo_type);
- SetDParam(1, (capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
+ SetDParam(1, (capacity * (CountArticulatedParts(engine_number, true) + 1)) << multihead);
SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
}
DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
@@ -765,7 +765,7 @@
for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) {
if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
- if (w->window_number > VEH_END && !IsAircraftBuildableAtStation(eid, w->window_number)) continue;
+ if (w->window_number > VEH_END && !CanAircraftUseStation(eid, w->window_number)) continue;
EngList_Add(&bv->eng_list, eid);
if (eid == bv->sel_engine) sel_id = eid;
--- a/src/clear_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/clear_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -47,7 +47,14 @@
int modheight_count; ///< amount of entries in "modheight".
int tile_table_count; ///< amount of entries in "tile_table".
- TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE]; ///< Dirty tiles, i.e. at least one corner changed.
+ /**
+ * Dirty tiles, i.e.\ at least one corner changed.
+ *
+ * This array contains the tiles which are or will be marked as dirty.
+ *
+ * @ingroup dirty
+ */
+ TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE];
TerraformerHeightMod modheight[TERRAFORMER_MODHEIGHT_SIZE]; ///< Height modifications.
};
@@ -106,6 +113,7 @@
*
* @param ts TerraformerState.
* @param tile Tile.
+ * @ingroup dirty
*/
static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
{
@@ -128,6 +136,7 @@
*
* @param ts TerraformerState.
* @param tile Tile.
+ * @ingroup dirty
*/
static void TerraformAddDirtyTileAround(TerraformerState *ts, TileIndex tile)
{
@@ -305,7 +314,7 @@
return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
}
/* Check tiletype-specific things, and add extra-cost */
- CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags, z_min * TILE_HEIGHT, (Slope) tileh);
+ CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, (Slope) tileh);
if (CmdFailed(cost)) {
_terraform_err_tile = tile;
return cost;
--- a/src/command.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/command.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -15,9 +15,19 @@
#include "network/network.h"
#include "variables.h"
#include "genworld.h"
+#include "newgrf_storage.h"
-const char* _cmd_text = NULL;
+const char *_cmd_text = NULL;
+/**
+ * Helper macro to define the header of all command handler macros.
+ *
+ * This macro create the function header for a given command handler function, as
+ * all command handler functions got the parameters from the #CommandProc callback
+ * type.
+ *
+ * @param yyyy The desired function name of the new command handler function.
+ */
#define DEF_COMMAND(yyyy) CommandCost yyyy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
DEF_COMMAND(CmdBuildRailroadTrack);
@@ -181,166 +191,178 @@
DEF_COMMAND(CmdChangeTimetable);
DEF_COMMAND(CmdSetVehicleOnTime);
DEF_COMMAND(CmdAutofillTimetable);
-
-/* The master command table */
-static const Command _command_proc_table[] = {
- {CmdBuildRailroadTrack, 0}, /* 0 */
- {CmdRemoveRailroadTrack, 0}, /* 1 */
- {CmdBuildSingleRail, 0}, /* 2 */
- {CmdRemoveSingleRail, 0}, /* 3 */
- {CmdLandscapeClear, 0}, /* 4 */
- {CmdBuildBridge, 0}, /* 5 */
- {CmdBuildRailroadStation, 0}, /* 6 */
- {CmdBuildTrainDepot, 0}, /* 7 */
- {CmdBuildSingleSignal, 0}, /* 8 */
- {CmdRemoveSingleSignal, 0}, /* 9 */
- {CmdTerraformLand, 0}, /* 10 */
- {CmdPurchaseLandArea, 0}, /* 11 */
- {CmdSellLandArea, 0}, /* 12 */
- {CmdBuildTunnel, 0}, /* 13 */
- {CmdRemoveFromRailroadStation, 0}, /* 14 */
- {CmdConvertRail, 0}, /* 15 */
- {CmdBuildTrainWaypoint, 0}, /* 16 */
- {CmdRenameWaypoint, 0}, /* 17 */
- {CmdRemoveTrainWaypoint, 0}, /* 18 */
- {NULL, 0}, /* 19 */
- {NULL, 0}, /* 20 */
- {CmdBuildRoadStop, 0}, /* 21 */
- {CmdRemoveRoadStop, 0}, /* 22 */
- {CmdBuildLongRoad, 0}, /* 23 */
- {CmdRemoveLongRoad, 0}, /* 24 */
- {CmdBuildRoad, 0}, /* 25 */
- {CmdRemoveRoad, 0}, /* 26 */
- {CmdBuildRoadDepot, 0}, /* 27 */
- {NULL, 0}, /* 28 */
- {CmdBuildAirport, 0}, /* 29 */
- {CmdBuildDock, 0}, /* 30 */
- {CmdBuildShipDepot, 0}, /* 31 */
- {CmdBuildBuoy, 0}, /* 32 */
- {CmdPlantTree, 0}, /* 33 */
- {CmdBuildRailVehicle, 0}, /* 34 */
- {CmdMoveRailVehicle, 0}, /* 35 */
- {CmdStartStopTrain, 0}, /* 36 */
- {NULL, 0}, /* 37 */
- {CmdSellRailWagon, 0}, /* 38 */
- {CmdSendTrainToDepot, 0}, /* 39 */
- {CmdForceTrainProceed, 0}, /* 40 */
- {CmdReverseTrainDirection, 0}, /* 41 */
-
- {CmdModifyOrder, 0}, /* 42 */
- {CmdSkipToOrder, 0}, /* 43 */
- {CmdDeleteOrder, 0}, /* 44 */
- {CmdInsertOrder, 0}, /* 45 */
-
- {CmdChangeServiceInt, 0}, /* 46 */
-
- {CmdBuildIndustry, 0}, /* 47 */
- {CmdBuildCompanyHQ, 0}, /* 48 */
- {CmdSetPlayerFace, 0}, /* 49 */
- {CmdSetPlayerColor, 0}, /* 50 */
-
- {CmdIncreaseLoan, 0}, /* 51 */
- {CmdDecreaseLoan, 0}, /* 52 */
-
- {CmdWantEnginePreview, 0}, /* 53 */
-
- {CmdNameVehicle, 0}, /* 54 */
- {CmdRenameEngine, 0}, /* 55 */
-
- {CmdChangeCompanyName, 0}, /* 56 */
- {CmdChangePresidentName, 0}, /* 57 */
-
- {CmdRenameStation, 0}, /* 58 */
-
- {CmdSellAircraft, 0}, /* 59 */
- {CmdStartStopAircraft, 0}, /* 60 */
+#undef DEF_COMMAND
- {CmdBuildAircraft, 0}, /* 61 */
- {CmdSendAircraftToHangar, 0}, /* 62 */
- {NULL, 0}, /* 63 */
- {CmdRefitAircraft, 0}, /* 64 */
-
- {CmdPlaceSign, 0}, /* 65 */
- {CmdRenameSign, 0}, /* 66 */
-
- {CmdBuildRoadVeh, 0}, /* 67 */
- {CmdStartStopRoadVeh, 0}, /* 68 */
- {CmdSellRoadVeh, 0}, /* 69 */
- {CmdSendRoadVehToDepot, 0}, /* 70 */
- {CmdTurnRoadVeh, 0}, /* 71 */
- {CmdRefitRoadVeh, 0}, /* 72 */
-
- {CmdPause, CMD_SERVER}, /* 73 */
-
- {CmdBuyShareInCompany, 0}, /* 74 */
- {CmdSellShareInCompany, 0}, /* 75 */
- {CmdBuyCompany, 0}, /* 76 */
-
- {CmdBuildTown, CMD_OFFLINE}, /* 77 */
- {NULL, 0}, /* 78 */
- {NULL, 0}, /* 79 */
- {CmdRenameTown, CMD_SERVER}, /* 80 */
- {CmdDoTownAction, 0}, /* 81 */
-
- {CmdSetRoadDriveSide, CMD_SERVER}, /* 82 */
- {NULL, 0}, /* 83 */
- {NULL, 0}, /* 84 */
- {CmdChangeDifficultyLevel, CMD_SERVER}, /* 85 */
-
- {CmdStartStopShip, 0}, /* 86 */
- {CmdSellShip, 0}, /* 87 */
- {CmdBuildShip, 0}, /* 88 */
- {CmdSendShipToDepot, 0}, /* 89 */
- {NULL, 0}, /* 90 */
- {CmdRefitShip, 0}, /* 91 */
+/**
+ * The master command table
+ *
+ * This table contains all possible CommandProc functions with
+ * the flags which belongs to it. The indizes are the same
+ * as the value from the CMD_* enums.
+ */
+static const Command _command_proc_table[] = {
+ {CmdBuildRailroadTrack, CMD_AUTO}, /* 0, CMD_BUILD_RAILROAD_TRACK */
+ {CmdRemoveRailroadTrack, CMD_AUTO}, /* 1, CMD_REMOVE_RAILROAD_TRACK */
+ {CmdBuildSingleRail, CMD_AUTO}, /* 2, CMD_BUILD_SINGLE_RAIL */
+ {CmdRemoveSingleRail, CMD_AUTO}, /* 3, CMD_REMOVE_SINGLE_RAIL */
+ {CmdLandscapeClear, 0}, /* 4, CMD_LANDSCAPE_CLEAR */
+ {CmdBuildBridge, CMD_AUTO}, /* 5, CMD_BUILD_BRIDGE */
+ {CmdBuildRailroadStation, CMD_AUTO}, /* 6, CMD_BUILD_RAILROAD_STATION */
+ {CmdBuildTrainDepot, CMD_AUTO}, /* 7, CMD_BUILD_TRAIN_DEPOT */
+ {CmdBuildSingleSignal, CMD_AUTO}, /* 8, CMD_BUILD_SIGNALS */
+ {CmdRemoveSingleSignal, CMD_AUTO}, /* 9, CMD_REMOVE_SIGNALS */
+ {CmdTerraformLand, CMD_AUTO}, /* 10, CMD_TERRAFORM_LAND */
+ {CmdPurchaseLandArea, CMD_AUTO}, /* 11, CMD_PURCHASE_LAND_AREA */
+ {CmdSellLandArea, 0}, /* 12, CMD_SELL_LAND_AREA */
+ {CmdBuildTunnel, CMD_AUTO}, /* 13, CMD_BUILD_TUNNEL */
+ {CmdRemoveFromRailroadStation, 0}, /* 14, CMD_REMOVE_FROM_RAILROAD_STATION */
+ {CmdConvertRail, 0}, /* 15, CMD_CONVERT_RAILD */
+ {CmdBuildTrainWaypoint, 0}, /* 16, CMD_BUILD_TRAIN_WAYPOINT */
+ {CmdRenameWaypoint, 0}, /* 17, CMD_RENAME_WAYPOINT */
+ {CmdRemoveTrainWaypoint, 0}, /* 18, CMD_REMOVE_TRAIN_WAYPOINT */
+ {NULL, 0}, /* 19, unused */
+ {NULL, 0}, /* 20, unused */
+ {CmdBuildRoadStop, CMD_AUTO}, /* 21, CMD_BUILD_ROAD_STOP */
+ {CmdRemoveRoadStop, 0}, /* 22, CMD_REMOVE_ROAD_STOP */
+ {CmdBuildLongRoad, CMD_AUTO}, /* 23, CMD_BUILD_LONG_ROAD */
+ {CmdRemoveLongRoad, CMD_AUTO}, /* 24, CMD_REMOVE_LONG_ROAD */
+ {CmdBuildRoad, 0}, /* 25, CMD_BUILD_ROAD */
+ {CmdRemoveRoad, 0}, /* 26, CMD_REMOVE_ROAD */
+ {CmdBuildRoadDepot, CMD_AUTO}, /* 27, CMD_BUILD_ROAD_DEPOT */
+ {NULL, 0}, /* 28, unused */
+ {CmdBuildAirport, CMD_AUTO}, /* 29, CMD_BUILD_AIRPORT */
+ {CmdBuildDock, CMD_AUTO}, /* 30, CMD_BUILD_DOCK */
+ {CmdBuildShipDepot, CMD_AUTO}, /* 31, CMD_BUILD_SHIP_DEPOT */
+ {CmdBuildBuoy, CMD_AUTO}, /* 32, CMD_BUILD_BUOY */
+ {CmdPlantTree, CMD_AUTO}, /* 33, CMD_PLANT_TREE */
+ {CmdBuildRailVehicle, 0}, /* 34, CMD_BUILD_RAIL_VEHICLE */
+ {CmdMoveRailVehicle, 0}, /* 35, CMD_MOVE_RAIL_VEHICLE */
+ {CmdStartStopTrain, 0}, /* 36, CMD_START_STOP_TRAIN */
+ {NULL, 0}, /* 37, unused */
+ {CmdSellRailWagon, 0}, /* 38, CMD_SELL_RAIL_WAGON */
+ {CmdSendTrainToDepot, 0}, /* 39, CMD_SEND_TRAIN_TO_DEPOT */
+ {CmdForceTrainProceed, 0}, /* 40, CMD_FORCE_TRAIN_PROCEED */
+ {CmdReverseTrainDirection, 0}, /* 41, CMD_REVERSE_TRAIN_DIRECTION */
- {NULL, 0}, /* 92 */
- {NULL, 0}, /* 93 */
- {NULL, 0}, /* 94 */
- {NULL, 0}, /* 95 */
- {NULL, 0}, /* 96 */
- {NULL, 0}, /* 97 */
-
- {CmdOrderRefit, 0}, /* 98 */
- {CmdCloneOrder, 0}, /* 99 */
-
- {CmdClearArea, 0}, /* 100 */
- {NULL, 0}, /* 101 */
-
- {CmdMoneyCheat, CMD_OFFLINE}, /* 102 */
- {CmdBuildCanal, 0}, /* 103 */
- {CmdPlayerCtrl, 0}, /* 104 */
-
- {CmdLevelLand, 0}, /* 105 */
+ {CmdModifyOrder, 0}, /* 42, CMD_MODIFY_ORDER */
+ {CmdSkipToOrder, 0}, /* 43, CMD_SKIP_TO_ORDER */
+ {CmdDeleteOrder, 0}, /* 44, CMD_DELETE_ORDER */
+ {CmdInsertOrder, 0}, /* 45, CMD_INSERT_ORDER */
- {CmdRefitRailVehicle, 0}, /* 106 */
- {CmdRestoreOrderIndex, 0}, /* 107 */
- {CmdBuildLock, 0}, /* 108 */
- {NULL, 0}, /* 109 */
- {CmdBuildSignalTrack, 0}, /* 110 */
- {CmdRemoveSignalTrack, 0}, /* 111 */
- {NULL, 0}, /* 112 */
- {CmdGiveMoney, 0}, /* 113 */
- {CmdChangePatchSetting, CMD_SERVER}, /* 114 */
- {CmdSetAutoReplace, 0}, /* 115 */
- {CmdCloneVehicle, 0}, /* 116 */
- {CmdMassStartStopVehicle, 0}, /* 117 */
- {CmdDepotSellAllVehicles, 0}, /* 118 */
- {CmdDepotMassAutoReplace, 0}, /* 119 */
- {CmdCreateGroup, 0}, /* 120 */
- {CmdDeleteGroup, 0}, /* 121 */
- {CmdRenameGroup, 0}, /* 122 */
- {CmdAddVehicleGroup, 0}, /* 123 */
- {CmdAddSharedVehicleGroup, 0}, /* 124 */
- {CmdRemoveAllVehiclesGroup, 0}, /* 125 */
- {CmdSetGroupReplaceProtection, 0}, /* 126 */
- {CmdMoveOrder, 0}, /* 127 */
- {CmdChangeTimetable, 0}, /* 128 */
- {CmdSetVehicleOnTime, 0}, /* 129 */
- {CmdAutofillTimetable, 0}, /* 130 */
+ {CmdChangeServiceInt, 0}, /* 46, CMD_CHANGE_SERVICE_INT */
+
+ {CmdBuildIndustry, 0}, /* 47, CMD_BUILD_INDUSTRY */
+ {CmdBuildCompanyHQ, CMD_AUTO}, /* 48, CMD_BUILD_COMPANY_HQ */
+ {CmdSetPlayerFace, 0}, /* 49, CMD_SET_PLAYER_FACE */
+ {CmdSetPlayerColor, 0}, /* 50, CMD_SET_PLAYER_COLOR */
+
+ {CmdIncreaseLoan, 0}, /* 51, CMD_INCREASE_LOAN */
+ {CmdDecreaseLoan, 0}, /* 52, CMD_DECREASE_LOAN */
+
+ {CmdWantEnginePreview, 0}, /* 53, CMD_WANT_ENGINE_PREVIEW */
+
+ {CmdNameVehicle, 0}, /* 54, CMD_NAME_VEHICLE */
+ {CmdRenameEngine, 0}, /* 55, CMD_RENAME_ENGINE */
+
+ {CmdChangeCompanyName, 0}, /* 56, CMD_CHANGE_COMPANY_NAME */
+ {CmdChangePresidentName, 0}, /* 57, CMD_CHANGE_PRESIDENT_NAME */
+
+ {CmdRenameStation, 0}, /* 58, CMD_RENAME_STATION */
+
+ {CmdSellAircraft, 0}, /* 59, CMD_SELL_AIRCRAFT */
+ {CmdStartStopAircraft, 0}, /* 60, CMD_START_STOP_AIRCRAFT */
+
+ {CmdBuildAircraft, 0}, /* 61, CMD_BUILD_AIRCRAFT */
+ {CmdSendAircraftToHangar, 0}, /* 62, CMD_SEND_AIRCRAFT_TO_HANGAR */
+ {NULL, 0}, /* 63, unused */
+ {CmdRefitAircraft, 0}, /* 64, CMD_REFIT_AIRCRAFT */
+
+ {CmdPlaceSign, 0}, /* 65, CMD_PLACE_SIGN */
+ {CmdRenameSign, 0}, /* 66, CMD_RENAME_SIGN */
+
+ {CmdBuildRoadVeh, 0}, /* 67, CMD_BUILD_ROAD_VEH */
+ {CmdStartStopRoadVeh, 0}, /* 68, CMD_START_STOP_ROADVEH */
+ {CmdSellRoadVeh, 0}, /* 69, CMD_SELL_ROAD_VEH */
+ {CmdSendRoadVehToDepot, 0}, /* 70, CMD_SEND_ROADVEH_TO_DEPOT */
+ {CmdTurnRoadVeh, 0}, /* 71, CMD_TURN_ROADVEH */
+ {CmdRefitRoadVeh, 0}, /* 72, CMD_REFIT_ROAD_VEH */
+
+ {CmdPause, CMD_SERVER}, /* 73, CMD_PAUSE */
+
+ {CmdBuyShareInCompany, 0}, /* 74, CMD_BUY_SHARE_IN_COMPANY */
+ {CmdSellShareInCompany, 0}, /* 75, CMD_SELL_SHARE_IN_COMPANY */
+ {CmdBuyCompany, 0}, /* 76, CMD_BUY_COMANY */
+
+ {CmdBuildTown, CMD_OFFLINE}, /* 77, CMD_BUILD_TOWN */
+ {NULL, 0}, /* 78, unused */
+ {NULL, 0}, /* 79, unused */
+ {CmdRenameTown, CMD_SERVER}, /* 80, CMD_RENAME_TOWN */
+ {CmdDoTownAction, 0}, /* 81, CMD_DO_TOWN_ACTION */
+
+ {CmdSetRoadDriveSide, CMD_SERVER}, /* 82, CMD_SET_ROAD_DRIVE_SIDE */
+ {NULL, 0}, /* 83, unused */
+ {NULL, 0}, /* 84, unused */
+ {CmdChangeDifficultyLevel, CMD_SERVER}, /* 85, CMD_CHANGE_DIFFICULTY_LEVEL */
+
+ {CmdStartStopShip, 0}, /* 86, CMD_START_STOP_SHIP */
+ {CmdSellShip, 0}, /* 87, CMD_SELL_SHIP */
+ {CmdBuildShip, 0}, /* 88, CMD_BUILD_SHIP */
+ {CmdSendShipToDepot, 0}, /* 89, CMD_SEND_SHIP_TO_DEPOT */
+ {NULL, 0}, /* 90, unused */
+ {CmdRefitShip, 0}, /* 91, CMD_REFIT_SHIP */
+
+ {NULL, 0}, /* 92, unused */
+ {NULL, 0}, /* 93, unused */
+ {NULL, 0}, /* 94, unused */
+ {NULL, 0}, /* 95, unused */
+ {NULL, 0}, /* 96, unused */
+ {NULL, 0}, /* 97, unused */
+
+ {CmdOrderRefit, 0}, /* 98, CMD_ORDER_REFIT */
+ {CmdCloneOrder, 0}, /* 99, CMD_CLONE_ORDER */
+
+ {CmdClearArea, 0}, /* 100, CMD_CLEAR_AREA */
+ {NULL, 0}, /* 101, unused */
+
+ {CmdMoneyCheat, CMD_OFFLINE}, /* 102, CMD_MONEY_CHEAT */
+ {CmdBuildCanal, CMD_AUTO}, /* 103, CMD_BUILD_CANAL */
+ {CmdPlayerCtrl, 0}, /* 104, CMD_PLAYER_CTRL */
+
+ {CmdLevelLand, CMD_AUTO}, /* 105, CMD_LEVEL_LAND */
+
+ {CmdRefitRailVehicle, 0}, /* 106, CMD_REFIT_RAIL_VEHICLE */
+ {CmdRestoreOrderIndex, 0}, /* 107, CMD_RESTORE_ORDER_INDEX */
+ {CmdBuildLock, CMD_AUTO}, /* 108, CMD_BUILD_LOCK */
+ {NULL, 0}, /* 109, unused */
+ {CmdBuildSignalTrack, CMD_AUTO}, /* 110, CMD_BUILD_SIGNAL_TRACK */
+ {CmdRemoveSignalTrack, CMD_AUTO}, /* 111, CMD_REMOVE_SIGNAL_TRACK */
+ {NULL, 0}, /* 112, unused */
+ {CmdGiveMoney, 0}, /* 113, CMD_GIVE_MONEY */
+ {CmdChangePatchSetting, CMD_SERVER}, /* 114, CMD_CHANGE_PATCH_SETTING */
+ {CmdSetAutoReplace, 0}, /* 115, CMD_SET_AUTOREPLACE */
+ {CmdCloneVehicle, 0}, /* 116, CMD_CLONE_VEHICLE */
+ {CmdMassStartStopVehicle, 0}, /* 117, CMD_MASS_START_STOP */
+ {CmdDepotSellAllVehicles, 0}, /* 118, CMD_DEPOT_SELL_ALL_VEHICLES */
+ {CmdDepotMassAutoReplace, 0}, /* 119, CMD_DEPOT_MASS_AUTOREPLACE */
+ {CmdCreateGroup, 0}, /* 120, CMD_CREATE_GROUP */
+ {CmdDeleteGroup, 0}, /* 121, CMD_DELETE_GROUP */
+ {CmdRenameGroup, 0}, /* 122, CMD_RENAME_GROUP */
+ {CmdAddVehicleGroup, 0}, /* 123, CMD_ADD_VEHICLE_GROUP */
+ {CmdAddSharedVehicleGroup, 0}, /* 124, CMD_ADD_SHARE_VEHICLE_GROUP */
+ {CmdRemoveAllVehiclesGroup, 0}, /* 125, CMD_REMOVE_ALL_VEHICLES_GROUP */
+ {CmdSetGroupReplaceProtection, 0}, /* 126, CMD_SET_GROUP_REPLACE_PROTECTION */
+ {CmdMoveOrder, 0}, /* 127, CMD_MOVE_ORDER */
+ {CmdChangeTimetable, 0}, /* 128, CMD_CHANGE_TIMETABLE */
+ {CmdSetVehicleOnTime, 0}, /* 129, CMD_SET_VEHICLE_ON_TIME */
+ {CmdAutofillTimetable, 0}, /* 130, CMD_AUTOFILL_TIMETABLE */
};
-/* This function range-checks a cmd, and checks if the cmd is not NULL */
+/*!
+ * This function range-checks a cmd, and checks if the cmd is not NULL
+ *
+ * @param cmd The integervalue of a command
+ * @return true if the command is valid (and got a CommandProc function)
+ */
bool IsValidCommand(uint cmd)
{
cmd &= 0xFF;
@@ -350,14 +372,34 @@
_command_proc_table[cmd].proc != NULL;
}
+/*!
+ * This function mask the parameter with 0xFF and returns
+ * the flags which belongs to the given command.
+ *
+ * @param cmd The integer value of the command
+ * @return The flags for this command
+ * @bug integervalues which are less equals 0xFF and greater than the
+ * size of _command_proc_table can result in an index out of bounce
+ * error (which doesn't happend anyway). Check function #IsValidCommand(). (Progman)
+ */
byte GetCommandFlags(uint cmd)
{
return _command_proc_table[cmd & 0xFF].flags;
}
-
static int _docommand_recursive;
+/*!
+ * This function executes a given command with the parameters from the #CommandProc parameter list.
+ * Depending on the flags parameter it execute or test a command.
+ *
+ * @param tile The tile to apply the command on (for the #CommandProc)
+ * @param p1 Additional data for the command (for the #CommandProc)
+ * @param p2 Additional data for the command (for the #CommandProc)
+ * @param flags Flags for the command and how to execute the command
+ * @param procc The command-id to execute (a value of the CMD_* enums)
+ * @see CommandProc
+ */
CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc)
{
CommandCost res;
@@ -421,6 +463,13 @@
return res;
}
+/*!
+ * This functions returns the money which can be used to execute a command.
+ * This is either the money of the current player or INT64_MAX if there
+ * is no such a player "at the moment" like the server itself.
+ *
+ * @return The available money of a player or INT64_MAX
+ */
Money GetAvailableMoneyForCommand()
{
PlayerID pid = _current_player;
@@ -428,8 +477,20 @@
return GetPlayer(pid)->player_money;
}
-/* toplevel network safe docommand function for the current player. must not be called recursively.
- * the callback is called when the command succeeded or failed. */
+/*!
+ * Toplevel network safe docommand function for the current player. Must not be called recursively.
+ * The callback is called when the command succeeded or failed. The parameters
+ * tile, p1 and p2 are from the #CommandProc function. The paramater cmd is the command to execute.
+ * The parameter my_cmd is used to indicate if the command is from a player or the server.
+ *
+ * @param tile The tile to perform a command on (see #CommandProc)
+ * @param p1 Additional data for the command (see #CommandProc)
+ * @param p2 Additional data for the command (see #CommandProc)
+ * @param callback A callback function to call after the command is finished
+ * @param cmd The command to execute (a CMD_* value)
+ * @param my_cmd indicator if the command is from a player or server (to display error messages for a user)
+ * @return true if the command succeeded, else false
+ */
bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd, bool my_cmd)
{
CommandCost res, res2;
@@ -462,7 +523,6 @@
}
flags = 0;
- if (cmd & CMD_AUTO) flags |= DC_AUTO;
if (cmd & CMD_NO_WATER) flags |= DC_NO_WATER;
/* get pointer to command handler */
@@ -473,6 +533,8 @@
return false;
}
+ if (GetCommandFlags(cmd) & CMD_AUTO) flags |= DC_AUTO;
+
/* Some commands have a different output in dryrun than the realrun
* e.g.: if you demolish a whole town, the dryrun would say okay.
* but by really destroying, your rating drops and at a certain point
@@ -512,6 +574,7 @@
_docommand_recursive = 0;
_cmd_text = NULL;
+ ClearStorageChanges(false);
return false;
}
@@ -542,6 +605,7 @@
if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = pbck;
_docommand_recursive = 0;
_cmd_text = NULL;
+ ClearStorageChanges(false);
return true;
}
#endif /* ENABLE_NETWORK */
@@ -582,6 +646,7 @@
if (callback) callback(true, tile, p1, p2);
_cmd_text = NULL;
+ ClearStorageChanges(true);
return true;
show_error:
@@ -595,6 +660,7 @@
if (callback) callback(false, tile, p1, p2);
_cmd_text = NULL;
+ ClearStorageChanges(false);
return false;
}
--- a/src/command.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/command.h Sat Oct 06 21:16:00 2007 +0000
@@ -5,161 +5,176 @@
#ifndef COMMAND_H
#define COMMAND_H
+/**
+ * List of commands.
+ *
+ * This enum defines all possible commands which can be executed to the game
+ * engine. Observing the game like the query-tool or checking the profit of a
+ * vehicle don't result in a command which should be executed in the engine
+ * nor send to the server in a network game.
+ *
+ * @see _command_proc_table
+ */
enum {
- CMD_BUILD_RAILROAD_TRACK = 0,
- CMD_REMOVE_RAILROAD_TRACK = 1,
- CMD_BUILD_SINGLE_RAIL = 2,
- CMD_REMOVE_SINGLE_RAIL = 3,
- CMD_LANDSCAPE_CLEAR = 4,
- CMD_BUILD_BRIDGE = 5,
- CMD_BUILD_RAILROAD_STATION = 6,
- CMD_BUILD_TRAIN_DEPOT = 7,
- CMD_BUILD_SIGNALS = 8,
- CMD_REMOVE_SIGNALS = 9,
- CMD_TERRAFORM_LAND = 10,
- CMD_PURCHASE_LAND_AREA = 11,
- CMD_SELL_LAND_AREA = 12,
- CMD_BUILD_TUNNEL = 13,
-
- CMD_REMOVE_FROM_RAILROAD_STATION = 14,
- CMD_CONVERT_RAIL = 15,
-
- CMD_BUILD_TRAIN_WAYPOINT = 16,
- CMD_RENAME_WAYPOINT = 17,
- CMD_REMOVE_TRAIN_WAYPOINT = 18,
-
- CMD_BUILD_ROAD_STOP = 21,
- CMD_REMOVE_ROAD_STOP = 22,
- CMD_BUILD_LONG_ROAD = 23,
- CMD_REMOVE_LONG_ROAD = 24,
- CMD_BUILD_ROAD = 25,
- CMD_REMOVE_ROAD = 26,
- CMD_BUILD_ROAD_DEPOT = 27,
-
- CMD_BUILD_AIRPORT = 29,
-
- CMD_BUILD_DOCK = 30,
-
- CMD_BUILD_SHIP_DEPOT = 31,
- CMD_BUILD_BUOY = 32,
-
- CMD_PLANT_TREE = 33,
-
- CMD_BUILD_RAIL_VEHICLE = 34,
- CMD_MOVE_RAIL_VEHICLE = 35,
-
- CMD_START_STOP_TRAIN = 36,
-
- CMD_SELL_RAIL_WAGON = 38,
-
- CMD_SEND_TRAIN_TO_DEPOT = 39,
- CMD_FORCE_TRAIN_PROCEED = 40,
- CMD_REVERSE_TRAIN_DIRECTION = 41,
-
- CMD_MODIFY_ORDER = 42,
- CMD_SKIP_TO_ORDER = 43,
- CMD_DELETE_ORDER = 44,
- CMD_INSERT_ORDER = 45,
-
- CMD_CHANGE_SERVICE_INT = 46,
+ CMD_BUILD_RAILROAD_TRACK = 0, ///< build a rail track
+ CMD_REMOVE_RAILROAD_TRACK = 1, ///< remove a rail track
+ CMD_BUILD_SINGLE_RAIL = 2, ///< build a single rail track
+ CMD_REMOVE_SINGLE_RAIL = 3, ///< remove a single rail track
+ CMD_LANDSCAPE_CLEAR = 4, ///< demolish a tile
+ CMD_BUILD_BRIDGE = 5, ///< build a bridge
+ CMD_BUILD_RAILROAD_STATION = 6, ///< build a railroad station
+ CMD_BUILD_TRAIN_DEPOT = 7, ///< build a train depot
+ CMD_BUILD_SIGNALS = 8, ///< build a signal
+ CMD_REMOVE_SIGNALS = 9, ///< remove a signal
+ CMD_TERRAFORM_LAND = 10, ///< terraform a tile
+ CMD_PURCHASE_LAND_AREA = 11, ///< purchase a tile
+ CMD_SELL_LAND_AREA = 12, ///< sell a bought tile before
+ CMD_BUILD_TUNNEL = 13, ///< build a tunnel
- CMD_BUILD_INDUSTRY = 47,
-
- CMD_BUILD_COMPANY_HQ = 48,
- CMD_SET_PLAYER_FACE = 49,
- CMD_SET_PLAYER_COLOR = 50,
-
- CMD_INCREASE_LOAN = 51,
- CMD_DECREASE_LOAN = 52,
-
- CMD_WANT_ENGINE_PREVIEW = 53,
-
- CMD_NAME_VEHICLE = 54,
- CMD_RENAME_ENGINE = 55,
- CMD_CHANGE_COMPANY_NAME = 56,
- CMD_CHANGE_PRESIDENT_NAME = 57,
- CMD_RENAME_STATION = 58,
-
- CMD_SELL_AIRCRAFT = 59,
- CMD_START_STOP_AIRCRAFT = 60,
- CMD_BUILD_AIRCRAFT = 61,
- CMD_SEND_AIRCRAFT_TO_HANGAR = 62,
- CMD_REFIT_AIRCRAFT = 64,
-
- CMD_PLACE_SIGN = 65,
- CMD_RENAME_SIGN = 66,
+ CMD_REMOVE_FROM_RAILROAD_STATION = 14, ///< remove a tile station
+ CMD_CONVERT_RAIL = 15, ///< convert a rail type
- CMD_BUILD_ROAD_VEH = 67,
- CMD_START_STOP_ROADVEH = 68,
- CMD_SELL_ROAD_VEH = 69,
- CMD_SEND_ROADVEH_TO_DEPOT = 70,
- CMD_TURN_ROADVEH = 71,
- CMD_REFIT_ROAD_VEH = 72,
-
- CMD_PAUSE = 73,
-
- CMD_BUY_SHARE_IN_COMPANY = 74,
- CMD_SELL_SHARE_IN_COMPANY = 75,
- CMD_BUY_COMPANY = 76,
-
- CMD_BUILD_TOWN = 77,
+ CMD_BUILD_TRAIN_WAYPOINT = 16, ///< build a waypoint
+ CMD_RENAME_WAYPOINT = 17, ///< rename a waypoint
+ CMD_REMOVE_TRAIN_WAYPOINT = 18, ///< remove a waypoint
- CMD_RENAME_TOWN = 80,
- CMD_DO_TOWN_ACTION = 81,
-
- CMD_SET_ROAD_DRIVE_SIDE = 82,
-
- CMD_CHANGE_DIFFICULTY_LEVEL = 85,
+ CMD_BUILD_ROAD_STOP = 21, ///< build a road stop
+ CMD_REMOVE_ROAD_STOP = 22, ///< remove a road stop
+ CMD_BUILD_LONG_ROAD = 23, ///< build a complete road (not a "half" one)
+ CMD_REMOVE_LONG_ROAD = 24, ///< remove a complete road (not a "half" one)
+ CMD_BUILD_ROAD = 25, ///< build a "half" road
+ CMD_REMOVE_ROAD = 26, ///< remove a "half" road
+ CMD_BUILD_ROAD_DEPOT = 27, ///< build a road depot
- CMD_START_STOP_SHIP = 86,
- CMD_SELL_SHIP = 87,
- CMD_BUILD_SHIP = 88,
- CMD_SEND_SHIP_TO_DEPOT = 89,
- CMD_REFIT_SHIP = 91,
+ CMD_BUILD_AIRPORT = 29, ///< build an airport
- CMD_ORDER_REFIT = 98,
- CMD_CLONE_ORDER = 99,
- CMD_CLEAR_AREA = 100,
+ CMD_BUILD_DOCK = 30, ///< build a dock
- CMD_MONEY_CHEAT = 102,
- CMD_BUILD_CANAL = 103,
+ CMD_BUILD_SHIP_DEPOT = 31, ///< build a ship depot
+ CMD_BUILD_BUOY = 32, ///< build a buoy
+
+ CMD_PLANT_TREE = 33, ///< plant a tree
+
+ CMD_BUILD_RAIL_VEHICLE = 34, ///< build a rail vehicle
+ CMD_MOVE_RAIL_VEHICLE = 35, ///< move a rail vehicle (in the depot)
+
+ CMD_START_STOP_TRAIN = 36, ///< start or stop a train
+
+ CMD_SELL_RAIL_WAGON = 38, ///< sell a rail wagon
+
+ CMD_SEND_TRAIN_TO_DEPOT = 39, ///< send a train to a depot
+ CMD_FORCE_TRAIN_PROCEED = 40, ///< proceed a train to pass a red signal
+ CMD_REVERSE_TRAIN_DIRECTION = 41, ///< turn a train around
+
+ CMD_MODIFY_ORDER = 42, ///< modify an order (like set full-load)
+ CMD_SKIP_TO_ORDER = 43, ///< skip an order to the next of specific one
+ CMD_DELETE_ORDER = 44, ///< delete an order
+ CMD_INSERT_ORDER = 45, ///< insert a new order
+
+ CMD_CHANGE_SERVICE_INT = 46, ///< change the server interval of a vehicle
+
+ CMD_BUILD_INDUSTRY = 47, ///< build a new industry
+
+ CMD_BUILD_COMPANY_HQ = 48, ///< build the company headquarter
+ CMD_SET_PLAYER_FACE = 49, ///< set the face of the player/company
+ CMD_SET_PLAYER_COLOR = 50, ///< set the color of the player/company
+
+ CMD_INCREASE_LOAN = 51, ///< increase the loan from the bank
+ CMD_DECREASE_LOAN = 52, ///< decrease the loan from the bank
+
+ CMD_WANT_ENGINE_PREVIEW = 53, ///< confirm the preview of an engine
+
+ CMD_NAME_VEHICLE = 54, ///< rename a whole vehicle
+ CMD_RENAME_ENGINE = 55, ///< rename a engine (in the engine list)
+ CMD_CHANGE_COMPANY_NAME = 56, ///< change the company name
+ CMD_CHANGE_PRESIDENT_NAME = 57, ///< change the president name
+ CMD_RENAME_STATION = 58, ///< rename a station
+
+ CMD_SELL_AIRCRAFT = 59, ///< sell an aircraft
+ CMD_START_STOP_AIRCRAFT = 60, ///< start/stop an aircraft
+ CMD_BUILD_AIRCRAFT = 61, ///< build an aircraft
+ CMD_SEND_AIRCRAFT_TO_HANGAR = 62, ///< send an aircraft to a hanger
+ CMD_REFIT_AIRCRAFT = 64, ///< refit the cargo space of an aircraft
+
+ CMD_PLACE_SIGN = 65, ///< place a sign
+ CMD_RENAME_SIGN = 66, ///< rename a sign
+
+ CMD_BUILD_ROAD_VEH = 67, ///< build a road vehicle
+ CMD_START_STOP_ROADVEH = 68, ///< start/stop a road vehicle
+ CMD_SELL_ROAD_VEH = 69, ///< sell a road vehicle
+ CMD_SEND_ROADVEH_TO_DEPOT = 70, ///< send a road vehicle to the depot
+ CMD_TURN_ROADVEH = 71, ///< turn a road vehicle around
+ CMD_REFIT_ROAD_VEH = 72, ///< refit the cargo space of a road vehicle
+
+ CMD_PAUSE = 73, ///< pause the game
+
+ CMD_BUY_SHARE_IN_COMPANY = 74, ///< buy a share from a company
+ CMD_SELL_SHARE_IN_COMPANY = 75, ///< sell a share from a company
+ CMD_BUY_COMPANY = 76, ///< buy a company which is bankrupt
+
+ CMD_BUILD_TOWN = 77, ///< build a town
+
+ CMD_RENAME_TOWN = 80, ///< rename a town
+ CMD_DO_TOWN_ACTION = 81, ///< do a action from the town detail window (like advertises or bribe)
+
+ CMD_SET_ROAD_DRIVE_SIDE = 82, ///< set the side where the road vehicles drive
+
+ CMD_CHANGE_DIFFICULTY_LEVEL = 85, ///< change the difficult of a game (each setting for it own)
+
+ CMD_START_STOP_SHIP = 86, ///< start/stop a ship
+ CMD_SELL_SHIP = 87, ///< sell a ship
+ CMD_BUILD_SHIP = 88, ///< build a new ship
+ CMD_SEND_SHIP_TO_DEPOT = 89, ///< send a ship to a depot
+ CMD_REFIT_SHIP = 91, ///< refit the cargo space of a ship
+
+ CMD_ORDER_REFIT = 98, ///< change the refit informaction of an order (for "goto depot" )
+ CMD_CLONE_ORDER = 99, ///< clone (and share) an order
+ CMD_CLEAR_AREA = 100, ///< clear an area
+
+ CMD_MONEY_CHEAT = 102, ///< do the money cheat
+ CMD_BUILD_CANAL = 103, ///< build a canal
CMD_PLAYER_CTRL = 104, ///< used in multiplayer to create a new player etc.
CMD_LEVEL_LAND = 105, ///< level land
- CMD_REFIT_RAIL_VEHICLE = 106,
- CMD_RESTORE_ORDER_INDEX = 107,
- CMD_BUILD_LOCK = 108,
-
- CMD_BUILD_SIGNAL_TRACK = 110,
- CMD_REMOVE_SIGNAL_TRACK = 111,
-
- CMD_GIVE_MONEY = 113,
- CMD_CHANGE_PATCH_SETTING = 114,
-
- CMD_SET_AUTOREPLACE = 115,
+ CMD_REFIT_RAIL_VEHICLE = 106, ///< refit the cargo space of a train
+ CMD_RESTORE_ORDER_INDEX = 107, ///< restore vehicle order-index and service interval
+ CMD_BUILD_LOCK = 108, ///< build a lock
- CMD_CLONE_VEHICLE = 116,
- CMD_MASS_START_STOP = 117,
- CMD_DEPOT_SELL_ALL_VEHICLES = 118,
- CMD_DEPOT_MASS_AUTOREPLACE = 119,
+ CMD_BUILD_SIGNAL_TRACK = 110, ///< add signals along a track (by dragging)
+ CMD_REMOVE_SIGNAL_TRACK = 111, ///< remove signals along a track (by dragging)
- CMD_CREATE_GROUP = 120,
- CMD_DELETE_GROUP = 121,
- CMD_RENAME_GROUP = 122,
- CMD_ADD_VEHICLE_GROUP = 123,
- CMD_ADD_SHARED_VEHICLE_GROUP = 124,
- CMD_REMOVE_ALL_VEHICLES_GROUP = 125,
- CMD_SET_GROUP_REPLACE_PROTECTION = 126,
+ CMD_GIVE_MONEY = 113, ///< give money to an other player
+ CMD_CHANGE_PATCH_SETTING = 114, ///< change a patch setting
- CMD_MOVE_ORDER = 127,
- CMD_CHANGE_TIMETABLE = 128,
- CMD_SET_VEHICLE_ON_TIME = 129,
- CMD_AUTOFILL_TIMETABLE = 130,
+ CMD_SET_AUTOREPLACE = 115, ///< set an autoreplace entry
+
+ CMD_CLONE_VEHICLE = 116, ///< clone a vehicle
+ CMD_MASS_START_STOP = 117, ///< start/stop all vehicles (in a depot)
+ CMD_DEPOT_SELL_ALL_VEHICLES = 118, ///< sell all vehicles which are in a given depot
+ CMD_DEPOT_MASS_AUTOREPLACE = 119, ///< force the autoreplace to take action in a given depot
+
+ CMD_CREATE_GROUP = 120, ///< create a new group
+ CMD_DELETE_GROUP = 121, ///< delete a group
+ CMD_RENAME_GROUP = 122, ///< rename a group
+ CMD_ADD_VEHICLE_GROUP = 123, ///< add a vehicle to a group
+ CMD_ADD_SHARED_VEHICLE_GROUP = 124, ///< add all other shared vehicles to a group which are missing
+ CMD_REMOVE_ALL_VEHICLES_GROUP = 125, ///< remove all vehicles from a group
+ CMD_SET_GROUP_REPLACE_PROTECTION = 126, ///< set the autoreplace-protection for a group
+
+ CMD_MOVE_ORDER = 127, ///< move an order
+ CMD_CHANGE_TIMETABLE = 128, ///< change the timetable for a vehicle
+ CMD_SET_VEHICLE_ON_TIME = 129, ///< set the vehicle on time feature (timetable)
+ CMD_AUTOFILL_TIMETABLE = 130, ///< autofill the timetable
};
+/**
+ * List of flags for a command.
+ *
+ * This enums defines some flags which can be used for the commands.
+ */
enum {
- DC_EXEC = 0x01,
+ DC_EXEC = 0x01, ///< execute the given command
DC_AUTO = 0x02, ///< don't allow building on structures
DC_QUERY_COST = 0x04, ///< query cost only, don't build.
DC_NO_WATER = 0x08, ///< don't allow building on water
@@ -169,50 +184,167 @@
DC_FORCETEST = 0x80, ///< force test too.
};
+/**
+ * Used to combine a StringID with the command.
+ *
+ * This macro can be used to add a StringID (the error message to show) on a command-id
+ * (CMD_xxx). Use the binary or-operator "|" to combine the command with the result from
+ * this macro.
+ *
+ * @param x The StringID to combine with a command-id
+ */
#define CMD_MSG(x) ((x) << 16)
+/**
+ * Defines some flags.
+ *
+ * This enumeration defines some flags which are binary-or'ed on a command.
+ */
enum {
- CMD_AUTO = 0x0200,
- CMD_NO_WATER = 0x0400,
+ CMD_NO_WATER = 0x0400, ///< dont build on water
CMD_NETWORK_COMMAND = 0x0800, ///< execute the command without sending it on the network
CMD_NO_TEST_IF_IN_NETWORK = 0x1000, ///< When enabled, the command will bypass the no-DC_EXEC round if in network
- CMD_SHOW_NO_ERROR = 0x2000,
+ CMD_SHOW_NO_ERROR = 0x2000, ///< do not show the error message
};
-/** Command flags for the command table _command_proc_table */
+/**
+ * Command flags for the command table _command_proc_table.
+ *
+ * This enumeration defines flags for the _command_proc_table.
+ */
enum {
CMD_SERVER = 0x1, ///< the command can only be initiated by the server
CMD_OFFLINE = 0x2, ///< the command cannot be executed in a multiplayer game; single-player only
+ CMD_AUTO = 0x4, ///< set the DC_AUTO flag on this command
};
+/**
+ * Defines the callback type for all command handler functions.
+ *
+ * This type defines the function header for all functions which handles a CMD_* command.
+ * A command handler use the parameters to act according to the meaning of the command.
+ * The tile parameter defines the tile to perform an action on.
+ * The flag parameter is filled with flags from the DC_* enumeration. The parameters
+ * p1 and p2 are filled with parameters for the command like "which road type", "which
+ * order" or "direction". Each function should mentioned in there doxygen comments
+ * the usage of these parameters.
+ *
+ * @param tile The tile to apply a command on
+ * @param flags Flags for the command, from the DC_* enumeration
+ * @param p1 Additional data for the command
+ * @param p2 Additional data for the command
+ * @return The CommandCost of the command, which can be succeeded or failed.
+ */
typedef CommandCost CommandProc(TileIndex tile, uint32 flags, uint32 p1, uint32 p2);
+/**
+ * Define a command with the flags which belongs to it.
+ *
+ * This struct connect a command handler function with the flags created with
+ * the #CMD_AUTO, #CMD_OFFLINE and #CMD_SERVER values.
+ */
struct Command {
CommandProc *proc;
byte flags;
};
+/**
+ * Checks if a command failes.
+ *
+ * As you see the parameter is not a command but the return value of a command,
+ * the CommandCost class. This function checks if the command executed by
+ * the CommandProc function failed and returns true if it does.
+ *
+ * @param cost The return value of a CommandProc call
+ * @return true if the command failes
+ * @see CmdSucceded
+ */
static inline bool CmdFailed(CommandCost cost) { return cost.Failed(); }
+
+/**
+ * Checks if a command succeeded.
+ *
+ * As #CmdFailed this function checks if a command succeeded
+ *
+ * @param cost The return value of a CommandProc call
+ * @return true if the command succeeded
+ * @see CmdSucceeded
+ */
static inline bool CmdSucceeded(CommandCost cost) { return cost.Succeeded(); }
+/**
+ * Define a default return value for a failed command.
+ *
+ * This variable contains a CommandCost object with is declared as "failed".
+ * Other functions just need to return this error if there is an error,
+ * which doesn't need to specific by a StringID.
+ */
static const CommandCost CMD_ERROR = CommandCost(INVALID_STRING_ID);
-#define return_cmd_error(errcode) do { return CommandCost(errcode); } while (0)
+/**
+ * Returns from a function with a specific StringID as error.
+ *
+ * This macro is used to return from a function. The parameter contains the
+ * StringID which will be returned.
+ *
+ * @param errcode The StringID to return
+ */
+#define return_cmd_error(errcode) return CommandCost(errcode);
/* command.cpp */
+/**
+ * Define a callback function for the client, after the command is finished.
+ *
+ * Functions of this type are called after the command is finished. The parameters
+ * are from the #CommandProc callback type. The boolean parameter indicates if the
+ * command succeeded or failed.
+ *
+ * @param success If the command succeeded or not.
+ * @param tile The tile of the command action
+ * @param p1 Additional data of the command
+ * @param p1 Additional data of the command
+ * @see CommandProc
+ */
typedef void CommandCallback(bool success, TileIndex tile, uint32 p1, uint32 p2);
+
+/**
+ * Execute a command
+ */
CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc);
+
+/**
+ * Execute a network safe DoCommand function
+ */
bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd, bool my_cmd = true);
#ifdef ENABLE_NETWORK
+/**
+ * Send a command over the network
+ */
void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback);
#endif /* ENABLE_NETWORK */
-extern const char* _cmd_text; ///< Text, which gets sent with a command
+/**
+ * Text, which gets sent with a command
+ *
+ * This variable contains a string (be specific a pointer of the first
+ * char of this string) which will be send with a command. This is
+ * used for user input data like names or chat messages.
+ */
+extern const char *_cmd_text;
+/**
+ * Checks if a integer value belongs to a command.
+ */
bool IsValidCommand(uint cmd);
+/**
+ * Returns the flags from a given command.
+ */
byte GetCommandFlags(uint cmd);
+/**
+ * Returns the current money available which can be used for a command.
+ */
Money GetAvailableMoneyForCommand();
#endif /* COMMAND_H */
--- a/src/depot_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/depot_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -474,7 +474,7 @@
if (v == NULL) return;
- if (v->HasFront() && !v->IsPrimaryVehicle()) {
+ if (!v->IsPrimaryVehicle()) {
v = v->First();
/* Do nothing when clicking on a train in depot with no loc attached */
if (v->type == VEH_TRAIN && !IsFrontEngine(v)) return;
@@ -928,7 +928,7 @@
if (is_engine) {
_backup_orders_tile = v->tile;
- BackupVehicleOrders(v, _backup_orders_data);
+ BackupVehicleOrders(v);
}
switch (v->type) {
--- a/src/direction.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/direction.h Sat Oct 06 21:16:00 2007 +0000
@@ -165,6 +165,9 @@
DIAGDIRDIFF_90LEFT = 3 ///< 90 degrees left
};
+/** Allow incrementing of DiagDirDiff variables */
+DECLARE_POSTFIX_INCREMENT(DiagDirDiff);
+
/**
* Applies a difference on a DiagDirection
*
--- a/src/dock_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/dock_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -38,17 +38,17 @@
static void PlaceDocks_Dock(TileIndex tile)
{
- DoCommandP(tile, _ctrl_pressed, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_AUTO | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE));
+ DoCommandP(tile, _ctrl_pressed, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE));
}
static void PlaceDocks_Depot(TileIndex tile)
{
- DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_AUTO | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT));
+ DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT));
}
static void PlaceDocks_Buoy(TileIndex tile)
{
- DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_AUTO | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE));
+ DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE));
}
static void PlaceDocks_DemolishArea(TileIndex tile)
@@ -63,7 +63,7 @@
static void PlaceDocks_BuildLock(TileIndex tile)
{
- DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_LOCKS));
+ DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_MSG(STR_CANT_BUILD_LOCKS));
}
@@ -162,7 +162,7 @@
GUIPlaceProcDragXY(e);
break;
case DDSP_CREATE_WATER:
- DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
+ DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
break;
default: break;
}
--- a/src/economy.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/economy.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -217,10 +217,7 @@
/* Skip the total */
if (i == SCORE_TOTAL) continue;
/* Check the score */
- s = (_score_part[owner][i] >= _score_info[i].needed) ?
- _score_info[i].score :
- _score_part[owner][i] * _score_info[i].score / _score_info[i].needed;
- if (s < 0) s = 0;
+ s = clamp(_score_part[owner][i], 0, _score_info[i].needed) * _score_info[i].score / _score_info[i].needed;
score += s;
total_score += _score_info[i].score;
}
@@ -976,7 +973,6 @@
static void FindSubsidyCargoRoute(FoundRoute *fr)
{
Industry *i;
- const IndustrySpec *ind;
int trans, total;
CargoID cargo;
@@ -984,15 +980,14 @@
fr->from = i = GetRandomIndustry();
if (i == NULL) return;
- ind = GetIndustrySpec(i->type);
/* Randomize cargo type */
- if (HASBIT(Random(), 0) && ind->produced_cargo[1] != CT_INVALID) {
- cargo = ind->produced_cargo[1];
+ if (HASBIT(Random(), 0) && i->produced_cargo[1] != CT_INVALID) {
+ cargo = i->produced_cargo[1];
trans = i->last_month_pct_transported[1];
total = i->last_month_production[1];
} else {
- cargo = ind->produced_cargo[0];
+ cargo = i->produced_cargo[0];
trans = i->last_month_pct_transported[0];
total = i->last_month_production[0];
}
@@ -1019,17 +1014,12 @@
} else {
/* The destination is an industry */
Industry *i2 = GetRandomIndustry();
- if (i2 == NULL) {
- return;
- }
-
- ind = GetIndustrySpec(i2->type);
/* The industry must accept the cargo */
- if (i == i2 ||
- (cargo != ind->accepts_cargo[0] &&
- cargo != ind->accepts_cargo[1] &&
- cargo != ind->accepts_cargo[2])) {
+ if (i2 == NULL || i == i2 ||
+ (cargo != i2->accepts_cargo[0] &&
+ cargo != i2->accepts_cargo[1] &&
+ cargo != i2->accepts_cargo[2])) {
return;
}
fr->distance = DistanceManhattan(i->xy, i2->xy);
@@ -1230,12 +1220,12 @@
indspec = GetIndustrySpec(ind->type);
uint i;
- for (i = 0; i < lengthof(indspec->accepts_cargo); i++) {
- if (cargo_type == indspec->accepts_cargo[i]) break;
+ for (i = 0; i < lengthof(ind->accepts_cargo); i++) {
+ if (cargo_type == ind->accepts_cargo[i]) break;
}
/* Check if matching cargo has been found */
- if (i == lengthof(indspec->accepts_cargo)) continue;
+ if (i == lengthof(ind->accepts_cargo)) continue;
if (HASBIT(indspec->callback_flags, CBM_IND_REFUSE_CARGO)) {
uint16 res = GetIndustryCallback(CBID_INDUSTRY_REFUSE_CARGO, 0, GetReverseCargoTranslation(cargo_type, indspec->grf_prop.grffile), ind, ind->type, ind->xy);
@@ -1533,7 +1523,7 @@
if (v->cargo_cap == 0) continue;
byte load_amount = EngInfo(v->engine_type)->load_amount;
- if (_patches.gradual_loading && HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_LOAD_AMOUNT)) {
+ if (_patches.gradual_loading && HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_LOAD_AMOUNT)) {
uint16 cb_load_amount = GetVehicleCallback(CBID_VEHICLE_LOAD_AMOUNT, 0, 0, v->engine_type, v);
if (cb_load_amount != CALLBACK_FAILED) load_amount = cb_load_amount & 0xFF;
}
@@ -1693,8 +1683,13 @@
}
}
- /* Calculate the loading indicator fill percent and display */
- if (_patches.loading_indicators && _game_mode != GM_MENU && v->owner == _local_player) {
+ /* Calculate the loading indicator fill percent and display
+ * In the Game Menu do not display indicators
+ * If _patches.loading_indicators == 2, show indicators (bool can be promoted to int as 0 or 1 - results in 2 > 0,1 )
+ * if _patches.loading_indicators == 1, _local_player must be the owner or must be a spectator to show ind., so 1 > 0
+ * if _patches.loading_indicators == 0, do not display indicators ... 0 is never greater than anything
+ */
+ if (_game_mode != GM_MENU && (_patches.loading_indicators > (uint)(v->owner != _local_player && _local_player != PLAYER_SPECTATOR))) {
StringID percent_up_down = STR_NULL;
int percent = CalcPercentVehicleFilled(v, &percent_up_down);
if (v->fill_percent_te_id == INVALID_TE_ID) {
--- a/src/elrail.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/elrail.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -141,6 +141,65 @@
}
}
+/**
+ * Returns the Z position of a Pylon Control Point.
+ *
+ * @param tile The tile the pylon should stand on.
+ * @param PCPpos The PCP of the tile.
+ * @return The Z position of the PCP.
+ */
+static byte GetPCPElevation(TileIndex tile, DiagDirection PCPpos)
+{
+ /* The elevation of the "pylon"-sprite should be the elevation at the PCP.
+ * PCPs are always on a tile edge.
+ *
+ * This position can be outside of the tile, i.e. ?_pcp_offset == TILE_SIZE > TILE_SIZE - 1.
+ * So we have to move it inside the tile, because if the neighboured tile has a foundation,
+ * that does not smoothly connect to the current tile, we will get a wrong elevation from GetSlopeZ().
+ *
+ * When we move the position inside the tile, we will get a wrong elevation if we have a slope.
+ * To catch all cases we round the Z position to the next (TILE_HEIGHT / 2).
+ * This will return the correct elevation for slopes and will also detect non-continuous elevation on edges.
+ *
+ * Also note that the result of GetSlopeZ() is very special on bridge-ramps.
+ */
+
+ byte z = GetSlopeZ(TileX(tile) * TILE_SIZE + min(x_pcp_offsets[PCPpos], TILE_SIZE - 1), TileY(tile) * TILE_SIZE + min(y_pcp_offsets[PCPpos], TILE_SIZE - 1));
+ return (z + 2) & ~3; // this means z = (z + TILE_HEIGHT / 4) / (TILE_HEIGHT / 2) * (TILE_HEIGHT / 2);
+}
+
+/**
+ * Draws wires on a tunnel tile
+ *
+ * DrawTile_TunnelBridge() calls this function to draw the wires as SpriteCombine with the tunnel roof.
+ *
+ * @param ti The Tileinfo to draw the tile for
+ */
+void DrawCatenaryOnTunnel(const TileInfo *ti)
+{
+ /* xmin, ymin, xmax + 1, ymax + 1 of BB */
+ static const int _tunnel_wire_BB[4][4] = {
+ { 0, 1, 16, 15 }, // NE
+ { 1, 0, 15, 16 }, // SE
+ { 0, 1, 16, 15 }, // SW
+ { 1, 0, 15, 16 }, // NW
+ };
+
+ if ((GetRailType(ti->tile) != RAILTYPE_ELECTRIC) || _patches.disable_elrails) return;
+
+ DiagDirection dir = GetTunnelDirection(ti->tile);
+
+ const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[dir];
+ const int *BB_data = _tunnel_wire_BB[dir];
+ AddSortableSpriteToDraw(
+ sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
+ BB_data[2] - sss->x_offset, BB_data[3] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset + 1,
+ GetTileZ(ti->tile) + sss->z_offset,
+ HASBIT(_transparent_opt, TO_BUILDINGS),
+ BB_data[0] - sss->x_offset, BB_data[1] - sss->y_offset, BB_Z_SEPARATOR - sss->z_offset
+ );
+}
+
/** Draws wires and, if required, pylons on a given tile
* @param ti The Tileinfo to draw the tile for
*/
@@ -184,6 +243,11 @@
tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL);
trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL);
if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
+
+ /* If the neighboured tile does not smoothly connect to the current tile (because of a foundation),
+ * we have to draw all pillars on the current tile. */
+ if (GetPCPElevation(ti->tile, i) != GetPCPElevation(neighbour, ReverseDiagDir(i))) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
+
isflat[TS_NEIGHBOUR] = ((trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
PPPpreferred[i] = 0xFF; // We start with preferring everything (end-of-line in any direction)
@@ -220,7 +284,7 @@
if (IsTileType(neighbour, MP_STATION)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
/* Read the foundataions if they are present, and adjust the tileh */
- if (IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
+ if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
if (IsBridgeTile(neighbour)) {
foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetBridgeRampDirection(neighbour)));
}
@@ -268,9 +332,9 @@
continue; /* No neighbour, go looking for a better position */
}
- AddSortableSpriteToDraw(pylons_normal[temp], PAL_NONE, x, y, 1, 1, 10,
- GetSlopeZ(ti->x + x_pcp_offsets[i], ti->y + y_pcp_offsets[i]),
- HASBIT(_transparent_opt, TO_BUILDINGS));
+ AddSortableSpriteToDraw(pylon_sprites[temp], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE,
+ GetPCPElevation(ti->tile, i),
+ HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
break; /* We already have drawn a pylon, bail out */
}
}
@@ -287,17 +351,7 @@
/* Drawing of pylons is finished, now draw the wires */
for (t = TRACK_BEGIN; t < TRACK_END; t++) {
if (HASBIT(trackconfig[TS_HOME], t)) {
- if (IsTunnelTile(ti->tile)) {
- const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[GetTunnelDirection(ti->tile)];
-
- AddSortableSpriteToDraw(
- sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
- sss->x_size, sss->y_size, sss->z_size,
- GetTileZ(ti->tile) + sss->z_offset,
- HASBIT(_transparent_opt, TO_BUILDINGS)
- );
- break;
- }
+ if (IsTunnelTile(ti->tile)) break; // drawn together with tunnel-roof (see DrawCatenaryOnTunnel())
byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) +
(HASBIT(PCPstatus, PCPpositions[t][1]) << 1);
@@ -308,8 +362,13 @@
assert(!IsSteepSlope(tileh[TS_HOME]));
sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]];
+ /*
+ * The "wire"-sprite position is inside the tile, i.e. 0 <= sss->?_offset < TILE_SIZE.
+ * Therefore it is save to use GetSlopeZ() for the elevation.
+ * Also note, that the result of GetSlopeZ() is very special for bridge-ramps.
+ */
AddSortableSpriteToDraw(sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
- sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + min(sss->x_offset, TILE_SIZE - 1), ti->y + min(sss->y_offset, TILE_SIZE - 1)) + sss->z_offset,
+ sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + sss->x_offset, ti->y + sss->y_offset) + sss->z_offset,
HASBIT(_transparent_opt, TO_BUILDINGS));
}
}
@@ -349,20 +408,22 @@
/* Finished with wires, draw pylons */
/* every other tile needs a pylon on the northern end */
if (num % 2) {
- if (axis == AXIS_X) {
- AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
- } else {
- AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
- }
+ DiagDirection PCPpos = (axis == AXIS_X ? DIAGDIR_NE : DIAGDIR_NW);
+ Direction PPPpos = (axis == AXIS_X ? DIR_NW : DIR_NE);
+ if (HASBIT(tlg, (axis == AXIS_X ? 0 : 1))) PPPpos = ReverseDir(PPPpos);
+ uint x = ti->x + x_pcp_offsets[PCPpos] + x_ppp_offsets[PPPpos];
+ uint y = ti->y + y_pcp_offsets[PCPpos] + y_ppp_offsets[PPPpos];
+ AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
}
/* need a pylon on the southern end of the bridge */
if (DistanceMax(ti->tile, start) == length) {
- if (axis == AXIS_X) {
- AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x + 16, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
- } else {
- AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height, HASBIT(_transparent_opt, TO_BUILDINGS));
- }
+ DiagDirection PCPpos = (axis == AXIS_X ? DIAGDIR_SW : DIAGDIR_SE);
+ Direction PPPpos = (axis == AXIS_X ? DIR_NW : DIR_NE);
+ if (HASBIT(tlg, (axis == AXIS_X ? 0 : 1))) PPPpos = ReverseDir(PPPpos);
+ uint x = ti->x + x_pcp_offsets[PCPpos] + x_ppp_offsets[PPPpos];
+ uint y = ti->y + y_pcp_offsets[PCPpos] + y_ppp_offsets[PPPpos];
+ AddSortableSpriteToDraw(pylon_sprites[PPPpos], PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, height, HASBIT(_transparent_opt, TO_BUILDINGS), -1, -1);
}
}
@@ -383,6 +444,7 @@
if (IsRailDepot(ti->tile)) {
const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)];
+ /* This wire is not visible with the default depot sprites */
AddSortableSpriteToDraw(
sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
sss->x_size, sss->y_size, sss->z_size,
--- a/src/fileio.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/fileio.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -16,8 +16,8 @@
#else
#include <pwd.h>
#include <unistd.h>
+#endif
#include <sys/stat.h>
-#endif
/*************************************************/
/* FILE IO ROUTINES ******************************/
@@ -74,18 +74,18 @@
#endif /* LIMITED_FDS */
/* Seek to a file and a position */
-void FioSeekToFile(uint32 pos)
+void FioSeekToFile(uint8 slot, uint32 pos)
{
FILE *f;
#if defined(LIMITED_FDS)
/* Make sure we have this file open */
- FioRestoreFile(pos >> 24);
+ FioRestoreFile(slot);
#endif /* LIMITED_FDS */
- f = _fio.handles[pos >> 24];
+ f = _fio.handles[slot];
assert(f != NULL);
_fio.cur_fh = f;
- _fio.filename = _fio.filenames[pos >> 24];
- FioSeekTo(GB(pos, 0, 24), SEEK_SET);
+ _fio.filename = _fio.filenames[slot];
+ FioSeekTo(pos, SEEK_SET);
}
byte FioReadByte()
@@ -180,6 +180,7 @@
#endif /* LIMITED_FDS */
f = FioFOpenFile(filename);
if (f == NULL) error("Cannot open file '%s'", filename);
+ uint32 pos = ftell(f);
FioCloseFile(slot); // if file was opened before, close it
_fio.handles[slot] = f;
@@ -188,7 +189,7 @@
_fio.usage_count[slot] = 0;
_fio.open_handles++;
#endif /* LIMITED_FDS */
- FioSeekToFile(slot << 24);
+ FioSeekToFile(slot, pos);
}
const char *_subdirs[NUM_SUBDIRS] = {
@@ -203,6 +204,8 @@
};
const char *_searchpaths[NUM_SEARCHPATHS];
+TarList _tar_list;
+TarFileList _tar_filelist;
/**
* Check whether the given file exists
@@ -215,8 +218,16 @@
FILE *f = FioFOpenFile(filename, "rb", subdir);
if (f == NULL) return false;
+ FioFCloseFile(f);
+ return true;
+}
+
+/**
+ * Close a file in a safe way.
+ */
+void FioFCloseFile(FILE *f)
+{
fclose(f);
- return true;
}
char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename)
@@ -266,7 +277,7 @@
return buf;
}
-FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir)
+FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
{
#if defined(WIN32) && defined(UNICODE)
/* fopen is implemented as a define with ellipses for
@@ -285,6 +296,10 @@
snprintf(buf, lengthof(buf), "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename);
}
+#if defined(WIN32)
+ if (mode[0] == 'r' && GetFileAttributes(OTTD2FS(buf)) == INVALID_FILE_ATTRIBUTES) return NULL;
+#endif
+
f = fopen(buf, mode);
#if !defined(WIN32)
if (f == NULL) {
@@ -292,11 +307,27 @@
f = fopen(buf, mode);
}
#endif
+ if (f != NULL && filesize != NULL) {
+ /* Find the size of the file */
+ fseek(f, 0, SEEK_END);
+ *filesize = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ }
+ return f;
+}
+
+FILE *FioFOpenFileTar(TarFileListEntry *entry, size_t *filesize)
+{
+ FILE *f = fopen(entry->tar->filename, "rb");
+ assert(f != NULL);
+
+ fseek(f, entry->position, SEEK_SET);
+ if (filesize != NULL) *filesize = entry->size;
return f;
}
/** Opens OpenTTD files somewhere in a personal or global directory */
-FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir)
+FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
{
FILE *f = NULL;
Searchpath sp;
@@ -304,10 +335,22 @@
assert(subdir < NUM_SUBDIRS || subdir == NO_DIRECTORY);
FOR_ALL_SEARCHPATHS(sp) {
- f = FioFOpenFileSp(filename, mode, sp, subdir);
+ f = FioFOpenFileSp(filename, mode, sp, subdir, filesize);
if (f != NULL || subdir == NO_DIRECTORY) break;
}
+ /* We can only use .tar in case of data-dir, and read-mode */
+ if (f == NULL && subdir == DATA_DIR && mode[0] == 'r') {
+ /* Filenames in tars are always forced to be lowercase */
+ char *lcfilename = strdup(filename);
+ strtolower(lcfilename);
+ TarFileList::iterator it = _tar_filelist.find(lcfilename);
+ free(lcfilename);
+ if (it != _tar_filelist.end()) {
+ f = FioFOpenFileTar(&((*it).second), filesize);
+ }
+ }
+
return f;
}
@@ -368,6 +411,169 @@
return dest;
}
+static bool TarListAddFile(const char *filename)
+{
+ /* The TAR-header, repeated for every file */
+ typedef struct TarHeader {
+ char name[100]; ///< Name of the file
+ char mode[8];
+ char uid[8];
+ char gid[8];
+ char size[12]; ///< Size of the file, in ASCII
+ char mtime[12];
+ char chksum[8];
+ char typeflag;
+ char linkname[100];
+ char magic[6];
+ char version[2];
+ char uname[32];
+ char gname[32];
+ char devmajor[8];
+ char devminor[8];
+ char prefix[155]; ///< Path of the file
+
+ char unused[12];
+ } TarHeader;
+
+ /* Check if we already seen this file */
+ TarList::iterator it = _tar_list.find(filename);
+ if (it != _tar_list.end()) return false;
+
+ FILE *f = fopen(filename, "rb");
+ assert(f != NULL);
+
+ TarListEntry *tar_entry = MallocT<TarListEntry>(1);
+ tar_entry->filename = strdup(filename);
+ _tar_list.insert(TarList::value_type(filename, tar_entry));
+
+ TarHeader th;
+ char buf[sizeof(th.name) + 1], *end;
+ char name[sizeof(th.prefix) + 1 + sizeof(th.name) + 1];
+ int num = 0, pos = 0;
+
+ /* Make a char of 512 empty bytes */
+ char empty[512];
+ memset(&empty[0], 0, sizeof(empty));
+
+ while (!feof(f)) {
+ fread(&th, 1, 512, f);
+ pos += 512;
+
+ /* Check if we have the new tar-format (ustar) or the old one (a lot of zeros after 'link' field) */
+ if (strncmp(th.magic, "ustar", 5) != 0 && memcmp(&th.magic, &empty[0], 512 - offsetof(TarHeader, magic)) != 0) {
+ /* If we have only zeros in the block, it can be an end-of-file indicator */
+ if (memcmp(&th, &empty[0], 512) == 0) continue;
+
+ DEBUG(misc, 0, "The file '%s' isn't a valid tar-file", filename);
+ return false;
+ }
+
+ name[0] = '\0';
+ int len = 0;
+
+ /* The prefix contains the directory-name */
+ if (th.prefix[0] != '\0') {
+ memcpy(name, th.prefix, sizeof(th.prefix));
+ name[sizeof(th.prefix)] = '\0';
+ len = strlen(name);
+ name[len] = PATHSEPCHAR;
+ len++;
+ }
+
+ /* Copy the name of the file in a safe way at the end of 'name' */
+ memcpy(&name[len], th.name, sizeof(th.name));
+ name[len + sizeof(th.name)] = '\0';
+
+ /* Calculate the size of the file.. for some strange reason this is stored as a string */
+ memcpy(buf, th.size, sizeof(th.size));
+ buf[sizeof(th.size)] = '\0';
+ int skip = strtol(buf, &end, 8);
+
+ /* 0 byte sized files can be skipped (dirs, symlinks, ..) */
+ if (skip == 0) continue;
+
+ /* Store this entry in the list */
+ TarFileListEntry entry;
+ entry.tar = tar_entry;
+ entry.size = skip;
+ entry.position = pos;
+ /* Force lowercase */
+ strtolower(name);
+
+ /* Tar-files always have '/' path-seperator, but we want our PATHSEPCHAR */
+#if (PATHSEPCHAR != '/')
+ for (char *n = name; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR;
+#endif
+
+ DEBUG(misc, 6, "Found file in tar: %s (%d bytes, %d offset)", name, skip, pos);
+ if (_tar_filelist.insert(TarFileList::value_type(name, entry)).second) num++;
+
+ /* Skip to the next block.. */
+ skip = ALIGN(skip, 512);
+ fseek(f, skip, SEEK_CUR);
+ pos += skip;
+ }
+
+ DEBUG(misc, 1, "Found tar '%s' with %d new files", filename, num);
+ fclose(f);
+
+ return true;
+}
+
+static int ScanPathForTarFiles(const char *path, int basepath_length)
+{
+ extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+
+ uint num = 0;
+ struct stat sb;
+ struct dirent *dirent;
+ DIR *dir;
+
+ if (path == NULL || (dir = ttd_opendir(path)) == NULL) return 0;
+
+ while ((dirent = readdir(dir)) != NULL) {
+ const char *d_name = FS2OTTD(dirent->d_name);
+ char filename[MAX_PATH];
+
+ if (!FiosIsValidFile(path, dirent, &sb)) continue;
+
+ snprintf(filename, lengthof(filename), "%s%s", path, d_name);
+
+ if (sb.st_mode & S_IFDIR) {
+ /* Directory */
+ if (strcmp(d_name, ".") == 0 || strcmp(d_name, "..") == 0) continue;
+ AppendPathSeparator(filename, lengthof(filename));
+ num += ScanPathForTarFiles(filename, basepath_length);
+ } else if (sb.st_mode & S_IFREG) {
+ /* File */
+ char *ext = strrchr(filename, '.');
+
+ /* If no extension or extension isn't .tar, skip the file */
+ if (ext == NULL) continue;
+ if (strcasecmp(ext, ".tar") != 0) continue;
+
+ if (TarListAddFile(filename)) num++;
+ }
+ }
+
+ closedir(dir);
+ return num;
+}
+
+void ScanForTarFiles()
+{
+ Searchpath sp;
+ char path[MAX_PATH];
+ uint num = 0;
+
+ DEBUG(misc, 1, "Scanning for tars");
+ FOR_ALL_SEARCHPATHS(sp) {
+ FioAppendDirectory(path, MAX_PATH, sp, DATA_DIR);
+ num += ScanPathForTarFiles(path, strlen(path));
+ }
+ DEBUG(misc, 1, "Scan complete, found %d files", num);
+}
+
#if defined(WIN32) || defined(WINCE)
/**
* Determine the base (personal dir and game data dir) paths
@@ -454,6 +660,8 @@
#else
_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
#endif
+
+ ScanForTarFiles();
}
#endif /* defined(WIN32) || defined(WINCE) */
--- a/src/fileio.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/fileio.h Sat Oct 06 21:16:00 2007 +0000
@@ -6,9 +6,11 @@
#define FILEIO_H
#include "helpers.hpp"
+#include <map>
+#include <string>
void FioSeekTo(uint32 pos, int mode);
-void FioSeekToFile(uint32 pos);
+void FioSeekToFile(uint8 slot, uint32 pos);
uint32 FioGetPos();
const char *FioGetFilename();
byte FioReadByte();
@@ -61,6 +63,22 @@
extern const char *_searchpaths[NUM_SEARCHPATHS];
/**
+ * The define of a TarList.
+ */
+struct TarListEntry {
+ const char *filename;
+};
+struct TarFileListEntry {
+ TarListEntry *tar;
+ int size;
+ int 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
@@ -72,8 +90,13 @@
/** 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++)
-FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR);
+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);
bool FioCheckFileExists(const char *filename, Subdirectory subdir = DATA_DIR);
char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename);
char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename);
--- a/src/functions.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/functions.h Sat Oct 06 21:16:00 2007 +0000
@@ -103,7 +103,18 @@
void ConvertNameArray();
/* misc functions */
+/**
+ * Mark a tile given by its coordinate dirty for repaint.
+ *
+ * @ingroup dirty
+ */
void MarkTileDirty(int x, int y);
+
+/**
+ * Mark a tile given by its index dirty for repaint.
+ *
+ * @ingroup dirty
+ */
void MarkTileDirtyByTile(TileIndex tile);
void InvalidateWindow(WindowClass cls, WindowNumber number);
void InvalidateWindowWidget(WindowClass cls, WindowNumber number, byte widget_index);
@@ -121,9 +132,14 @@
bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
bool ScrollMainWindowTo(int x, int y, bool instant = false);
-void DrawSprite(SpriteID img, SpriteID pal, int x, int y);
bool EnsureNoVehicle(TileIndex tile);
bool EnsureNoVehicleOnGround(TileIndex tile);
+
+/**
+ * Mark all viewports dirty for repaint.
+ *
+ * @ingroup dirty
+ */
void MarkAllViewportsDirty(int left, int top, int right, int bottom);
void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost);
void ShowFeederIncomeAnimation(int x, int y, int z, Money cost);
--- a/src/gfx.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfx.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -43,11 +43,19 @@
Colour _cur_palette[256];
byte _stringwidth_table[FS_END][224];
-static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode);
+static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = NULL);
FontSize _cur_fontsize;
static FontSize _last_fontsize;
static uint8 _cursor_backup[64 * 64 * 4];
+
+/**
+ * The rect for repaint.
+ *
+ * This rectangle defines the area which should be repaint by the video driver.
+ *
+ * @ingroup dirty
+ */
static Rect _invalid_rect;
static const byte *_color_remap_ptr;
static byte _string_colorremap[3];
@@ -131,6 +139,71 @@
blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, color);
}
+void GfxDrawLineUnscaled(int x, int y, int x2, int y2, int color)
+{
+ Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
+ DrawPixelInfo *dpi = _cur_dpi;
+
+ x -= dpi->left;
+ x2 -= dpi->left;
+ y -= dpi->top;
+ y2 -= dpi->top;
+
+ /* Check clipping */
+ if (x < 0 && x2 < 0) return;
+ if (y < 0 && y2 < 0) return;
+ if (x > dpi->width && x2 > dpi->width) return;
+ if (y > dpi->height && y2 > dpi->height) return;
+
+ blitter->DrawLine(dpi->dst_ptr, UnScaleByZoom(x, dpi->zoom), UnScaleByZoom(y, dpi->zoom),
+ UnScaleByZoom(x2, dpi->zoom), UnScaleByZoom(y2, dpi->zoom),
+ UnScaleByZoom(dpi->width, dpi->zoom), UnScaleByZoom(dpi->height, dpi->zoom), color);
+}
+
+/**
+ * Draws the projection of a parallelepiped.
+ * This can be used to draw boxes in world coordinates.
+ *
+ * @param x Screen X-coordinate of top front corner.
+ * @param y Screen Y-coordinate of top front corner.
+ * @param dx1 Screen X-length of first edge.
+ * @param dy1 Screen Y-length of first edge.
+ * @param dx2 Screen X-length of second edge.
+ * @param dy2 Screen Y-length of second edge.
+ * @param dx3 Screen X-length of third edge.
+ * @param dy3 Screen Y-length of third edge.
+ */
+void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3)
+{
+ /* ....
+ * .. ....
+ * .. ....
+ * .. ^
+ * <--__(dx1,dy1) /(dx2,dy2)
+ * : --__ / :
+ * : --__ / :
+ * : *(x,y) :
+ * : | :
+ * : | ..
+ * .... |(dx3,dy3)
+ * .... | ..
+ * ....V.
+ */
+
+ static const byte color = 255;
+
+ GfxDrawLineUnscaled(x, y, x + dx1, y + dy1, color);
+ GfxDrawLineUnscaled(x, y, x + dx2, y + dy2, color);
+ GfxDrawLineUnscaled(x, y, x + dx3, y + dy3, color);
+
+ GfxDrawLineUnscaled(x + dx1, y + dy1, x + dx1 + dx2, y + dy1 + dy2, color);
+ GfxDrawLineUnscaled(x + dx1, y + dy1, x + dx1 + dx3, y + dy1 + dy3, color);
+ GfxDrawLineUnscaled(x + dx2, y + dy2, x + dx2 + dx1, y + dy2 + dy1, color);
+ GfxDrawLineUnscaled(x + dx2, y + dy2, x + dx2 + dx3, y + dy2 + dy3, color);
+ GfxDrawLineUnscaled(x + dx3, y + dy3, x + dx3 + dx1, y + dy3 + dy1, color);
+ GfxDrawLineUnscaled(x + dx3, y + dy3, x + dx3 + dx2, y + dy3 + dy2, color);
+}
+
/** Truncate a given string to a maximum width if neccessary.
* If the string is truncated, add three dots ('...') to show this.
@@ -269,7 +342,8 @@
GfxFillRect((xl + xr - w) / 2, y + 10, (xl + xr + w) / 2, y + 10, _string_colorremap[1]);
}
-/** 'Correct' a string to a maximum length. Longer strings will be cut into
+/**
+ * 'Correct' a string to a maximum length. Longer strings will be cut into
* additional lines at whitespace characters if possible. The string parameter
* is modified with terminating characters mid-string which are the
* placeholders for the newlines.
@@ -284,7 +358,8 @@
* @param maxw the maximum width the string can have on one line
* @return return a 32bit wide number consisting of 2 packed values:
* 0 - 15 the number of lines ADDED to the string
- * 16 - 31 the fontsize in which the length calculation was done at */
+ * 16 - 31 the fontsize in which the length calculation was done at
+ */
uint32 FormatStringLinebreaks(char *str, int maxw)
{
FontSize size = _cur_fontsize;
@@ -577,24 +652,33 @@
return DoDrawString(buffer, x, y, color);
}
-void DrawSprite(SpriteID img, SpriteID pal, int x, int y)
+void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub)
{
if (HASBIT(img, PALETTE_MODIFIER_TRANSPARENT)) {
_color_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH)) + 1;
- GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_TRANSPARENT);
+ GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_TRANSPARENT, sub);
} else if (pal != PAL_NONE) {
_color_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH)) + 1;
- GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_COLOUR_REMAP);
+ GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_COLOUR_REMAP, sub);
} else {
- GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_NORMAL);
+ GfxMainBlitter(GetSprite(GB(img, 0, SPRITE_WIDTH)), x, y, BM_NORMAL, sub);
}
}
-static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode)
+static inline void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub)
{
const DrawPixelInfo *dpi = _cur_dpi;
Blitter::BlitterParams bp;
+ /* Amount of pixels to clip from the source sprite */
+ int clip_left = (sub != NULL ? max(0, -sprite->x_offs + sub->left ) : 0);
+ int clip_top = (sub != NULL ? max(0, -sprite->y_offs + sub->top ) : 0);
+ int clip_right = (sub != NULL ? max(0, sprite->width - (-sprite->x_offs + sub->right + 1)) : 0);
+ int clip_bottom = (sub != NULL ? max(0, sprite->height - (-sprite->y_offs + sub->bottom + 1)) : 0);
+
+ if (clip_left + clip_right >= sprite->width) return;
+ if (clip_top + clip_bottom >= sprite->height) return;
+
/* Move to the correct offset */
x += sprite->x_offs;
y += sprite->y_offs;
@@ -603,12 +687,16 @@
bp.sprite = sprite->data;
bp.sprite_width = sprite->width;
bp.sprite_height = sprite->height;
- bp.width = UnScaleByZoom(sprite->width, dpi->zoom);
- bp.height = UnScaleByZoom(sprite->height, dpi->zoom);
+ bp.width = UnScaleByZoom(sprite->width - clip_left - clip_right, dpi->zoom);
+ bp.height = UnScaleByZoom(sprite->height - clip_top - clip_bottom, dpi->zoom);
bp.top = 0;
bp.left = 0;
- bp.skip_left = 0;
- bp.skip_top = 0;
+ bp.skip_left = UnScaleByZoom(clip_left, dpi->zoom);
+ bp.skip_top = UnScaleByZoom(clip_top, dpi->zoom);
+
+ x += ScaleByZoom(bp.skip_left, dpi->zoom);
+ y += ScaleByZoom(bp.skip_top, dpi->zoom);
+
bp.dst = dpi->dst_ptr;
bp.pitch = dpi->pitch;
bp.remap = _color_remap_ptr;
@@ -919,6 +1007,11 @@
_video_driver->MakeDirty(left, top, right - left, bottom - top);
}
+/*!
+ * Repaints the rectangle blocks which are marked as 'dirty'.
+ *
+ * @see SetDirtyBlocks
+ */
void DrawDirtyBlocks()
{
byte *b = _dirty_blocks;
@@ -1003,7 +1096,21 @@
}
}
-
+/*!
+ * This function extends the internal _invalid_rect rectangle as it
+ * now contains the rectangle defined by the given parameters. Note
+ * the point (0,0) is top left.
+ *
+ * @param left The left edge of the rectangle
+ * @param top The top edge of the rectangle
+ * @param right The right edge of the rectangle
+ * @param bottom The bottm edge of the rectangle
+ * @see DrawDirtyBlocks
+ *
+ * @todo The name of the function should be called like @c AddDirtyBlock as
+ * it neither set a dirty rect nor add several dirty rects although
+ * the function name is in plural. (Progman)
+ */
void SetDirtyBlocks(int left, int top, int right, int bottom)
{
byte *b;
@@ -1041,6 +1148,11 @@
} while (--height != 0);
}
+/*!
+ * This function mark the whole screen as dirty. This results in repainting
+ * the whole screen. Use this with care as this function will break the
+ * idea about marking only parts of the screen as 'dirty'.
+ */
void MarkWholeScreenDirty()
{
SetDirtyBlocks(0, 0, _screen.width, _screen.height);
--- a/src/gfx.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfx.h Sat Oct 06 21:16:00 2007 +0000
@@ -2,6 +2,36 @@
/** @file gfx.h */
+/**
+ * @defgroup dirty Dirty
+ *
+ * Handles the repaint of some part of the screen.
+ *
+ * Some places in the code are called functions which makes something "dirty".
+ * This has nothing to do with making a Tile or Window darker or less visible.
+ * This term comes from memory caching and is used to define an object must
+ * be repaint. If some data of an object (like a Tile, Window, Vehicle, whatever)
+ * are changed which are so extensive the object must be repaint its marked
+ * as "dirty". The video driver repaint this object instead of the whole screen
+ * (this is btw. also possible if needed). This is used to avoid a
+ * flickering of the screen by the video driver constantly repainting it.
+ *
+ * This whole mechanism is controlled by an rectangle defined in #_invalid_rect. This
+ * rectangle defines the area on the screen which must be repaint. If a new object
+ * needs to be repainted this rectangle is extended to 'catch' the object on the
+ * screen. At some point (which is normaly uninteressted for patch writers) this
+ * rectangle is send to the video drivers method
+ * VideoDriver::MakeDirty and it is truncated back to an empty rectangle. At some
+ * later point (which is uninteressted, too) the video driver
+ * repaints all these saved rectangle instead of the whole screen and drop the
+ * rectangle informations. Then a new round begins by marking objects "dirty".
+ *
+ * @see VideoDriver::MakeDirty
+ * @see _invalid_rect
+ * @see _screen
+ */
+
+
#ifndef GFX_H
#define GFX_H
@@ -36,24 +66,6 @@
WKC_RETURN = 13,
WKC_TAB = 14,
- /* Numerical keyboard */
- WKC_NUM_0 = 16,
- WKC_NUM_1 = 17,
- WKC_NUM_2 = 18,
- WKC_NUM_3 = 19,
- WKC_NUM_4 = 20,
- WKC_NUM_5 = 21,
- WKC_NUM_6 = 22,
- WKC_NUM_7 = 23,
- WKC_NUM_8 = 24,
- WKC_NUM_9 = 25,
- WKC_NUM_DIV = 26,
- WKC_NUM_MUL = 27,
- WKC_NUM_MINUS = 28,
- WKC_NUM_PLUS = 29,
- WKC_NUM_ENTER = 30,
- WKC_NUM_DECIMAL = 31,
-
/* Space */
WKC_SPACE = 32,
@@ -81,20 +93,35 @@
* A-Z are mapped to 65-90
* a-z are mapped to 97-122 */
- /* Other keys, corresponding to their ascii values */
- WKC_SLASH = 47, ///< / Forward slash
- WKC_SEMICOLON = 59, ///< ; Semicolon
- WKC_EQUALS = 61, ///< = Equals
- WKC_L_BRACKET = 91, ///< [ Left square bracket
- WKC_BACKSLASH = 92, ///< \ Backslash
- WKC_R_BRACKET = 93, ///< ] Right square bracket
+ /* Numerical keyboard */
+ WKC_NUM_0 = 128,
+ WKC_NUM_1 = 129,
+ WKC_NUM_2 = 130,
+ WKC_NUM_3 = 131,
+ WKC_NUM_4 = 132,
+ WKC_NUM_5 = 133,
+ WKC_NUM_6 = 134,
+ WKC_NUM_7 = 135,
+ WKC_NUM_8 = 136,
+ WKC_NUM_9 = 137,
+ WKC_NUM_DIV = 138,
+ WKC_NUM_MUL = 139,
+ WKC_NUM_MINUS = 140,
+ WKC_NUM_PLUS = 141,
+ WKC_NUM_ENTER = 142,
+ WKC_NUM_DECIMAL = 143,
- /* Other keys of which their ascii value is already taken
- * - use unused ascii value not present on keyboard directly */
- WKC_SINGLEQUOTE = 58, ///< ' Single quote
- WKC_COMMA = 60, ///< , Comma
- WKC_PERIOD = 62, ///< . Period
- WKC_MINUS = 95, ///< - Minus
+ /* Other keys */
+ WKC_SLASH = 144, ///< / Forward slash
+ WKC_SEMICOLON = 145, ///< ; Semicolon
+ WKC_EQUALS = 146, ///< = Equals
+ WKC_L_BRACKET = 147, ///< [ Left square bracket
+ WKC_BACKSLASH = 148, ///< \ Backslash
+ WKC_R_BRACKET = 149, ///< ] Right square bracket
+ WKC_SINGLEQUOTE = 150, ///< ' Single quote
+ WKC_COMMA = 151, ///< , Comma
+ WKC_PERIOD = 152, ///< . Period
+ WKC_MINUS = 153, ///< - Minus
};
enum GameModes {
@@ -215,6 +242,16 @@
void RedrawScreenRect(int left, int top, int right, int bottom);
void GfxScroll(int left, int top, int width, int height, int xo, int yo);
+/**
+ * Used to only draw a part of the sprite.
+ * Draw the subsprite in the rect (sprite_x_offset + left, sprite_y_offset + top) to (sprite_x_offset + right, sprite_y_offset + bottom).
+ * Both corners are included in the drawing area.
+ */
+struct SubSprite {
+ int left, top, right, bottom;
+};
+
+void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub = NULL);
/* XXX doesn't really belong here, but the only
* consumers always use it in conjunction with DoDrawString() */
@@ -241,14 +278,33 @@
void GfxFillRect(int left, int top, int right, int bottom, int color);
void GfxDrawLine(int left, int top, int right, int bottom, int color);
+void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
BoundingRect GetStringBoundingBox(const char *str);
uint32 FormatStringLinebreaks(char *str, int maxw);
void LoadStringWidthTable();
void DrawStringMultiCenter(int x, int y, StringID str, int maxw);
uint DrawStringMultiLine(int x, int y, StringID str, int maxw, int maxh = -1);
+
+/**
+ * Let the dirty blocks repainting by the video driver.
+ *
+ * @ingroup dirty
+ */
void DrawDirtyBlocks();
+
+/**
+ * Set a new dirty block.
+ *
+ * @ingroup dirty
+ */
void SetDirtyBlocks(int left, int top, int right, int bottom);
+
+/**
+ * Marks the whole screen as dirty.
+ *
+ * @ingroup dirty
+ */
void MarkWholeScreenDirty();
void GfxInitPalettes();
--- a/src/gfxinit.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/gfxinit.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -114,7 +114,8 @@
* returns true if the checksum is correct */
static bool FileMD5(const MD5File file, bool warn)
{
- FILE *f = FioFOpenFile(file.filename);
+ size_t size;
+ FILE *f = FioFOpenFile(file.filename, "rb", DATA_DIR, &size);
if (f != NULL) {
md5_state_t filemd5state;
@@ -123,11 +124,13 @@
size_t len;
md5_init(&filemd5state);
- while ((len = fread(buffer, 1, sizeof(buffer), f)) != 0)
+ while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, f)) != 0 && size != 0) {
+ size -= len;
md5_append(&filemd5state, buffer, len);
+ }
if (ferror(f) && warn) ShowInfoF("Error Reading from %s \n", file.filename);
- fclose(f);
+ FioFCloseFile(f);
md5_finish(&filemd5state, digest);
return CheckMD5Digest(file, digest, warn);
@@ -381,6 +384,8 @@
assert(load_index == SPR_ONEWAY_BASE);
load_index += LoadGrfFile("oneway.grf", load_index, i++);
+ load_index++; // SPR_EMPTY_BOUNDING_BOX
+
assert(load_index == SPR_FLAGS_BASE);
load_index += LoadGrfFile("flags.grf", load_index, i++);
--- a/src/graph_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/graph_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1006,13 +1006,7 @@
DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, 0);
/* Calculate the %-bar */
- if (val > needed) {
- x = 50;
- } else if (val == 0) {
- x = 0;
- } else {
- x = val * 50 / needed;
- }
+ x = clamp(val, 0, needed) * 50 / needed;
/* SCORE_LOAN is inversed */
if (val < 0 && i == SCORE_LOAN) x = 0;
@@ -1022,7 +1016,7 @@
if (x != 50) GfxFillRect(112 + x, y - 2, 112 + 50, y + 10, color_notdone);
/* Calculate the % */
- x = (val <= needed) ? val * 100 / needed : 100;
+ x = clamp(val, 0, needed) * 100 / needed;
/* SCORE_LOAN is inversed */
if (val < 0 && i == SCORE_LOAN) x = 0;
--- a/src/group_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/group_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -354,7 +354,7 @@
*/
void RemoveVehicleFromGroup(const Vehicle *v)
{
- if (!v->IsValid() || !(v->HasFront() && v->IsPrimaryVehicle())) return;
+ if (!v->IsValid() || !v->IsPrimaryVehicle()) return;
if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id);
}
--- a/src/group_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/group_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -329,7 +329,7 @@
SetVScroll2Count(w, gv->l.list_length);
/* Disable all lists management button when the list is empty */
- SetWindowWidgetsDisabledState(w, gv->l.list_length == 0,
+ SetWindowWidgetsDisabledState(w, gv->l.list_length == 0 || _local_player != owner,
GRP_WIDGET_STOP_ALL,
GRP_WIDGET_START_ALL,
GRP_WIDGET_MANAGE_VEHICLES,
@@ -337,12 +337,24 @@
WIDGET_LIST_END);
/* Disable the group specific function when we select the default group or all vehicles */
- SetWindowWidgetsDisabledState(w, IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel),
+ SetWindowWidgetsDisabledState(w, IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel) || _local_player != owner,
GRP_WIDGET_DELETE_GROUP,
GRP_WIDGET_RENAME_GROUP,
GRP_WIDGET_REPLACE_PROTECTION,
WIDGET_LIST_END);
+ /* Disable remaining buttons for non-local player
+ * Needed while changing _local_player, eg. by cheats
+ * All procedures (eg. move vehicle to another group)
+ * verify, whether you are the owner of the vehicle,
+ * so it doesn't have to be disabled
+ */
+ SetWindowWidgetsDisabledState(w, _local_player != owner,
+ GRP_WIDGET_CREATE_GROUP,
+ GRP_WIDGET_AVAILABLE_VEHICLES,
+ WIDGET_LIST_END);
+
+
/* If selected_group == DEFAULT_GROUP || ALL_GROUP, draw the standard caption
We list all vehicles or ungrouped vehicles */
if (IsDefaultGroupID(gv->group_sel) || IsAllGroupID(gv->group_sel)) {
--- a/src/industry.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry.h Sat Oct 06 21:16:00 2007 +0000
@@ -7,18 +7,19 @@
#include "oldpool.h"
#include "helpers.hpp"
+#include "newgrf_storage.h"
-typedef byte IndustryGfx;
+typedef uint16 IndustryGfx;
typedef uint8 IndustryType;
enum {
INVALID_INDUSTRY = 0xFFFF,
NEW_INDUSTRYOFFSET = 37, ///< original number of industries
- NUM_INDUSTRYTYPES = 37, ///< total number of industries, new and old
+ NUM_INDUSTRYTYPES = 64, ///< total number of industries, new and old
INDUSTRYTILE_NOANIM = 0xFF, ///< flag to mark industry tiles as having no animation
NEW_INDUSTRYTILEOFFSET = 175, ///< original number of tiles
INVALID_INDUSTRYTYPE = NUM_INDUSTRYTYPES, ///< one above amount is considered invalid
- NUM_INDUSTRYTILES = NEW_INDUSTRYTILEOFFSET, ///< total number of industry tiles, new and old
+ NUM_INDUSTRYTILES = 512, ///< total number of industry tiles, new and old
INVALID_INDUSTRYTILE = NUM_INDUSTRYTILES, ///< one above amount is considered invalid
INDUSTRY_COMPLETED = 3, ///< final stage of industry construction.
};
@@ -81,6 +82,11 @@
INDUSTRYBEH_AIRPLANE_ATTACKS = 1 << 11, ///< can be exploded by a military airplane (oil refinery)
INDUSTRYBEH_CHOPPER_ATTACKS = 1 << 12, ///< can be exploded by a military helicopter (factory)
INDUSTRYBEH_CAN_SUBSIDENCE = 1 << 13, ///< can cause a subsidence (coal mine, shaft that collapses)
+ /* The following flags are only used for newindustries and do no represent any normal behaviour */
+ INDUSTRYBEH_PROD_MULTI_HNDLING = 1 << 14, ///< Automatic production multiplier handling
+ INDUSTRYBEH_PRODCALLBACK_RANDOM = 1 << 15, ///< Production callback needs random bits in var 10
+ INDUSTRYBEH_NOBUILT_MAPCREATION = 1 << 16, ///< Do not force one instance of this type to appear on map generation
+ INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type
};
@@ -93,14 +99,18 @@
* Defines the internal data of a functionnal industry
*/
struct Industry : PoolItem<Industry, IndustryID, &_Industry_pool> {
+ typedef PersistentStorageArray<uint32, 16> PersistentStorage;
+
TileIndex xy; ///< coordinates of the primary tile the industry is built one
byte width;
byte height;
const Town *town; ///< Nearest town
+ CargoID produced_cargo[2]; ///< 2 production cargo slots
uint16 produced_cargo_waiting[2]; ///< amount of cargo produced per cargo
uint16 incoming_cargo_waiting[3]; ///< incoming cargo waiting to be processed
byte production_rate[2]; ///< production rate for each cargo
byte prod_level; ///< general production level
+ CargoID accepts_cargo[3]; ///< 3 input cargo slots
uint16 this_month_production[2]; ///< stats of this month's production per cargo
uint16 this_month_transported[2]; ///< stats of this month's transport per cargo
byte last_month_pct_transported[2]; ///< percentage transported per cargo in the last full month
@@ -120,6 +130,8 @@
Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry
byte selected_layout; ///< Which tile layout was used when creating the industry
+ PersistentStorage psa; ///< Persistent storage for NewGRF industries.
+
Industry(TileIndex tile = 0) : xy(tile) {}
~Industry();
--- a/src/industry_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -31,11 +31,13 @@
#include "water_map.h"
#include "tree_map.h"
#include "cargotype.h"
+#include "newgrf.h"
#include "newgrf_commons.h"
#include "newgrf_industries.h"
#include "newgrf_industrytiles.h"
#include "newgrf_callbacks.h"
#include "misc/autoptr.hpp"
+#include "autoslope.h"
void ShowIndustryViewWindow(int industry);
void BuildOilRig(TileIndex tile);
@@ -63,11 +65,16 @@
/* once performed, enable only the current climate industries */
for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
- _industry_specs[i].enabled = HASBIT(_origin_industry_specs[i].climate_availability, _opt.landscape);
+ _industry_specs[i].enabled = i < NEW_INDUSTRYOFFSET &&
+ HASBIT(_origin_industry_specs[i].climate_availability, _opt.landscape);
}
memset(&_industry_tile_specs, 0, sizeof(_industry_tile_specs));
memcpy(&_industry_tile_specs, &_origin_industry_tile_specs, sizeof(_origin_industry_tile_specs));
+
+ /* Reset any overrides that have been set. */
+ _industile_mngr.ResetOverride();
+ _industry_mngr.ResetOverride();
}
void ResetIndustryCreationProbility(IndustryType type)
@@ -299,8 +306,8 @@
(HASBIT(image, PALETTE_MODIFIER_COLOR) && dits->building.pal == PAL_NONE) ? GENERAL_SPRITE_COLOR(ind->random_color) : dits->building.pal,
ti->x + dits->subtile_x,
ti->y + dits->subtile_y,
- dits->width + 1,
- dits->height + 1,
+ dits->width,
+ dits->height,
dits->dz,
ti->z,
HASBIT(_transparent_opt, TO_INDUSTRIES));
@@ -355,7 +362,8 @@
for (byte i = 0; i < lengthof(itspec->accepts_cargo); i++) {
CargoID a = accepts_cargo[i];
- if (a != CT_INVALID) ac[a] = acceptance[i];
+ /* Only set the value once. */
+ if (a != CT_INVALID && ac[a] == 0) ac[a] = acceptance[i];
}
}
@@ -383,6 +391,7 @@
*/
if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR &&
!_cheats.magic_bulldozer.value) ||
+ ((flags & DC_AUTO) != 0) ||
(_current_player == OWNER_WATER && (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER))) {
SetDParam(0, indspec->name);
return_cmd_error(STR_4800_IN_THE_WAY);
@@ -407,7 +416,7 @@
i->this_month_production[0] += cw;
- am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[0], cw);
+ am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[0], cw);
i->this_month_transported[0] += am;
if (am != 0 && !StartStopIndustryTileAnimation(i, IAT_INDUSTRY_DISTRIBUTES_CARGO)) {
uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production;
@@ -429,7 +438,7 @@
i->this_month_production[1] += cw;
- am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[1], cw);
+ am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[1], cw);
i->this_month_transported[1] += am;
}
}
@@ -817,7 +826,7 @@
static void GetProducedCargo_Industry(TileIndex tile, CargoID *b)
{
- const IndustrySpec *i = GetIndustrySpec(GetIndustryByTile(tile)->type);
+ const Industry *i = GetIndustryByTile(tile);
b[0] = i->produced_cargo[0];
b[1] = i->produced_cargo[1];
@@ -1174,9 +1183,27 @@
return t;
}
-static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, int type, bool *custom_shape_check = NULL)
+bool IsSlopeRefused(Slope current, Slope refused)
+{
+ if (current != SLOPE_FLAT) {
+ if (refused & SLOPE_STEEP) return true;
+
+ Slope t = ComplementSlope(current);
+
+ if (refused & 1 && (t & SLOPE_NW)) return false;
+ if (refused & 2 && (t & SLOPE_NE)) return false;
+ if (refused & 4 && (t & SLOPE_SW)) return false;
+ if (refused & 8 && (t & SLOPE_SE)) return false;
+ }
+
+ return false;
+}
+
+static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable *it, uint itspec_index, int type, bool *custom_shape_check = NULL)
{
_error_message = STR_0239_SITE_UNSUITABLE;
+ bool refused_slope = false;
+ bool custom_shape = false;
do {
IndustryGfx gfx = GetTranslatedIndustryTileID(it->gfx);
@@ -1196,12 +1223,13 @@
if (!EnsureNoVehicle(cur_tile)) return false;
if (MayHaveBridgeAbove(cur_tile) && IsBridgeAbove(cur_tile)) return false;
- const IndustryTileSpec *its = GetIndustryTileSpec(it->gfx);
+ const IndustryTileSpec *its = GetIndustryTileSpec(gfx);
+
IndustyBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
if (HASBIT(its->callback_flags, CBM_INDT_SHAPE_CHECK)) {
- if (custom_shape_check != NULL) *custom_shape_check = true;
- if (!PerformIndustryTileSlopeCheck(cur_tile, its, type, gfx)) return false;
+ custom_shape = true;
+ if (!PerformIndustryTileSlopeCheck(tile, cur_tile, its, type, gfx, itspec_index)) return false;
} else {
if (ind_behav & INDUSTRYBEH_BUILT_ONWATER) {
/* As soon as the tile is not water, bail out.
@@ -1216,24 +1244,7 @@
tileh = GetTileSlope(cur_tile, NULL);
if (IsSteepSlope(tileh)) return false;
- if (_patches.land_generator != LG_TERRAGENESIS || !_generating_world) {
- /* It is almost impossible to have a fully flat land in TG, so what we
- * do is that we check if we can make the land flat later on. See
- * CheckIfCanLevelIndustryPlatform(). */
- if (tileh != SLOPE_FLAT) {
- Slope t;
- byte bits = its->slopes_refused;
-
- if (bits & 0x10) return false;
-
- t = ComplementSlope(tileh);
-
- if (bits & 1 && (t & SLOPE_NW)) return false;
- if (bits & 2 && (t & SLOPE_NE)) return false;
- if (bits & 4 && (t & SLOPE_SW)) return false;
- if (bits & 8 && (t & SLOPE_SE)) return false;
- }
- }
+ refused_slope |= IsSlopeRefused(tileh, its->slopes_refused);
}
}
@@ -1249,7 +1260,12 @@
}
} while ((++it)->ti.x != -0x80);
- return true;
+ if (custom_shape_check != NULL) *custom_shape_check = custom_shape;
+
+ /* It is almost impossible to have a fully flat land in TG, so what we
+ * do is that we check if we can make the land flat later on. See
+ * CheckIfCanLevelIndustryPlatform(). */
+ return !refused_slope || (_patches.land_generator == LG_TERRAGENESIS && _generating_world && !custom_shape);
}
static bool CheckIfIndustryIsAllowed(TileIndex tile, int type, const Town *t)
@@ -1315,6 +1331,7 @@
/* Finds dimensions of largest variant of this industry */
do {
+ if (it->gfx == 0xFF) continue; // FF been a marquer for a check on clear water, skip it
if (it->ti.x > max_x) max_x = it->ti.x;
if (it->ti.y > max_y) max_y = it->ti.y;
} while ((++it)->ti.x != MKEND);
@@ -1331,15 +1348,26 @@
/* Check if we don't leave the map */
if (TileX(cur_tile) == 0 || TileY(cur_tile) == 0 || TileX(cur_tile) + size_x >= MapMaxX() || TileY(cur_tile) + size_y >= MapMaxY()) return false;
+ /* _current_player is OWNER_NONE for randomly generated industries and in editor, or the player who funded or prospected the industry.
+ * Perform terraforming as OWNER_TOWN to disable autoslope. */
+ PlayerID old_player = _current_player;
+ _current_player = OWNER_TOWN;
+
BEGIN_TILE_LOOP(tile_walk, size_x, size_y, cur_tile) {
curh = TileHeight(tile_walk);
if (curh != h) {
/* This tile needs terraforming. Check if we can do that without
* damaging the surroundings too much. */
- if (!CheckCanTerraformSurroundingTiles(tile_walk, h, 0)) return false;
+ if (!CheckCanTerraformSurroundingTiles(tile_walk, h, 0)) {
+ _current_player = old_player;
+ return false;
+ }
/* This is not 100% correct check, but the best we can do without modifying the map.
* What is missing, is if the difference in height is more than 1.. */
- if (CmdFailed(DoCommand(tile_walk, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND))) return false;
+ if (CmdFailed(DoCommand(tile_walk, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND))) {
+ _current_player = old_player;
+ return false;
+ }
}
} END_TILE_LOOP(tile_walk, size_x, size_y, cur_tile)
@@ -1357,6 +1385,7 @@
} END_TILE_LOOP(tile_walk, size_x, size_y, cur_tile)
}
+ _current_player = old_player;
return true;
}
@@ -1374,7 +1403,7 @@
/* check if an industry that accepts the same goods is nearby */
if (DistanceMax(tile, i->xy) <= 14 &&
indspec->accepts_cargo[0] != CT_INVALID &&
- indspec->accepts_cargo[0] == GetIndustrySpec(i->type)->accepts_cargo[0] && (
+ indspec->accepts_cargo[0] == i->accepts_cargo[0] && (
_game_mode != GM_EDITOR ||
!_patches.same_industry_close ||
!_patches.multiple_industry_per_town
@@ -1397,17 +1426,23 @@
{
const IndustrySpec *indspec = GetIndustrySpec(type);
uint32 r;
- int j;
+ uint j;
i->xy = tile;
i->width = i->height = 0;
i->type = type;
IncIndustryTypeCount(type);
+ i->produced_cargo[0] = indspec->produced_cargo[0];
+ i->produced_cargo[1] = indspec->produced_cargo[1];
+ i->accepts_cargo[0] = indspec->accepts_cargo[0];
+ i->accepts_cargo[1] = indspec->accepts_cargo[1];
+ i->accepts_cargo[2] = indspec->accepts_cargo[2];
i->production_rate[0] = indspec->production_rate[0];
i->production_rate[1] = indspec->production_rate[1];
- if (_patches.smooth_economy) {
+ /* don't use smooth economy for industries using production callbacks */
+ if (_patches.smooth_economy && !(HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_256_TICKS) || HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL))) {
i->production_rate[0] = min((RandomRange(256) + 128) * i->production_rate[0] >> 8 , 255);
i->production_rate[1] = min((RandomRange(256) + 128) * i->production_rate[1] >> 8 , 255);
}
@@ -1436,6 +1471,30 @@
i->last_month_production[0] = i->production_rate[0] * 8;
i->last_month_production[1] = i->production_rate[1] * 8;
i->founder = _current_player;
+
+ if (HASBIT(indspec->callback_flags, CBM_IND_DECIDE_COLOUR)) {
+ uint16 res = GetIndustryCallback(CBID_INDUSTRY_DECIDE_COLOUR, 0, 0, i, type, INVALID_TILE);
+ if (res != CALLBACK_FAILED) i->random_color = GB(res, 0, 4);
+ }
+
+ if (HASBIT(indspec->callback_flags, CBM_IND_INPUT_CARGO_TYPES)) {
+ for (j = 0; j < lengthof(i->accepts_cargo); j++) i->accepts_cargo[j] = CT_INVALID;
+ for (j = 0; j < lengthof(i->accepts_cargo); j++) {
+ uint16 res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
+ if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+ i->accepts_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ }
+ }
+
+ if (HASBIT(indspec->callback_flags, CBM_IND_OUTPUT_CARGO_TYPES)) {
+ for (j = 0; j < lengthof(i->produced_cargo); j++) i->produced_cargo[j] = CT_INVALID;
+ for (j = 0; j < lengthof(i->produced_cargo); j++) {
+ uint16 res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE);
+ if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break;
+ i->produced_cargo[j] = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
+ }
+ }
+
i->construction_date = _date;
i->construction_type = (_game_mode == GM_EDITOR) ? ICT_SCENARIO_EDITOR :
(_generating_world ? ICT_MAP_GENERATION : ICT_NORMAL_GAMEPLAY);
@@ -1493,7 +1552,7 @@
const IndustryTileTable *it = indspec->table[itspec_index];
bool custom_shape_check = false;
- if (!CheckIfIndustryTilesAreFree(tile, it, type, &custom_shape_check)) return NULL;
+ if (!CheckIfIndustryTilesAreFree(tile, it, itspec_index, type, &custom_shape_check)) return NULL;
if (HASBIT(GetIndustrySpec(type)->callback_flags, CBM_IND_LOCATION)) {
if (!CheckIfCallBackAllowsCreation(tile, type, itspec_index)) return NULL;
@@ -1534,7 +1593,6 @@
{
int num;
const IndustryTileTable * const *itt;
- const IndustryTileTable *it;
const IndustrySpec *indspec;
SET_EXPENSES_TYPE(EXPENSES_OTHER);
@@ -1578,7 +1636,7 @@
do {
if (--num < 0) return_cmd_error(STR_0239_SITE_UNSUITABLE);
- } while (!CheckIfIndustryTilesAreFree(tile, it = itt[num], p1));
+ } while (!CheckIfIndustryTilesAreFree(tile, itt[num], num, p1));
if (CreateNewIndustryHelper(tile, p1, flags, indspec, num) == NULL) return CMD_ERROR;
}
@@ -1692,84 +1750,13 @@
}
}
-/** Change industry production or do closure
- * @param i Industry for which changes are performed
- */
-static void ExtChangeIndustryProduction(Industry *i)
-{
- bool closeit = true;
- int j;
- const IndustrySpec *indspec = GetIndustrySpec(i->type);
-
- if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
-
- if ((indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
- for (j = 0; j < 2 && indspec->produced_cargo[j] != CT_INVALID; j++){
- uint32 r = Random();
- int old_prod, new_prod, percent;
- int mag;
-
- new_prod = old_prod = i->production_rate[j];
-
- if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
- /* Chance of increasing becomes better when more is transported */
- if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) &&
- ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0 || _opt.landscape != LT_TEMPERATE)) {
- new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
- }
-
- new_prod = clamp(new_prod, 1, 255);
- /* Do not stop closing the industry when it has the lowest possible production rate */
- if (new_prod == old_prod && old_prod > 1) {
- closeit = false;
- continue;
- }
-
- percent = (old_prod == 0) ? 100 : (new_prod * 100 / old_prod - 100);
- i->production_rate[j] = new_prod;
-
- /* Close the industry when it has the lowest possible production rate */
- if (new_prod > 1) closeit = false;
-
- mag = abs(percent);
- if (mag >= 10) {
- SetDParam(2, mag);
- SetDParam(0, GetCargo(indspec->produced_cargo[j])->name);
- SetDParam(1, i->index);
- AddNewsItem(
- percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ECONOMY, 0),
- i->xy + TileDiffXY(1, 1), 0
- );
- }
- }
- }
-
- if ((indspec->life_type & INDUSTRYLIFE_PROCESSING) != 0) {
- if ((byte)(_cur_year - i->last_prod_year) < 5 || !CHANCE16(1, 180)) closeit = false;
- }
-
- /* If industry will be closed down, show this */
- if (closeit) {
- i->prod_level = 0;
- SetDParam(0, i->index);
- AddNewsItem(
- indspec->closure_text,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0),
- i->xy + TileDiffXY(1, 1), 0
- );
- }
-}
-
-
static void UpdateIndustryStatistics(Industry *i)
{
byte pct;
bool refresh = false;
- const IndustrySpec *indsp = GetIndustrySpec(i->type);
- for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
- if (indsp->produced_cargo[j] != CT_INVALID) {
+ for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+ if (i->produced_cargo[j] != CT_INVALID) {
pct = 0;
if (i->this_month_production[j] != 0) {
i->last_prod_year = _cur_year;
@@ -1786,14 +1773,7 @@
}
}
- if (refresh)
- InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
-
- if (i->prod_level == 0) {
- delete i;
- } else if (_patches.smooth_economy) {
- ExtChangeIndustryProduction(i);
- }
+ if (refresh) InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
}
/** Simple helper that will collect data for the generation of industries */
@@ -1854,68 +1834,160 @@
NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
}
-static void ChangeIndustryProduction(Industry *i)
+/**
+ * Protects an industry from closure if the appropriate flags and conditions are met
+ * INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the
+ * count of industries of this type must one (or lower) in order to be protected
+ * against closure.
+ * @param type IndustryType been queried
+ * @result true if protection is on, false otherwise (except for oil wells)
+ */
+static bool CheckIndustryCloseDownProtection(IndustryType type)
{
- StringID str = STR_NULL;
- int type = i->type;
const IndustrySpec *indspec = GetIndustrySpec(type);
- if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
-
- if ((indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
- bool only_decrease = false;
-
- /* decrease or increase */
- if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE)
- only_decrease = true;
-
- if (only_decrease || CHANCE16(1, 3)) {
- /* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
- if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) {
- /* Increase production */
- if (i->prod_level != 0x80) {
- byte b;
-
- i->prod_level <<= 1;
+ /* oil wells (or the industries with that flag set) are always allowed to closedown */
+ if (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD && _opt.landscape == LT_TEMPERATE) return false;
+ return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE && GetIndustryTypeCount(type) <= 1);
+}
- b = i->production_rate[0] * 2;
- if (i->production_rate[0] >= 128)
- b = 0xFF;
- i->production_rate[0] = b;
-
- b = i->production_rate[1] * 2;
- if (i->production_rate[1] >= 128)
- b = 0xFF;
- i->production_rate[1] = b;
+/** Change industry production or do closure
+ * @param i Industry for which changes are performed
+ * @param monthly true if it's the monthly call, false if it's the random call
+ */
+static void ChangeIndustryProduction(Industry *i, bool monthly)
+{
+ extern StringID MapGRFStringID(uint32 grfid, StringID str);
+ StringID str = STR_NULL;
+ bool closeit = false;
+ const IndustrySpec *indspec = GetIndustrySpec(i->type);
+ bool standard = true;
+ bool suppress_message = false;
+ /* don't use smooth economy for industries using production callbacks */
+ bool smooth_economy = _patches.smooth_economy && !(HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_256_TICKS) || HASBIT(indspec->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL));
+ byte div = 0;
+ byte mul = 0;
- str = indspec->production_up_text;
+ if (HASBIT(indspec->callback_flags, monthly ? CBM_IND_MONTHLYPROD_CHANGE : CBM_IND_PRODUCTION_CHANGE)) {
+ uint16 res = GetIndustryCallback(monthly ? CBID_INDUSTRY_MONTHLYPROD_CHANGE : CBID_INDUSTRY_PRODUCTION_CHANGE, 0, Random(), i, i->type, i->xy);
+ if (res != CALLBACK_FAILED) {
+ standard = false;
+ suppress_message = HASBIT(res, 7);
+ /* Get the custom message if any */
+ if (HASBIT(res, 8)) str = MapGRFStringID(indspec->grf_prop.grffile->grfid, GB(GetRegister(0x100), 0, 16));
+ res = GB(res, 0, 4);
+ switch(res) {
+ default: NOT_REACHED();
+ case 0x0: break; // Do nothing, but show the custom message if any
+ case 0x1: div = 1; break; // Halve industry production. If production reaches the quarter of the default, the industry is closed instead.
+ case 0x2: mul = 1; break; // Double industry production if it hasn't reached eight times of the original yet.
+ case 0x3: closeit = true; break; // The industry announces imminent closure, and is physically removed from the map next month.
+ case 0x4: standard = true; break; // Do the standard random production change as if this industry was a primary one.
+ case 0x5: case 0x6: case 0x7: // Divide production by 4, 8, 16
+ case 0x8: div = res - 0x5; break; // Divide production by 32
+ case 0x9: case 0xA: case 0xB: // Multiply production by 4, 8, 16
+ case 0xC: mul = res - 0x9; break; // Multiply production by 32
+ }
+ }
+ }
+
+ if (standard && monthly != smooth_economy) return;
+
+ if (standard && indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return;
+
+ if (standard && (indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
+ /* decrease or increase */
+ bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE;
+
+ if (smooth_economy) {
+ closeit = true;
+ for (byte j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){
+ uint32 r = Random();
+ int old_prod, new_prod, percent;
+ int mag;
+
+ new_prod = old_prod = i->production_rate[j];
+
+ if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
+ /* Chance of increasing becomes better when more is transported */
+ if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) && !only_decrease) {
+ new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U);
}
- } else {
- /* Decrease production */
- if (i->prod_level == 4) {
- i->prod_level = 0;
- str = indspec->closure_text;
+
+ new_prod = clamp(new_prod, 1, 255);
+ /* Do not stop closing the industry when it has the lowest possible production rate */
+ if (new_prod == old_prod && old_prod > 1) {
+ closeit = false;
+ continue;
+ }
+
+ percent = (old_prod == 0) ? 100 : (new_prod * 100 / old_prod - 100);
+ i->production_rate[j] = new_prod;
+
+ /* Close the industry when it has the lowest possible production rate */
+ if (new_prod > 1) closeit = false;
+
+ mag = abs(percent);
+ if (mag >= 10) {
+ SetDParam(2, mag);
+ SetDParam(0, GetCargo(i->produced_cargo[j])->name);
+ SetDParam(1, i->index);
+ AddNewsItem(
+ percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
+ NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ECONOMY, 0),
+ i->xy + TileDiffXY(1, 1), 0
+ );
+ }
+ }
+ } else {
+ if (only_decrease || CHANCE16(1, 3)) {
+ /* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
+ if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) {
+ mul = 1; // Increase production
} else {
- i->prod_level >>= 1;
- i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
- i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
-
- str = indspec->production_down_text;
+ div = 1; // Decrease production
}
}
}
}
- if (indspec->life_type & INDUSTRYLIFE_PROCESSING) {
- /* maybe close */
- if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) {
- i->prod_level = 0;
- str = indspec->closure_text;
+
+ if (standard && indspec->life_type & INDUSTRYLIFE_PROCESSING) {
+ if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, smooth_economy ? 180 : 2)) {
+ closeit = true;
}
}
- if (str != STR_NULL) {
+ /* Increase if needed */
+ while (mul-- != 0 && i->prod_level < 0x80) {
+ i->prod_level <<= 1;
+ i->production_rate[0] = min(i->production_rate[0] * 2, 0xFF);
+ i->production_rate[1] = min(i->production_rate[1] * 2, 0xFF);
+ if (str == STR_NULL) str = indspec->production_up_text;
+ }
+
+ /* Decrease if needed */
+ while (div-- != 0 && !closeit) {
+ if (i->prod_level == 4) {
+ closeit = true;
+ } else {
+ i->prod_level >>= 1;
+ i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
+ i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
+ if (str == STR_NULL) str = indspec->production_down_text;
+ }
+ }
+
+ /* Close if needed and allowed */
+ if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
+ i->prod_level = 0;
+ str = indspec->closure_text;
+ }
+
+ if (!suppress_message && str != STR_NULL) {
SetDParam(0, i->index);
- AddNewsItem(str, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, str == indspec->closure_text ? NT_OPENCLOSE : NT_ECONOMY, 0), i->xy + TileDiffXY(1, 1), 0);
+ AddNewsItem(str,
+ NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, closeit ? NT_OPENCLOSE : NT_ECONOMY, 0),
+ i->xy + TileDiffXY(1, 1), 0);
}
}
@@ -1927,14 +1999,19 @@
FOR_ALL_INDUSTRIES(i) {
UpdateIndustryStatistics(i);
+ if (i->prod_level == 0) {
+ delete i;
+ } else {
+ ChangeIndustryProduction(i, true);
+ }
}
/* 3% chance that we start a new industry */
if (CHANCE16(3, 100)) {
MaybeNewIndustry();
- } else if (!_patches.smooth_economy) {
+ } else {
i = GetRandomIndustry();
- if (i != NULL) ChangeIndustryProduction(i);
+ if (i != NULL) ChangeIndustryProduction(i, false);
}
_current_player = old_player;
@@ -1973,7 +2050,31 @@
static CommandCost TerraformTile_Industry(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
- return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); // funny magic bulldozer
+ if (AutoslopeEnabled()) {
+ /* We imitate here TTDP's behaviour:
+ * - Both new and old slope must not be steep.
+ * - TileMaxZ must not be changed.
+ * - Allow autoslope by default.
+ * - Disallow autoslope if callback succeeds and returns non-zero.
+ */
+ Slope tileh_old = GetTileSlope(tile, NULL);
+ /* TileMaxZ must not be changed. Slopes must not be steep. */
+ if (!IsSteepSlope(tileh_old) && !IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
+ const IndustryGfx gfx = GetIndustryGfx(tile);
+ const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
+
+ /* Call callback 3C 'disable autosloping for industry tiles'. */
+ if (HASBIT(itspec->callback_flags, CBM_INDT_AUTOSLOPE)) {
+ /* If the callback fails, allow autoslope. */
+ uint16 res = GetIndustryTileCallback(CBID_INDUSTRY_AUTOSLOPE, 0, 0, gfx, GetIndustryByTile(tile), tile);
+ if ((res == 0) || (res == CALLBACK_FAILED)) return _price.terraform;
+ } else {
+ // allow autoslope
+ return _price.terraform;
+ }
+ }
+ }
+ return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
extern const TileTypeProcs _tile_type_industry_procs = {
@@ -2000,10 +2101,12 @@
SLE_VAR(Industry, height, SLE_UINT8),
SLE_REF(Industry, town, REF_TOWN),
SLE_CONDNULL( 2, 2, 60), ///< used to be industry's produced_cargo
+ SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 2, 78, SL_MAX_VERSION),
SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 3, 70, SL_MAX_VERSION),
SLE_ARR(Industry, produced_cargo_waiting, SLE_UINT16, 2),
SLE_ARR(Industry, production_rate, SLE_UINT8, 2),
SLE_CONDNULL( 3, 2, 60), ///< used to be industry's accepts_cargo
+ SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 3, 78, SL_MAX_VERSION),
SLE_VAR(Industry, prod_level, SLE_UINT8),
SLE_ARR(Industry, this_month_production, SLE_UINT16, 2),
SLE_ARR(Industry, this_month_transported, SLE_UINT16, 2),
@@ -2020,12 +2123,14 @@
SLE_CONDVAR(Industry, last_prod_year, SLE_INT32, 31, SL_MAX_VERSION),
SLE_VAR(Industry, was_cargo_delivered, SLE_UINT8),
- SLE_CONDVAR(Industry, owner, SLE_UINT8, 70, SL_MAX_VERSION),
+ SLE_CONDVAR(Industry, founder, SLE_UINT8, 70, SL_MAX_VERSION),
SLE_CONDVAR(Industry, construction_date, SLE_INT32, 70, SL_MAX_VERSION),
SLE_CONDVAR(Industry, construction_type, SLE_UINT8, 70, SL_MAX_VERSION),
SLE_CONDVAR(Industry, last_cargo_accepted_at, SLE_INT32, 70, SL_MAX_VERSION),
SLE_CONDVAR(Industry, selected_layout, SLE_UINT8, 73, SL_MAX_VERSION),
+ SLE_CONDARRX(cpp_offsetof(Industry, psa) + cpp_offsetof(Industry::PersistentStorage, storage), SLE_UINT32, 16, 76, SL_MAX_VERSION),
+
/* reserve extra space in savegame here. (currently 32 bytes) */
SLE_CONDNULL(32, 2, SL_MAX_VERSION),
--- a/src/industry_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -118,7 +118,7 @@
indsp = GetIndustrySpec(ind);
if (indsp->enabled && (!indsp->IsRawIndustry() || _game_mode == GM_EDITOR)) {
_fund_gui.index[_fund_gui.count] = ind;
- _fund_gui.enabled[_fund_gui.count] = CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
+ _fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
_fund_gui.count++;
}
}
@@ -128,7 +128,7 @@
indsp = GetIndustrySpec(ind);
if (indsp->enabled && indsp->IsRawIndustry()) {
_fund_gui.index[_fund_gui.count] = ind;
- _fund_gui.enabled[_fund_gui.count] = CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
+ _fund_gui.enabled[_fund_gui.count] = (_game_mode == GM_EDITOR) || CheckIfCallBackAllowsAvailability(ind, IACT_USERCREATION);
_fund_gui.count++;
}
}
@@ -390,9 +390,8 @@
static inline bool IsProductionAlterable(const Industry *i)
{
- const IndustrySpec *ind = GetIndustrySpec(i->type);
return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
- (ind->accepts_cargo[0] == CT_INVALID || ind->accepts_cargo[0] == CT_VALUABLES));
+ (i->accepts_cargo[0] == CT_INVALID || i->accepts_cargo[0] == CT_VALUABLES));
}
/** Information to store about the industry window */
@@ -410,21 +409,22 @@
switch (e->event) {
case WE_CREATE: {
/* Count the number of lines that we need to resize the GUI with */
- const IndustrySpec *ind = GetIndustrySpec(GetIndustry(w->window_number)->type);
+ const Industry *i = GetIndustry(w->window_number);
+ const IndustrySpec *ind = GetIndustrySpec(i->type);
int lines = -3;
if (HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
- for (uint j = 0; j < 3 && ind->accepts_cargo[j] != CT_INVALID; j++) {
+ for (uint j = 0; j < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
if (j == 0) lines++;
lines++;
}
- } else if (ind->accepts_cargo[0] != CT_INVALID) {
+ } else if (i->accepts_cargo[0] != CT_INVALID) {
lines++;
}
- for (uint j = 0; j < 2 && ind->produced_cargo[j] != CT_INVALID; j++) {
+ for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
if (j == 0) {
- if (ind->accepts_cargo[0] != CT_INVALID) lines++;
+ if (i->accepts_cargo[0] != CT_INVALID) lines++;
lines++;
}
lines++;
@@ -448,26 +448,26 @@
DrawWindowWidgets(w);
if (HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HASBIT(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
- for (uint j = 0; j < 3 && ind->accepts_cargo[j] != CT_INVALID; j++) {
+ for (uint j = 0; j < lengthof(i->accepts_cargo) && i->accepts_cargo[j] != CT_INVALID; j++) {
if (j == 0) {
DrawString(2, y, STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING, 0);
y += 10;
}
- SetDParam(0, ind->accepts_cargo[j]);
+ SetDParam(0, i->accepts_cargo[j]);
SetDParam(1, i->incoming_cargo_waiting[j]);
DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, 0);
y += 10;
}
- } else if (ind->accepts_cargo[0] != CT_INVALID) {
+ } else if (i->accepts_cargo[0] != CT_INVALID) {
StringID str;
- SetDParam(0, GetCargo(ind->accepts_cargo[0])->name);
+ SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
str = STR_4827_REQUIRES;
- if (ind->accepts_cargo[1] != CT_INVALID) {
- SetDParam(1, GetCargo(ind->accepts_cargo[1])->name);
+ if (i->accepts_cargo[1] != CT_INVALID) {
+ SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
str = STR_4828_REQUIRES;
- if (ind->accepts_cargo[2] != CT_INVALID) {
- SetDParam(2, GetCargo(ind->accepts_cargo[2])->name);
+ if (i->accepts_cargo[2] != CT_INVALID) {
+ SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
str = STR_4829_REQUIRES;
}
}
@@ -475,15 +475,15 @@
y += 10;
}
- for (uint j = 0; j < 2 && ind->produced_cargo[j] != CT_INVALID; j++) {
+ for (uint j = 0; j < lengthof(i->produced_cargo) && i->produced_cargo[j] != CT_INVALID; j++) {
if (j == 0) {
- if (ind->accepts_cargo[0] != CT_INVALID) y += 10;
+ if (i->accepts_cargo[0] != CT_INVALID) y += 10;
DrawString(2, y, STR_482A_PRODUCTION_LAST_MONTH, 0);
y += 10;
WP(w, indview_d).production_offset_y = y;
}
- SetDParam(0, ind->produced_cargo[j]);
+ SetDParam(0, i->produced_cargo[j]);
SetDParam(1, i->last_month_production[j]);
SetDParam(2, i->last_month_pct_transported[j] * 100 >> 8);
@@ -503,7 +503,10 @@
StringID message = GetGRFStringID(ind->grf_prop.grffile->grfid, 0xD000 + callback_res);
if (message != STR_NULL && message != STR_UNDEFINED) {
y += 10;
+
+ PrepareTextRefStackUsage();
DrawString(2, y, message, 0);
+ StopTextRefStackUsage();
}
}
}
@@ -524,8 +527,7 @@
if (!IsProductionAlterable(i)) return;
x = e->we.click.pt.x;
line = (e->we.click.pt.y - WP(w, indview_d).production_offset_y) / 10;
- if (e->we.click.pt.y >= WP(w, indview_d).production_offset_y && IS_INT_INSIDE(line, 0, 2) &&
- GetIndustrySpec(i->type)->produced_cargo[line] != CT_INVALID) {
+ if (e->we.click.pt.y >= WP(w, indview_d).production_offset_y && IS_INT_INSIDE(line, 0, 2) && i->produced_cargo[line] != CT_INVALID) {
if (IS_INT_INSIDE(x, 5, 25) ) {
/* Clicked buttons, decrease or increase production */
if (x < 15) {
@@ -576,10 +578,8 @@
static void UpdateIndustryProduction(Industry *i)
{
- const IndustrySpec *ind = GetIndustrySpec(i->type);
-
- for (byte j = 0; j < lengthof(ind->produced_cargo); j++) {
- if (ind->produced_cargo[j] != CT_INVALID) {
+ for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
+ if (i->produced_cargo[j] != CT_INVALID) {
i->last_month_production[j] = 8 * i->production_rate[j];
}
}
@@ -652,8 +652,6 @@
{
const Industry* i = *(const Industry**)a;
const Industry* j = *(const Industry**)b;
- const IndustrySpec *ind_i = GetIndustrySpec(i->type);
- const IndustrySpec *ind_j = GetIndustrySpec(j->type);
int r;
switch (_industry_sort_order >> 1) {
@@ -667,10 +665,10 @@
break;
case 2: /* Sort by Production */
- if (ind_i->produced_cargo[0] == CT_INVALID) {
- r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+ if (i->produced_cargo[0] == CT_INVALID) {
+ r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
} else {
- if (ind_j->produced_cargo[0] == CT_INVALID) {
+ if (j->produced_cargo[0] == CT_INVALID) {
r = 1;
} else {
r =
@@ -681,23 +679,23 @@
break;
case 3: /* Sort by transported fraction */
- if (ind_i->produced_cargo[0] == CT_INVALID) {
- r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+ if (i->produced_cargo[0] == CT_INVALID) {
+ r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
} else {
- if (ind_j->produced_cargo[0] == CT_INVALID) {
+ if (j->produced_cargo[0] == CT_INVALID) {
r = 1;
} else {
int pi;
int pj;
pi = i->last_month_pct_transported[0] * 100 >> 8;
- if (ind_i->produced_cargo[1] != CT_INVALID) {
+ if (i->produced_cargo[1] != CT_INVALID) {
int p = i->last_month_pct_transported[1] * 100 >> 8;
if (p < pi) pi = p;
}
pj = j->last_month_pct_transported[0] * 100 >> 8;
- if (ind_j->produced_cargo[1] != CT_INVALID) {
+ if (j->produced_cargo[1] != CT_INVALID) {
int p = j->last_month_pct_transported[1] * 100 >> 8;
if (p < pj) pj = p;
}
@@ -778,15 +776,14 @@
while (p < _num_industry_sort) {
const Industry* i = _industry_sort[p];
- const IndustrySpec *ind = GetIndustrySpec(i->type);
SetDParam(0, i->index);
- if (ind->produced_cargo[0] != CT_INVALID) {
- SetDParam(1, ind->produced_cargo[0]);
+ if (i->produced_cargo[0] != CT_INVALID) {
+ SetDParam(1, i->produced_cargo[0]);
SetDParam(2, i->last_month_production[0]);
- if (ind->produced_cargo[1] != CT_INVALID) {
- SetDParam(3, ind->produced_cargo[1]);
+ if (i->produced_cargo[1] != CT_INVALID) {
+ SetDParam(3, i->produced_cargo[1]);
SetDParam(4, i->last_month_production[1]);
SetDParam(5, i->last_month_pct_transported[0] * 100 >> 8);
SetDParam(6, i->last_month_pct_transported[1] * 100 >> 8);
--- a/src/industry_map.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/industry_map.h Sat Oct 06 21:16:00 2007 +0000
@@ -109,7 +109,7 @@
static inline byte GetIndustryConstructionStage(TileIndex tile)
{
assert(IsTileType(tile, MP_INDUSTRY));
- return GB(_m[tile].m1, 0, 2);
+ return IsIndustryCompleted(tile) ? (byte)INDUSTRY_COMPLETED : GB(_m[tile].m1, 0, 2);
}
/**
@@ -124,6 +124,12 @@
SB(_m[tile].m1, 0, 2, value);
}
+static inline IndustryGfx GetCleanIndustryGfx(TileIndex t)
+{
+ assert(IsTileType(t, MP_INDUSTRY));
+ return _m[t].m5 | (GB(_m[t].m6, 2, 1) << 8);
+}
+
/**
* Get the industry graphics ID for the given industry tile
* @param t the tile to get the gfx for
@@ -133,7 +139,7 @@
static inline IndustryGfx GetIndustryGfx(TileIndex t)
{
assert(IsTileType(t, MP_INDUSTRY));
- return GetTranslatedIndustryTileID(_m[t].m5 | (GB(_m[t].m6, 2, 1) << 8));
+ return GetTranslatedIndustryTileID(GetCleanIndustryGfx(t));
}
/**
@@ -145,7 +151,8 @@
static inline void SetIndustryGfx(TileIndex t, IndustryGfx gfx)
{
assert(IsTileType(t, MP_INDUSTRY));
- _m[t].m5 = gfx;
+ _m[t].m5 = GB(gfx, 0, 8);
+ SB(_m[t].m6, 2, 1, GB(gfx, 8, 1));
}
/**
@@ -253,12 +260,24 @@
* @param tile TileIndex of the tile to query
* @pre IsTileType(tile, MP_INDUSTRY)
* @return requested bits
- * @todo implement the storage in map array
*/
static inline byte GetIndustryRandomBits(TileIndex tile)
{
assert(IsTileType(tile, MP_INDUSTRY));
- return 0;
+ return _me[tile].m7;
+}
+
+/**
+ * Set the random bits for this tile.
+ * Used for grf callbacks
+ * @param tile TileIndex of the tile to query
+ * @param bits the random bits
+ * @pre IsTileType(tile, MP_INDUSTRY)
+ */
+static inline byte GetIndustryRandomBits(TileIndex tile, byte bits)
+{
+ assert(IsTileType(tile, MP_INDUSTRY));
+ _me[tile].m7 = bits;
}
/**
@@ -267,12 +286,11 @@
* @param tile TileIndex of the tile to query
* @pre IsTileType(tile, MP_INDUSTRY)
* @return requested triggers
- * @todo implement the storage in map array
*/
static inline byte GetIndustryTriggers(TileIndex tile)
{
assert(IsTileType(tile, MP_INDUSTRY));
- return 0;
+ return GB(_m[tile].m6, 3, 3);
}
@@ -280,12 +298,13 @@
* Set the activated triggers bits for this industry tile
* Used for grf callbacks
* @param tile TileIndex of the tile to query
+ * @param triggers the triggers to set
* @pre IsTileType(tile, MP_INDUSTRY)
- * @todo implement the storage in map array
*/
static inline void SetIndustryTriggers(TileIndex tile, byte triggers)
{
assert(IsTileType(tile, MP_INDUSTRY));
+ SB(_m[tile].m6, 3, 3, triggers);
}
#endif /* INDUSTRY_MAP_H */
--- a/src/landscape.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/landscape.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -77,23 +77,23 @@
}
uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0;
- byte highest_corner = GetHighestSlopeCorner(*s);
+ Corner highest_corner = GetHighestSlopeCorner(*s);
switch (f) {
case FOUNDATION_INCLINED_X:
- *s = (highest_corner <= 1 ? SLOPE_SW : SLOPE_NE);
+ *s = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? SLOPE_SW : SLOPE_NE);
break;
case FOUNDATION_INCLINED_Y:
- *s = (((highest_corner == 1) || (highest_corner == 2)) ? SLOPE_SE : SLOPE_NW);
+ *s = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? SLOPE_SE : SLOPE_NW);
break;
case FOUNDATION_STEEP_LOWER:
- *s = (Slope) (1 << highest_corner);
+ *s = SlopeWithOneCornerRaised(highest_corner);
break;
case FOUNDATION_STEEP_HIGHER:
- *s = (Slope) (*s & ~SLOPE_STEEP);
+ *s = SlopeWithThreeCornersRaised(OppositeCorner(highest_corner));
break;
default: NOT_REACHED();
@@ -271,7 +271,7 @@
lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
);
- byte highest_corner = GetHighestSlopeCorner(ti->tileh);
+ Corner highest_corner = GetHighestSlopeCorner(ti->tileh);
ti->z += ApplyFoundationToSlope(f, &ti->tileh);
if (IsInclinedFoundation(f)) {
--- a/src/lang/american.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/american.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :On
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Show vehicle speed in status bar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Allow building on slopes and coasts: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Allow terraforming under buildings, tracks, etc. (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Allow more realistically sized catchment areas: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Allow removal of more town-owned roads, bridges, etc: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Enable building very long trains: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll map
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Off
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Map scrollwheel speed: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Right-click emulation: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Off
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatically pause when starting a new game: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Use the advanced vehicle list: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Own company
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :All companies
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Use loading indicators: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Own company
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :All companies
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Enable timetabling for vehicles: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Show timetable in ticks rather than days: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Default rail type (after new game/game load): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
STR_BUOY_IS_IN_USE :{WHITE}... buoy is in use!
+STR_LANDINFO_COORDS :{BLACK}Co-ordinates: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
STR_CANT_CONVERT_RAIL :{WHITE}Can't convert railtype here...
@@ -1372,18 +1386,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Protect your game with a password if you don't want other people to join it
STR_NETWORK_SELECT_MAP :{BLACK}Select a map:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Which map do you want to play?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maximum allowed clients:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Choose a maximum number of clients. Not all slots need to be filled.
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :LAN / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (advertize)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} client{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maximum allowed clients:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Choose a maximum number of clients. Not all slots need to be filled.
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P y ies}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Max companies:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Limit the server to a certain number of companies
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} spectator{P "" s}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Max spectators:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Limit the server to a certain number of spectators
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Language spoken:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Other players will know which language is spoken on the server.
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Start Game
STR_NETWORK_START_GAME_TIP :{BLACK}Start a new network game from a random map, or scenario
STR_NETWORK_LOAD_GAME :{BLACK}Load Game
@@ -1611,9 +1630,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Railroad track with normal signals
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Railroad track with pre-signals
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Railroad track with exit-signals
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Railway track with combo-signals
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Railway track with normal and pre-signals
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Railway track with normal and exit-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Railway track with normal and combo-signals
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Railway track with pre- and exit-signals
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Railway track with pre- and combo-signals
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Railway track with exit- and combo-signals
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Must remove railway station first
@@ -1994,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Must demolish tunnel first
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Must demolish bridge first
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Cannot start and end on same position
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Level land or water required under bridge
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start and end must be in line
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Site unsuitable for tunnel entrance
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Rename the selected group
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Click to protect this group from global autoreplace
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/brazilian_portuguese.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt Sat Oct 06 21:16:00 2007 +0000
@@ -14,7 +14,7 @@
STR_0003_NOT_ENOUGH_CASH_REQUIRES :{WHITE}Não há dinheiro - requer {CURRENCY}
STR_0004 :{WHITE}{CURRENCY}
STR_EMPTY :
-STR_0007_FLAT_LAND_REQUIRED :{WHITE}Precisa de terreno plano
+STR_0007_FLAT_LAND_REQUIRED :{WHITE}Necessita de terreno plano
STR_0008_WAITING :{BLACK}Aguardando: {WHITE}{STRING}
STR_0009 :{WHITE}{CARGO}
STR_000A_EN_ROUTE_FROM :{WHITE}{CARGO}{YELLOW} (em rota de
@@ -487,7 +487,7 @@
STR_019F_TRAIN :{G=m}Trem
STR_01A0_IS_GETTING_OLD :{WHITE}{STRING} {COMMA} está ficando velho
STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} está ficando muito velho
-STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA} está ficando muito velho e precisa ser substituÃdo urgentemente
+STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA} está ficando muito velho e necessita substituição urgente
STR_01A3_LAND_AREA_INFORMATION :{WHITE}Informações do Terreno
STR_01A4_COST_TO_CLEAR_N_A :{BLACK}Custo para limpar: {LTBLUE}N/D
STR_01A5_COST_TO_CLEAR :{BLACK}Custo para limpar: {LTBLUE}{CURRENCY}
@@ -720,7 +720,7 @@
STR_0283_CONSTRUCT_TOFFEE_QUARRY :{BLACK}Construir Extração de Caramelo
STR_0284_CONSTRUCT_SUGAR_MINE :{BLACK}Construir Mina de Açúcar
STR_0285_CAN_T_BUILD_HERE :{WHITE}ImpossÃvel construir {STRING} aqui...
-STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...precisa construir uma cidade primeiro
+STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...necessário construir uma cidade primeiro
STR_0287_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}...só é permitido uma por cidade
STR_0288_PLANT_TREES :{BLACK}Plantar árvores
STR_0289_PLACE_SIGN :{BLACK}Colocar placas
@@ -750,7 +750,7 @@
STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...só pode ser construÃdo em cidades com pelo menos 1200 habitantes
STR_029E_MOVE_THE_STARTING_DATE :{BLACK}Retroceder data de inicio em 1 ano
STR_029F_MOVE_THE_STARTING_DATE :{BLACK}Avançar data de inicio em 1 ano
-STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}...os extremos da ponte precisam estar sobre a terra
+STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}...os extremos da ponte necessitam estar sobre a terra
STR_02A1_SMALL :{BLACK}Pequena
STR_02A2_MEDIUM :{BLACK}Média
STR_02A3_LARGE :{BLACK}Grande
@@ -1022,6 +1022,7 @@
STR_CONFIG_PATCHES_ON :On
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Exibir velocidade do veÃculo na barra de estado: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Permitir a construção em declives e encostas: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permitir terraformação sob edifÃcios, ruas, etc. (auto nivelação): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Permitir dimensionamento mais realista das áreas de abrangência: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permitir a remoção de mais rodovias, pontes, etc. das cidades: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Permitir a construção de trens muito longos: {ORANGE}{STRING}
@@ -1105,9 +1106,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll map
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Desligado
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Velocidade do scrollwheel do mapa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Compatibilizar o botão direito do mouse: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Clique de comando
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Clique de controle
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Desligado
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Pausar automaticamente ao inicar um novo jogo: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Usar a lista avançada de veÃculos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Desligado
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Própria Compania
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Todas as companias
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Desligado
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Própria Compania
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Todas as Companias
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Ativar plano de horário para veÃculos: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Exibir plano de horário em tiques ao invés de dias: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar um jogo): {ORANGE}{STRING}
@@ -1382,7 +1395,7 @@
STR_NETWORK_INTERNET_ADVERTISE :Internet (divulgar)
STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} cliente{P "" s}
STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Máximo de clientes:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Escolha o número máximo de clientes. Não precisam estar todos preenchidos
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Escolha o número máximo de clientes. Não necessita estarem todos preenchidos
STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P ia ias}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Máximo de empresas:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Limita o servidor para uma certa quantia de empresas
@@ -1587,7 +1600,7 @@
STR_1004_TOO_HIGH :{WHITE}Muito alto
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
STR_1007_ALREADY_BUILT :{WHITE}...já construÃdo
-STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Precisa remover a ferrovia primeiro
+STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Necessário remover a ferrovia primeiro
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construir ferrovias
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construir ferrovias (elétricas)
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construir ferrovias (monotrilho)
@@ -1631,7 +1644,7 @@
##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST :{WHITE}Precisa remover a rodovia primeiro
+STR_1801_MUST_REMOVE_ROAD_FIRST :{WHITE}Necessário remover a rodovia primeiro
STR_ROAD_WORKS_IN_PROGRESS :{WHITE}Recapeamento rodoviário em progresso
STR_1802_ROAD_CONSTRUCTION :{WHITE}Construir rodovias
STR_1802_TRAMWAY_CONSTRUCTION :{WHITE}Construção de Bonde
@@ -1684,7 +1697,7 @@
STR_TOWN_LABEL_TINY_BLACK :{TINYFONT}{BLACK}{TOWN}
STR_TOWN_LABEL_TINY_WHITE :{TINYFONT}{WHITE}{TOWN}
STR_2002 :{TINYFONT}{BLACK}{SIGN}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifÃcio precisa ser demolido primeiro
+STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifÃcio necessita ser demolido primeiro
STR_2005 :{WHITE}{TOWN}
STR_2006_POPULATION :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Renomear Cidade
@@ -1814,9 +1827,9 @@
STR_3008B_TOO_MANY_TRUCK_STOPS :{WHITE}Muitos locais de carga
STR_3009_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Muito perto de outra estação/local de carga
STR_300A_0 :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD :{WHITE}Precisa demolir a estação primeiro
+STR_300B_MUST_DEMOLISH_RAILROAD :{WHITE}Necessário demolir a estação primeiro
STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Muito perto de outro aeroporto
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Precisa demolir o aeroporto primeiro
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Necessário demolir o aeroporto primeiro
STR_3030_RENAME_STATION_LOADING :Renomear estação/área de carga
STR_3031_CAN_T_RENAME_STATION :{WHITE}ImpossÃvel renomear a estação...
@@ -1844,16 +1857,16 @@
STR_3043_TRUCK_STATION_ORIENT :{WHITE}Orientação da estação de caminhão
STR_3042_PASSENGER_TRAM_STATION_ORIENTATION :{WHITE}Orientação da Estação de Bonde
STR_3043_CARGO_TRAM_STATION_ORIENT :{WHITE}Orientação da Estação de Bonde
-STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Precisa demolir a estação de ônibus primeiro
-STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Precisa demolir a estação de caminhão
-STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Precisa demolir estação de bonde primeiro
-STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Precisa demolir estação de bonde primeiro
+STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Necessário demolir a estação de ônibus primeiro
+STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Necessário demolir a estação de caminhão
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Necessário demolir estação de bonde primeiro
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Necessário demolir estação de bonde primeiro
STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} Estações
STR_3049_0 :{YELLOW}{STATION} {STATIONFEATURES}
STR_304A_NONE :{YELLOW}- Nenhuma -
STR_304B_SITE_UNSUITABLE :{WHITE}...local inadequado
STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Muito perto de outra doca
-STR_304D_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Precisa demolir a doca primeiro
+STR_304D_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Necessário demolir a doca primeiro
STR_304E_SELECT_RAILROAD_STATION :{BLACK}Selecionar a orientação da estação ferroviária
STR_304F_SELECT_NUMBER_OF_PLATFORMS :{BLACK}Selecionar o número de linhas da estação ferroviária
STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Selecionar o tamanho da estação ferroviária
@@ -1891,7 +1904,7 @@
##id 0x3800
STR_3800_SHIP_DEPOT_ORIENTATION :{WHITE}Orientação do Depósito Naval
-STR_3801_MUST_BE_BUILT_ON_WATER :{WHITE}...precisa ser construÃdo na água
+STR_3801_MUST_BE_BUILT_ON_WATER :{WHITE}...necessita ser construÃdo na água
STR_3802_CAN_T_BUILD_SHIP_DEPOT :{WHITE}ImpossÃvel construir depósito naval aqui...
STR_3803_SELECT_SHIP_DEPOT_ORIENTATION :{BLACK}Selecionar orientação do depósito naval
STR_3804_WATER :Ãgua
@@ -2005,11 +2018,10 @@
STR_5001_ROAD_VEHICLE_IN_TUNNEL :{WHITE}Automóvel no túnel
STR_5003_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Há outro túnel no caminho
STR_5005_UNABLE_TO_EXCAVATE_LAND :{WHITE}Incapaz de escavar o terreno para o outro lado do túnel
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Precisa demolir o túnel primeiro
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Precisa demolir a ponte primeiro
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Necessário demolir o túnel primeiro
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Necessário demolir a ponte primeiro
STR_5008_CANNOT_START_AND_END_ON :{WHITE}ImpossÃvel iniciar e terminar no mesmo ponto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Debaixo da ponte é necessário um terreno plano ou água
-STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Inicio e fim precisam estar alinhados
+STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Inicio e fim necessitam estar alinhados
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}O local não é adequado para a entrada do túnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
STR_500E_SUSPENSION_STEEL :Suspensa, Aço
@@ -2684,7 +2696,7 @@
STR_882D_VALUE :{LTBLUE}{ENGINE}{BLACK} Valor: {LTBLUE}{CURRENCY}
STR_882E :{WHITE}{VEHICLE}
STR_882F_LOADING_UNLOADING :{LTBLUE}Carregando / descarregando
-STR_TRAIN_MUST_BE_STOPPED :{WHITE}O trem precisa estar parado dentro do depósito
+STR_TRAIN_MUST_BE_STOPPED :{WHITE}O trem necessita estar parado dentro do depósito
STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}ImpossÃvel enviar o trem para o depósito...
STR_8831_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Não há espaço para mais ordens
STR_8832_TOO_MANY_ORDERS :{WHITE}Muitas ordens
@@ -2797,7 +2809,7 @@
STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}Confiabilidade: {LTBLUE}{COMMA}% {BLACK}Quebras desde a última manutenção: {LTBLUE}{COMMA}
STR_9011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} ConstruÃdo: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
STR_9012_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO}
-STR_9013_MUST_BE_STOPPED_INSIDE :{WHITE}...precisa estar parado dentro de uma garagem
+STR_9013_MUST_BE_STOPPED_INSIDE :{WHITE}...necessita estar parado dentro de uma garagem
STR_9014_CAN_T_SELL_ROAD_VEHICLE :{WHITE}ImpossÃvel vender automóvel...
STR_9015_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}ImpossÃvel iniciar/parar automóvel...
STR_9016_ROAD_VEHICLE_IS_WAITING :{WHITE}Automóvel {COMMA} está aguardando na garagem
@@ -2861,7 +2873,7 @@
STR_CLONE_SHIP :{BLACK}Clonar Embarcação
STR_CLONE_SHIP_INFO :{BLACK}Isso vai construir uma cópia da embarcação. Control-clique vai compartilhar as ordens
STR_CLONE_SHIP_DEPOT_INFO :{BLACK}Isso irá construir uma cópia da embarcação. Clique neste botão e depois em uma embarcação dentro ou fora do depósito naval. Control-clique vai compartilhar as ordens
-STR_980B_SHIP_MUST_BE_STOPPED_IN :{WHITE}A embarcação precisa estar parado no depósito naval
+STR_980B_SHIP_MUST_BE_STOPPED_IN :{WHITE}A embarcação necessita estar parado no depósito naval
STR_980C_CAN_T_SELL_SHIP :{WHITE}ImpossÃvel vender embarcação...
STR_980D_CAN_T_BUILD_SHIP :{WHITE}ImpossÃvel construir embarcação...
STR_980E_SHIP_IN_THE_WAY :{WHITE}Embarcação no caminho
@@ -2951,7 +2963,7 @@
STR_A017_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Aeronave está em voo
STR_A019_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO}, {CARGO}
STR_A01A_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO}
-STR_A01B_AIRCRAFT_MUST_BE_STOPPED :{WHITE}A aeronave precisa estar parada no hangar
+STR_A01B_AIRCRAFT_MUST_BE_STOPPED :{WHITE}A aeronave necessita estar parada no hangar
STR_A01C_CAN_T_SELL_AIRCRAFT :{WHITE}ImpossÃvel vender aeronave...
STR_A01D_AIRPORT_CONSTRUCTION :Construir aeroporto
STR_A01E_BUILD_AIRPORT :{BLACK}Construir aeroporto
--- a/src/lang/bulgarian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/bulgarian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,18 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Разгледай картата
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Изклучен
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Scrollwheel ÑкороÑÑ‚ на картата: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Изключен
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Ðвтоматична пауза Ñтартирайки нова игра: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Използваи напредналиат ÑпиÑък на превозни ÑредÑтва: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Изключен
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :СобÑтвена компаниÑ
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Ð’Ñички компаний
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Използвай товарни индикатори: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Изключен
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :СобÑтвена компаниÑ
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Ð’Ñички компаний
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Включи времеÑлуженето на ПС-та: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Покажи времеÑлуженето в Ñлучаи, а не в дни: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Стандартни релÑи (Ñлед нова игра/отварÑне на запазена игра): {ORANGE}{STRING}
@@ -1262,6 +1271,7 @@
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_CONVERT_RAIL :{WHITE}Тук не може да Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñ‚Ð¸Ð¿Ð° на жп линиÑта...
@@ -1377,14 +1387,17 @@
STR_NETWORK_INTERNET :Интернет
STR_NETWORK_LAN_INTERNET :LAN / Интернет
STR_NETWORK_INTERNET_ADVERTISE :Интернет (реклама)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} клиент{P "" s}
STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}МакÑ. клиенти:
STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Избор на макÑÐ¸Ð¼Ð°Ð»Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð¹ клиенти. Ðе вÑички Ñлотове Ñ‚Ñ€Ñбва да Ñе попълнÑÑ‚
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}МакÑ. компании:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Ограничаване на играта до определен брой компании
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} зрител{P "" s}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}МакÑ. наблюдатели:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Ограничаване на Ñървъра до определен брой наблюдатели
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Говорим език:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Другите играчи ще знаÑÑ‚ езика на който Ñе говори на Ñървъра
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Ðачало на игра
STR_NETWORK_START_GAME_TIP :{BLACK}Започване на нова мрежова игра от Ñлучайна карта или Ñценарий
STR_NETWORK_LOAD_GAME :{BLACK}Зареждане на игра
@@ -1612,7 +1625,10 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ Ñигнали
STR_RAILROAD_TRACK_WITH_PRESIGNALS :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð¿Ñ€Ðµ-Ñигнали
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :ЖП Ð»Ð¸Ð½Ð¸Ñ Ñ Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸ Ñигнали
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Железопътна линиа Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€Ð°Ð½Ð¸ знаци
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Железопътна линиа Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ и изходни Ñигнали
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Железопътна линиа Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð½Ð¸ и комбинирани знаци
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Железопътна линиа Ñ Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸ и комбинирани знаци
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Железопътната гара Ñ‚Ñ€Ñбва да бъде премахната първо
@@ -1992,7 +2008,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Първо разрушете тунела
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Първо Ñ‚Ñ€Ñбва да разрушите моÑта
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ðе може да започва и да Ñвърша на едно и Ñъщо мÑÑто
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Равна Ð·ÐµÐ¼Ñ Ð¸Ð»Ð¸ вода е необходима под моÑта
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Ðачалото и краÑÑ‚ Ñ‚Ñ€Ñбва да Ñа на една линиÑ
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}ÐœÑÑтото е неподходÑщо за вход на тунел
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2759,6 +2774,7 @@
STR_TIMETABLE_STATUS_LATE :Това превознот ÑредÑтво е в момента Ñ {STRING} закъÑнение
STR_TIMETABLE_STATUS_EARLY :Това превознот ÑредÑтво е в момента Ñ {STRING} по-рано
STR_TIMETABLE_TOTAL_TIME :Ще Ñ‚Ñ€Ñбва {STRING} за това разпиÑание да бъде приклучено
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :Това разпиÑание ще вземе най-малко {STRING} за да приклучи (не вÑичко е планирано)
STR_TIMETABLE_AUTOFILL :{BLACK}Ðфтонапълване
##id 0x9000
--- a/src/lang/catalan.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/catalan.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :Actiu
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Mostra la velocitat del vehicle a la barra d'estat: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Permet construir en desnivells i costes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permet terraformar sota edificis, rails, etc. (autopendent): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Permet un tamany més real de l'à rea d'influència: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permet l'esborrat de propietats de les poblacions: carreteres, ponts, túnels, etc: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Activa la construcció de trens molt llargs: {ORANGE}{STRING}
@@ -1101,11 +1102,23 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Funció de la rodeta del ratolÃ: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM :Zoom mapa
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Mou el mapa
-STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Off
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Inactiu
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Velocitat del mapa amb la rodeta del ratolÃ: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulació del botó dret: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Desactivat
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Posa en pausa automà ticament en començar un joc nou: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Utilitza la llista de vehicles avançada: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Inactiu
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Pròpia companyia
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Totes les companyies
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Utilitza indicadors de carregament: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Inactiu
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Pròpia companyia
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Totes les companyies
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Habilita horaris dels vehicles: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Mostra horaris en marques enlloc de dies: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Tipus de via predeterminada (en un joc nou/joc desat): {ORANGE}{STRING}
@@ -2004,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Primer has d'enderrocar el túnel
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primer has d'enderrocar el pont
STR_5008_CANNOT_START_AND_END_ON :{WHITE}No es pot començar i acabar a la mateixa posició
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Es necessita una certa elevació sobre el terreny o aigua sota el pont
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Inici i final han d'estar en lÃnia recta
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Lloc inadequat per l'entrada del túnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/croatian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/croatian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -158,7 +158,7 @@
STR_00B2_MESSAGE :{YELLOW}Poruka
STR_00B3_MESSAGE_FROM :{YELLOW}Poruka od {STRING}
STR_POPUP_CAUTION_CAPTION :{WHITE}Oprez!
-STR_00B4_CAN_T_DO_THIS :{WHITE}To nije moguće napraviti....
+STR_00B4_CAN_T_DO_THIS :{WHITE}To nije moguće uÄiniti....
STR_00B5_CAN_T_CLEAR_THIS_AREA :{WHITE}Nije moguće oÄistiti ovo podruÄje....
STR_00B6_ORIGINAL_COPYRIGHT :{BLACK}Izvorno autorsko pravo {COPYRIGHT} 1995 Chris Sawyer, sva prava pridržana
STR_00B7_VERSION :{BLACK}OpenTTD verzija {REV}
@@ -254,7 +254,7 @@
STR_011B_RAILROAD_STATION :{BLACK}{TINYFONT}ŽeljezniÄka stanica
STR_011C_TRUCK_LOADING_BAY :{BLACK}{TINYFONT}Kamionski terminal
STR_011D_BUS_STATION :{BLACK}{TINYFONT}Autobusn stanica
-STR_011E_AIRPORT_HELIPORT :{BLACK}{TINYFONT}Aerodrom/Heliodrom
+STR_011E_AIRPORT_HELIPORT :{BLACK}{TINYFONT}ZraÄna luka/Heliodrom
STR_011F_DOCK :{BLACK}{TINYFONT}Pristanište
STR_0120_ROUGH_LAND :{BLACK}{TINYFONT}Surova zemlja
STR_0121_GRASS_LAND :{BLACK}{TINYFONT}Travnjak
@@ -292,7 +292,7 @@
STR_013E_TOTAL_CARGO :{BLACK}Ukupni teret
STR_013F_CAPACITY :{BLACK}Nosivost: {LTBLUE}{CARGO}
STR_CAPACITY_MULT :{BLACK}Nosivost: {LTBLUE}{CARGO} (x{NUM})
-STR_013F_TOTAL_CAPACITY_TEXT :{BLACK}Ukupna nosivost ovoga vlaka:
+STR_013F_TOTAL_CAPACITY_TEXT :{BLACK}Ukupna nosivost tereta ovog vlaka:
STR_013F_TOTAL_CAPACITY :{LTBLUE}- {CARGO} ({SHORTCARGO})
STR_TOTAL_CAPACITY_MULT :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
STR_0140_NEW_GAME :{BLACK}Nova igra
@@ -350,10 +350,10 @@
############ range for menu starts
STR_0154_OPERATING_PROFIT_GRAPH :Grafikon operativne dobiti
-STR_0155_INCOME_GRAPH :Graf prihoda
-STR_0156_DELIVERED_CARGO_GRAPH :Graf isporuÄenog tereta
-STR_0157_PERFORMANCE_HISTORY_GRAPH :Graf povijesti uÄinka
-STR_0158_COMPANY_VALUE_GRAPH :Graf vrijednosti tvrtke
+STR_0155_INCOME_GRAPH :Grafikon prihoda
+STR_0156_DELIVERED_CARGO_GRAPH :Grafikon isporuÄenog tereta
+STR_0157_PERFORMANCE_HISTORY_GRAPH :Grafikon uÄinkovitosti
+STR_0158_COMPANY_VALUE_GRAPH :Grafikon vrijednosti tvrtke
STR_0159_CARGO_PAYMENT_RATES :Iznosi plaćanja tereta
STR_015A_COMPANY_LEAGUE_TABLE :Tablica lige tvrtki
STR_PERFORMANCE_DETAIL_MENU :Detaljna ocjena uÄinka
@@ -382,7 +382,7 @@
STR_SORT_BY_PROFIT_THIS_YEAR :Dobit ove godine
STR_SORT_BY_AGE :Godine
STR_SORT_BY_RELIABILITY :Pouzdanost
-STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Totalna nosivost po vrsti tereta
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Ukupna nosivost po vrsti tereta
STR_SORT_BY_MAX_SPEED :Maksimalna brzina
STR_SORT_BY_MODEL :Model
STR_SORT_BY_VALUE :Vrijednost
@@ -397,19 +397,19 @@
STR_ENGINE_SORT_POWER_VS_RUNNING_COST :Trošak snage/uporabe
STR_ENGINE_SORT_CARGO_CAPACITY :Nosivost tereta
STR_NO_WAITING_CARGO :{BLACK}Nijedna vrsta tereta ne Äeka
-STR_SELECT_ALL_FACILITIES :{BLACK}Izaberi sva sredstva
-STR_SELECT_ALL_TYPES :{BLACK}Izaberi sve vrste tereta (ukljuÄujući i teret koji ne Äeka)
+STR_SELECT_ALL_FACILITIES :{BLACK}Odaberi sva sredstva
+STR_SELECT_ALL_TYPES :{BLACK}Odaberi sve vrste tereta (ukljuÄujući i teret koji ne Äeka)
STR_AVAILABLE_TRAINS :{BLACK}Dostupni vlakovi
STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Dostupna vozila
STR_AVAILABLE_SHIPS :{BLACK}Dostupni brodovi
STR_AVAILABLE_AIRCRAFT :{BLACK}Dostupni zrakoplovi
STR_AVAILABLE_ENGINES_TIP :{BLACK}Pogledaj popis dostupnih dizajna motora za ovu vrstu vozila.
STR_MANAGE_LIST :{BLACK}Uredi popis
-STR_MANAGE_LIST_TIP :{BLACK}Pošalji upute svim vozilima na ovoj listi
+STR_MANAGE_LIST_TIP :{BLACK}Pošalji upute svim vozilima na ovom popisu
STR_REPLACE_VEHICLES :Zamjeni vozila
STR_SEND_TRAIN_TO_DEPOT :Pošalji u spremište
-STR_SEND_ROAD_VEHICLE_TO_DEPOT :
-STR_SEND_SHIP_TO_DEPOT :
+STR_SEND_ROAD_VEHICLE_TO_DEPOT :Pošalji u spremište
+STR_SEND_SHIP_TO_DEPOT :Pošalji u spremište
STR_SEND_AIRCRAFT_TO_HANGAR :Pošalji u hangar
STR_SEND_FOR_SERVICING :Pošalji na servis
@@ -433,18 +433,18 @@
STR_0170 :{TINYFONT}{STRING}-
STR_0171_PAUSE_GAME :{BLACK}Zaustavi igru
STR_0172_SAVE_GAME_ABANDON_GAME :{BLACK}Spremi igru, napusti igru, prekini igru
-STR_0173_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis stanica u vlasništvu tvrke
+STR_0173_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis stanica u vlasništvu tvrtke
STR_0174_DISPLAY_MAP :{BLACK}Prikaži kartu
STR_0175_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Prikaži kartu, popis gradova
STR_0176_DISPLAY_TOWN_DIRECTORY :{BLACK}Prikaži popis gradova
-STR_0177_DISPLAY_COMPANY_FINANCES :{BLACK}Prikaži financijske podatke tvrke
+STR_0177_DISPLAY_COMPANY_FINANCES :{BLACK}Prikaži financijske podatke tvrtke
STR_0178_DISPLAY_COMPANY_GENERAL :{BLACK}Prikaži opće podatke tvrtke
-STR_0179_DISPLAY_GRAPHS :{BLACK}Prikaži grafove
+STR_0179_DISPLAY_GRAPHS :{BLACK}Prikaži grafikone
STR_017A_DISPLAY_COMPANY_LEAGUE :{BLACK}Prikaži tablicu lige tvrtki
-STR_017B_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis vlakova u posjedu tvrtke
-STR_017C_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis cestovnih vozila u posjedu tvrke
-STR_017D_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaž popis brodova u posjedu tvrke
-STR_017E_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis zrakoplova u posjedu tvrtke
+STR_017B_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis vlakova u vlasništvu tvrtke
+STR_017C_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis cestovnih vozila u vlasništvu tvrtke
+STR_017D_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaž popis brodova u vlasništvu tvrtke
+STR_017E_DISPLAY_LIST_OF_COMPANY :{BLACK}Prikaži popis zrakoplova u vlasništvu tvrtke
STR_017F_ZOOM_THE_VIEW_IN :{BLACK}Približi pogled
STR_0180_ZOOM_THE_VIEW_OUT :{BLACK}Udalji pogled
STR_0181_BUILD_RAILROAD_TRACK :{BLACK}Izgradi željezniÄku prugu
@@ -462,18 +462,18 @@
STR_STICKY_BUTTON :{BLACK}OznaÄi ovaj prozor kao nezatvoriv kad se rabi tipka 'Zatvori sve prozore'
STR_RESIZE_BUTTON :{BLACK}Pritisni i povuci za promjenu veliÄine prozora
STR_SAVELOAD_HOME_BUTTON :{BLACK}Pritisni ovdje za prelazak u trenutnu pretpostavljenu mapu za snimanje/uÄitavanje
-STR_018D_DEMOLISH_BUILDINGS_ETC :{BLACK}Uništi građevine itd. na kvadratu zemlje
+STR_018D_DEMOLISH_BUILDINGS_ETC :{BLACK}Sruši građevine itd. na kvadratu zemlje
STR_018E_LOWER_A_CORNER_OF_LAND :{BLACK}Snizi vrh kvadrata zemlje
STR_018F_RAISE_A_CORNER_OF_LAND :{BLACK}Povisi vrh kvadrata zemlje
-STR_0190_SCROLL_BAR_SCROLLS_LIST :{BLACK}PomiÄna traka - lista gore/dolje
-STR_HSCROLL_BAR_SCROLLS_LIST :{BLACK}KlizaÄ - pomiÄi listu lijevo/desno
-STR_0191_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Prikaži obrise zemlje na karti
-STR_0192_SHOW_VEHICLES_ON_MAP :{BLACK}Prikaži vozila na karti
-STR_0193_SHOW_INDUSTRIES_ON_MAP :{BLACK}Prikaži industrije na karti
-STR_0194_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Prikaži prijevozne trase na karti
-STR_0195_SHOW_VEGETATION_ON_MAP :{BLACK}Prikaži vegetaciju na karti
-STR_0196_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Prikaži vlasnike zemlje na karti
-STR_0197_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Prikaži/sakrij imena grada na karti
+STR_0190_SCROLL_BAR_SCROLLS_LIST :{BLACK}Klizna traka - lista gore/dolje
+STR_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Klizna traka - pomiÄi listu lijevo/desno
+STR_0191_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Pokaži obrise zemlje na karti
+STR_0192_SHOW_VEHICLES_ON_MAP :{BLACK}Pokaži vozila na karti
+STR_0193_SHOW_INDUSTRIES_ON_MAP :{BLACK}Pokaži industrije na karti
+STR_0194_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Pokaži prijevozne trase na karti
+STR_0195_SHOW_VEGETATION_ON_MAP :{BLACK}Pokaži vegetaciju na karti
+STR_0196_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Pokaži vlasnike zemlje na karti
+STR_0197_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Prikaži/sakrij imena gradova na karti
STR_0198_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Ovogodišnja dobit: {CURRENCY} (prošlogodišnja: {CURRENCY})
############ range for service numbers starts
@@ -539,7 +539,7 @@
STR_01D1_8 :({COMMA}/8 {STRING})
STR_01D2_JAZZ_JUKEBOX :{WHITE}Jazz Jukebox
STR_01D3_SOUND_MUSIC :Zvuk/glazba
-STR_01D4_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Prikaži prozor zvuk/glazba
+STR_01D4_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Pokaži prozor zvuk/glazba
STR_01D5_ALL :{TINYFONT}Sve
STR_01D6_OLD_STYLE :{TINYFONT}Staromodno
STR_01D7_NEW_STYLE :{TINYFONT}Moderno
@@ -550,7 +550,7 @@
STR_01DC_EFFECTS_VOLUME :{BLACK}{TINYFONT}Glasnoća zvukova
STR_01DD_MIN_MAX :{BLACK}{TINYFONT}MIN ' ' ' ' ' ' MAX
STR_01DE_SKIP_TO_PREVIOUS_TRACK :{BLACK}Prethodna traka
-STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Sljedeća traka
+STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Sljedeća traka u izboru
STR_01E0_STOP_PLAYING_MUSIC :{BLACK}Zaustavi glazbu
STR_01E1_START_PLAYING_MUSIC :{BLACK}Pokreni glazbu
STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Povuci klizaÄe za namjeÅ¡tanje glasnoće glazbe i zvukova
@@ -577,23 +577,23 @@
STR_01F7_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Odaberi program 'Proizvoljna glazba 2'
STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Obriši aktivni program (samo Proizvoljno 1 ili Proizvoljno 2)
STR_01F9_SAVE_MUSIC_SETTINGS :{BLACK}Spremi glazbene postavke
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO :{BLACK}Klikni na glazbenu traku za dodavanje u aktivni program (samo Proizvoljno 1 ili Proizvoljno 2)
-STR_CLICK_ON_TRACK_TO_REMOVE :{BLACK}Klikni na glazbenu traku da ju makneš iz trenutnog programa (samo Proizvoljno1 ili Proizvoljno2)
-STR_01FB_TOGGLE_PROGRAM_SHUFFLE :{BLACK}UkluÄi/iskljuÄi mijeÅ¡anje programa
-STR_01FC_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Prikaži prozor za izbor glazbenih traka
-STR_01FD_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Pritisni na uslugu za centriranje pogleda na industriju/grad
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO :{BLACK}Klikni na glazbenu traku za dodavanje u aktivni program (samo Proizvoljno1 ili Proizvoljno2)
+STR_CLICK_ON_TRACK_TO_REMOVE :{BLACK}Klikni na glazbenu traku kako bi ju uklonio iz trenutnog programa (samo Proizvoljno1 ili Proizvoljno2)
+STR_01FB_TOGGLE_PROGRAM_SHUFFLE :{BLACK}UkljuÄi/iskljuÄi mijeÅ¡anje programa
+STR_01FC_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Pokaži prozor za izbor glazbenih traka
+STR_01FD_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikni na uslugu za centriranje pogleda na industriju/grad
STR_01FE_DIFFICULTY :{BLACK}Težina ({STRING})
STR_01FF :{TINYFONT}{BLACK}{DATE_LONG}
STR_0200_LAST_MESSAGE_NEWS_REPORT :Poslijednja poruka/vijest
STR_0201_MESSAGE_SETTINGS :Postavke poruka
STR_MESSAGE_HISTORY_MENU :Povijest poruka
-STR_0203_SHOW_LAST_MESSAGE_NEWS :{BLACK}Prikaži zadnju poruku/vijest, prikaži postavke poruka
-STR_0204_MESSAGE_OPTIONS :{WHITE}Mogućnosti poruka
+STR_0203_SHOW_LAST_MESSAGE_NEWS :{BLACK}Pokaži zadnju poruku/vijest, prikaži postavke poruka
+STR_0204_MESSAGE_OPTIONS :{WHITE}Postavke poruka
STR_0205_MESSAGE_TYPES :{BLACK}Vrste poruka:
STR_0206_ARRIVAL_OF_FIRST_VEHICLE :{YELLOW}Dolazak prvog vozila u stanicu igraÄa
STR_0207_ARRIVAL_OF_FIRST_VEHICLE :{YELLOW}Dolazak prvog vozila u stanicu suparnika
STR_0208_ACCIDENTS_DISASTERS :{YELLOW}Nesreće / katastrofe
-STR_0209_COMPANY_INFORMATION :{YELLOW}Podaci vezani za tvrtku
+STR_0209_COMPANY_INFORMATION :{YELLOW}Podatci vezani za tvrtku
STR_NEWS_OPEN_CLOSE :{YELLOW}Otvaranje / zatvaranje industrija
STR_020A_ECONOMY_CHANGES :{YELLOW}Promjene u gospodarstvu
STR_020B_ADVICE_INFORMATION_ON_PLAYER :{YELLOW}Savjet / informacija o vozilima igraÄa
@@ -605,7 +605,7 @@
STR_MESSAGE_SOUND :{YELLOW} Pusti zvuk za sve skraćene novinske poruke
STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...predaleko od prethodnog odredišta
STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Najbolje tvrtke koje su dosigle razinu {NUM}{}({STRING})
-STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Tablica kompanija u {NUM}
+STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Tablica tvrtki u {NUM}
STR_0212 :{BIGFONT}{COMMA}.
STR_0213_BUSINESSMAN :Privrednik
STR_0214_ENTREPRENEUR :Poduzetnik
@@ -616,8 +616,8 @@
STR_0219_TYCOON_OF_THE_CENTURY :Tajkun stoljeća
STR_HIGHSCORE_NAME :{BIGFONT}{PLAYERNAME}, {COMPANY}
STR_HIGHSCORE_STATS :{BIGFONT}'{STRING}' ({COMMA})
-STR_021B_ACHIEVES_STATUS :{BLACK}{BIGFONT}{COMPANY} postigao je status '{STRING}' !
-STR_021C_OF_ACHIEVES_STATUS :{WHITE}{BIGFONT}{PLAYERNAME} iz {COMPANY} postigao je status '{STRING}' !
+STR_021B_ACHIEVES_STATUS :{BLACK}{BIGFONT}Tvrtka {COMPANY} postigla je status '{STRING}' !
+STR_021C_OF_ACHIEVES_STATUS :{WHITE}{BIGFONT}{PLAYERNAME} iz tvrtke {COMPANY} postigao je status '{STRING}' !
STR_021F :{BLUE}{COMMA}
STR_0221_OPENTTD :{YELLOW}OpenTTD
STR_0222_SCENARIO_EDITOR :{YELLOW}Uređivanje scenarija
@@ -638,7 +638,7 @@
STR_0233_TOWN_GENERATION :{WHITE}Stvaranje gradova
STR_0234_NEW_TOWN :{BLACK}Novi grad
STR_0235_CONSTRUCT_NEW_TOWN :{BLACK}Izgradi novi grad
-STR_0236_CAN_T_BUILD_TOWN_HERE :{WHITE}Ovdje nije moguće graditi...
+STR_0236_CAN_T_BUILD_TOWN_HERE :{WHITE}Ovdje nije moguće izgraditi grad...
STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}...preblizu rubu karte
STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}...preblizu drugog grada
STR_0239_SITE_UNSUITABLE :{WHITE}...neprikladno mjesto
@@ -719,11 +719,11 @@
STR_0282_CONSTRUCT_BUBBLE_GENERATOR :{BLACK}Izgradi generator balona
STR_0283_CONSTRUCT_TOFFEE_QUARRY :{BLACK}Izgradi iskop miljeÄne karamele
STR_0284_CONSTRUCT_SUGAR_MINE :{BLACK}Izgradi rudnik šećera
-STR_0285_CAN_T_BUILD_HERE :{WHITE}Ne možeš graditi {STRING} ovdje...
-STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...moraš prvo izgraditi grad
+STR_0285_CAN_T_BUILD_HERE :{WHITE}Ovdje nije moguće izgraditi {STRING}...
+STR_0286_MUST_BUILD_TOWN_FIRST :{WHITE}...najprije moraš izgraditi grad
STR_0287_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}...dozvoljen samo jedan po gradu
STR_0288_PLANT_TREES :{BLACK}Posadi drveće
-STR_0289_PLACE_SIGN :{BLACK}Stavi znak
+STR_0289_PLACE_SIGN :{BLACK}Postavi znak
STR_028A_RANDOM_TREES :{BLACK}NasumiÄno odabrano drveće
STR_028B_PLANT_TREES_RANDOMLY_OVER :{BLACK}Nasumce posadi drveće po krajoliku
STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Stavi stijenje na krajolik
@@ -755,11 +755,11 @@
STR_02A2_MEDIUM :{BLACK}Srednje
STR_02A3_LARGE :{BLACK}Veliko
STR_SCENARIO_EDITOR_CITY :{BLACK}Grad
-STR_02A4_SELECT_TOWN_SIZE :{BLACK}Izaberi veliÄinu grada
+STR_02A4_SELECT_TOWN_SIZE :{BLACK}Odaberi veliÄinu grada
STR_02A5_TOWN_SIZE :{YELLOW}VeliÄina grada:
STR_02B6 :{STRING} - {STRING}
-STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS :{BLACK}Prikaži posljednu poruku ili vijest
+STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS :{BLACK}Pokaži zadnju poruku ili vijest
STR_OFF :IskljuÄeno
STR_SUMMARY :Sažetak
STR_FULL :Puno
@@ -770,7 +770,7 @@
STR_02BE_DEFAULT :Zadano
STR_02BF_CUSTOM :Proizvoljno
STR_02C0_SAVE_CUSTOM_NAMES :{BLACK}Spremi proizvoljna imena
-STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION :{BLACK}Odabir imena dizajna vozila
+STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION :{BLACK}Izbor imena dizajna vozila
STR_02C2_SAVE_CUSTOMIZED_VEHICLE :{BLACK}Spremi proizvoljna imena dizajna vozila
STR_CHECKMARK :{CHECKMARK}
@@ -779,7 +779,7 @@
STR_02C5_DIFFICULTY_SETTINGS :Postavke težine
STR_02C7_CONFIG_PATCHES :Konfiguriraj zakrpe
STR_NEWGRF_SETTINGS :Postavke NewGRF-a
-STR_TRANSPARENCY_OPTIONS :Opcije prozirnosti
+STR_TRANSPARENCY_OPTIONS :Postavke prozirnosti
STR_GAMEOPTMENU_0A :
STR_02CA_TOWN_NAMES_DISPLAYED :{SETX 12}Prikaži imena gradova
STR_02CC_STATION_NAMES_DISPLAYED :{SETX 12}Prikaži imena stanica
@@ -817,18 +817,18 @@
STR_02E0_CURRENCY_UNITS :{BLACK}NovÄane jedinice
STR_02E1 :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}Odabir novÄanih jedinica
+STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}Izbor novÄanih jedinica
STR_MEASURING_UNITS :{BLACK}Mjerni sustav
STR_02E4 :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION :{BLACK}Odabir mjernog sustava
+STR_MEASURING_UNITS_SELECTION :{BLACK}Izbor mjernog sustava
STR_02E6_ROAD_VEHICLES :{BLACK}Cestovna vozila
STR_02E7 :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Izaberi na kojoj će strani ceste vozila prometovati
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Odaberi na kojoj će strani ceste vozila prometovati
STR_02E9_DRIVE_ON_LEFT :Vozi na lijevoj strani
STR_02EA_DRIVE_ON_RIGHT :Vozi na desnoj strani
STR_02EB_TOWN_NAMES :{BLACK}Imena gradova
STR_02EC :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02ED_SELECT_STYLE_OF_TOWN_NAMES :{BLACK}Izaberi stil za imena gradova
+STR_02ED_SELECT_STYLE_OF_TOWN_NAMES :{BLACK}Odaberi stil za imena gradova
STR_02F4_AUTOSAVE :{BLACK}Automatsko spremanje
STR_02F5 :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -843,13 +843,13 @@
STR_02FF_SELECT_SINGLE_PLAYER_GAME :{BLACK}Odaberi igru za jednog igraÄa
STR_0300_SELECT_MULTIPLAYER_GAME :{BLACK}Odaberi igru za 2-8 igraÄa
STR_0301_DISPLAY_GAME_OPTIONS :{BLACK}Prikaži postavke igre
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS :{BLACK}Prikaži opcije težine
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS :{BLACK}Prikaži postavke težine
STR_0303_START_A_NEW_GAME_USING :{BLACK}ZapoÄni novu igru koristeći proizvoljni scenarij
STR_0304_QUIT :{BLACK}Završi
STR_0305_QUIT_OPENTTD :{BLACK}Završi 'OpenTTD'
STR_0307_OPENTTD :{WHITE}OpenTTD {REV}
STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...može biti izgrađen samo u gradovima
-STR_030E_SELECT_TEMPERATE_LANDSCAPE :{BLACK}Odaberi 'umjeren' stil krajolika
+STR_030E_SELECT_TEMPERATE_LANDSCAPE :{BLACK}Odaberi 'blag' stil krajolika
STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE :{BLACK}Odaberi 'subarktiÄki' stil krajolika
STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE :{BLACK}Odaberi 'subtropski' stil krajolika
STR_0311_SELECT_TOYLAND_LANDSCAPE :{BLACK}Odaberi 'zemlju igraÄka' za stil krajolika
@@ -874,7 +874,7 @@
STR_032F_AUTOSAVE :{RED}AUTOMATSKO SPREMANJE
STR_SAVING_GAME :{RED}* * SPREMAM IGRU * *
STR_SAVE_STILL_IN_PROGRESS :{WHITE}Spremanje joÅ¡ u tijeku,{}molimo priÄekajte dok se ne zavrÅ¡i!
-STR_0330_SELECT_EZY_STREET_STYLE :{BLACK}Izaberi glazbeni program 'Ezy Street style'
+STR_0330_SELECT_EZY_STREET_STYLE :{BLACK}Odaberi glazbeni program 'Ezy Street style'
STR_0335_6 :{BLACK}6
STR_0336_7 :{BLACK}7
@@ -942,7 +942,7 @@
STR_OPTIONS_RES :{BLACK}RazluÄivost ekrana
STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_RES_TIP :{BLACK}Izaberi rezoluciju ekrana
+STR_OPTIONS_RES_TIP :{BLACK}Izaberi razluÄivost ekrana
STR_OPTIONS_SCREENSHOT_FORMAT :{BLACK}Format za sliku ekrana
STR_OPTIONS_SCREENSHOT_FORMAT_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -966,8 +966,8 @@
STR_HEADING_FOR_STATION :{LTBLUE}Kreće se prema {STATION}
STR_HEADING_FOR_STATION_VEL :{LTBLUE}Kreće se prema {STATION}, {VELOCITY}
-STR_NO_ORDERS :{LTBLUE}Nema narudžbi
-STR_NO_ORDERS_VEL :{LTBLUE}Nema narudžbi, {VELOCITY}
+STR_NO_ORDERS :{LTBLUE}Nema naredbi
+STR_NO_ORDERS_VEL :{LTBLUE}Nema naredbi, {VELOCITY}
STR_PASSENGERS :putnici
STR_BAGS :vreće
@@ -980,8 +980,8 @@
STR_SMALL_RIGHT_ARROW :{TINYFONT}{RIGHTARROW}
-STR_CANT_SHARE_ORDER_LIST :{WHITE}Nije moguće dijeliti rednu listu...
-STR_CANT_COPY_ORDER_LIST :{WHITE}Nije moguće kopirati rednu listu...
+STR_CANT_SHARE_ORDER_LIST :{WHITE}Nije moguće dijeliti popis naredbi...
+STR_CANT_COPY_ORDER_LIST :{WHITE}Nije moguće kopirati popis naredbi...
STR_END_OF_SHARED_ORDERS :{SETX 10}- - Kraj dijeljenih naredbi - -
STR_TRAIN_IS_LOST :{WHITE}Vlak {COMMA} se izgubio.
@@ -990,9 +990,9 @@
# Start of order review system.
# DON'T ADD OR REMOVE LINES HERE
-STR_TRAIN_HAS_TOO_FEW_ORDERS :{WHITE} Vlak {COMMA} ima premalo naredbi u rasporedu
+STR_TRAIN_HAS_TOO_FEW_ORDERS :{WHITE}Vlak {COMMA} ima premalo naredbi u rasporedu
STR_TRAIN_HAS_VOID_ORDER :{WHITE}Vlak {COMMA} ima praznu naredbu
-STR_TRAIN_HAS_DUPLICATE_ENTRY :{WHITE}Vlak {COMMA} ima udvostuÄenu naredbu
+STR_TRAIN_HAS_DUPLICATE_ENTRY :{WHITE}Vlak {COMMA} ima dvostruku naredbu
STR_TRAIN_HAS_INVALID_ENTRY :{WHITE}Vlak {COMMA} ima nevažeću stanicu u voznom redu
STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}Cestovno vozilo {COMMA} ima premalo naredbi u rasporedu
STR_ROADVEHICLE_HAS_VOID_ORDER :{WHITE}Cestovno vozilo {COMMA} ima praznu naredbu
@@ -1015,148 +1015,161 @@
STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}Nakon zamjene, vlak {COMMA} je postao predug
STR_CONFIG_PATCHES :{BLACK}Konfiguriraj zakrpe
-STR_CONFIG_PATCHES_TIP :{BLACK}Podesi zakrpe
-STR_CONFIG_PATCHES_CAPTION :{WHITE}Podesi zakrpe
+STR_CONFIG_PATCHES_TIP :{BLACK}Konfiguriraj zakrpe
+STR_CONFIG_PATCHES_CAPTION :{WHITE}Konfiguriraj zakrpe
STR_CONFIG_PATCHES_OFF :IskljuÄeno
STR_CONFIG_PATCHES_ON :UkljuÄeno
-STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Prikaži brzinu vozila u statusnoj traci: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Dozvoli gradnju na nagibima i obalama: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Dozvoli realistiÄnije veliÄine podruÄja zahvaćanja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Pokaži brzinu vozila u statusnoj traci: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Dopusti izgradnju na kosinama i obalama: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Dopusti modeliranje zemlje ispod graÄ‘evina, traÄnica, itd (autonagib): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Dopusti realistiÄnije veliÄine podruÄja zahvaćanja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Dopusti rušenje više gradskih cesta, mostova itd.: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Omogući sastavljanje vrlo dugaÄkih vlakova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REALISTICACCEL :{LTBLUE}Omogući realno ubrzanje za vlakove: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REALISTICACCEL :{LTBLUE}Omogući realistiÄno ubrzanje za vlakove: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FORBID_90_DEG :{LTBLUE}Zabrani vlakovima i brodovima skretanja pod 90 stupnjeva: {ORANGE}{STRING} {LTBLUE} (requires NPF)
-STR_CONFIG_PATCHES_JOINSTATIONS :{LTBLUE}Spoji željezniÄke stanice koje se izgrade jedna kraj druge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_JOINSTATIONS :{LTBLUE}Spoji željezniÄke stanice koje se izgrade jedna pokraj druge: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FULLLOADANY :{LTBLUE}Napusti stanicu ako je bilo koji teret u potpunosti natovaren pri 'punom utovaru': {ORANGE}{STRING}
-STR_CONFIG_PATCHES_IMPROVEDLOAD :{LTBLUE}Koristi unaprijeđen algoritam ukrcavanja: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GRADUAL_LOADING :{LTBLUE}Postupno utovaruj vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_IMPROVEDLOAD :{LTBLUE}Koristi unaprijeđen utovarni algoritam: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GRADUAL_LOADING :{LTBLUE}Postupno utovaruj u vozila: {ORANGE}{STRING}
STR_CONFIG_PATCHES_INFLATION :{LTBLUE}Inflacija: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Dostavi teret u stanicu samo ako u njoj postoji potražnja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Dostavi teret u stanicu samo ako na njoj postoji potražnja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGBRIDGES :{LTBLUE}Dopusti izgradnju vrlo dugaÄkih mostova: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GOTODEPOT :{LTBLUE}Dopusti naredbe za slanje u spremište: {ORANGE}{STRING}
STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}RuÄna metoda izgradnje primarne industrije: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :ništa
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :nijedna
STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :kao i druge industrije
-STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prosperirajuće
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :prosperirajuća
STR_CONFIG_PATCHES_MULTIPINDTOWN :{LTBLUE}Dopusti viÅ¡e sliÄnih industrija po gradu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SAMEINDCLOSE :{LTBLUE}Moguće je graditi spojene industrije iste vrste: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Uvijek prikaži dugi datum u statusnoj traci: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE :{LTBLUE}Prikaži znakove na strani po kojoj se vozi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SHOWFINANCES :{LTBLUE}Prikaži financijski prozor na kraju godine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTDPatch kompatibilno nonstop rukovanje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Nizanje cestovnih vozila(sa kvantum efektima): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}PomiÄi prozor kada je miÅ¡ na rubu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Dozvoli potkupljivanje gradskih vlasti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SAMEINDCLOSE :{LTBLUE}Industrije iste vrste mogu biti izgrađene u blizini jedna druge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Uvijek pokaži dugi datum u statusnoj traci: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE :{LTBLUE}Pokaži signale na vozaÄkoj strani: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SHOWFINANCES :{LTBLUE}Pokaži financijski prozor na kraju godine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP :{LTBLUE}TTDPatch kompatibilno neprekidno upravljanje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Nizanje cestovnih vozila (s kvantnim uÄincima): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Pomakni prozor kada je miš na rubu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Dopusti potkupljivanje lokalne samouprave: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}NeujednaÄene stanice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Novo globalno pronalaženje puteva (NPF, iskljuÄuje NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Težinski množitelj za teret za simulaciju teških vlakova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Dozvoli drive-through cestovne prepreke na cestama pod vlašću grada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Dozvoli izradu spojenih stanica: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Dopusti prolazne stanice na cestama u vlasti grada: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Dopusti izgradnju pridruženih stanica: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Uvjek omogući male zraÄne luke: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Uvijek dopusti male zraÄne luke: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Upozori kad se vlak izgubi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW :{LTBLUE}Pogledaj naređenja vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Upozori ako se vlak izgubio: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW :{LTBLUE}Pregledaj naredbe vozila: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ORDER_REVIEW_OFF :ne
-STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT :da, no iskljuÄi zaustavljena vozila
+STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT :da, ali iskljuÄi zaustavljena vozila
STR_CONFIG_PATCHES_ORDER_REVIEW_ON :od svih vozila
STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Upozori ako je prihod vlaka negativan: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Vozila ne zastaruju: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Vozila ne zastarjevaju: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Automatski zamijeni vozilo kada postane staro
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Automatski obnovi vozilo kada je {ORANGE}{STRING}{LTBLUE} mjeseci prije/poslije maksimalnog godišta
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Automatski obnovi vozilo {ORANGE}{STRING}{LTBLUE} mjeseci prije/poslije maksimalnog godišta
STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Minimum novca potrebnih za automatsko obnavljanje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Trajanje poruke s greškom: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL :{LTBLUE}Prikaži broj stanovnika u traci sa imenom grada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES :{LTBLUE}Nevidljivo drveće (sa prozirnim građevinama): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_POPULATION_IN_LABEL :{LTBLUE}Pokaži broj stanovnika u oznaci imena grada: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INVISIBLE_TREES :{LTBLUE}Nevidljivo drveće (s prozirnim građevinama): {ORANGE}{STRING}
STR_CONFIG_PATCHES_LAND_GENERATOR :{LTBLUE}Generator zemlje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL :Izvorno
+STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL :Izvorni
STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE :{LTBLUE}Maksimalna udaljenost Rafinerija nafte od ruba {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE :{LTBLUE}Maksimalna udaljenost naftnih rafinerija od ruba {ORANGE}{STRING}
STR_CONFIG_PATCHES_SNOWLINE_HEIGHT :{LTBLUE}Visina linije snijega: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN :{LTBLUE}Grubost terena (samo TerraGenesis) : {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Vrlo glatko
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH :Glatko
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH :Grubo
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Vrlo grubo
-STR_CONFIG_PATCHES_TREE_PLACER :{LTBLUE}Algoritam postavljanja drveća: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TREE_PLACER :{LTBLUE}Algoritam za sađenje drveća: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TREE_PLACER_NONE :Nijedan
-STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL :Izvorno
-STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED :Unaprijeđeno
+STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL :Izvorni
+STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED :Unaprijeđen
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION :{LTBLUE}Rotacija visinske mape: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Obrnuto smjeru kazaljke na satu
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Obrnuto od smjera kazaljke na satu
STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE :U smjeru kazaljke na satu
STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT :{LTBLUE}Visinski nivo koji ravna mapa u scenariju dobiva: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Maksimalna raširenost stanice: {ORANGE}{STRING} {RED}Pozor: Visoka vrijednost usporuje igru
STR_CONFIG_PATCHES_SERVICEATHELIPAD :{LTBLUE}Automatski servisiraj helikoptere na heliodromima: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Poveži alatnu traku za krajolik sa alatnim trakama za željeznicu/ceste/vodu/zraÄne luke: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING :{LTBLUE}Okreni smjer pomicanja: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SMOOTH_SCROLLING :{LTBLUE}Glatko skrolanje kroz mini pogled: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Pokaži mjerni opis kod korištenja raznih alata za izgradnju: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES :{LTBLUE}Pokaži tvrtkine livreje: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES_NONE :Ništa
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Poveži alatnu traku za krajolik s alatnim trakama za željeznicu/ceste/vodu/zraÄne luke: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING :{LTBLUE}Promijeni smjer klizanja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING :{LTBLUE}Glatko klizanje kroz mini pogled: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Pokaži mjerni opis prilikom korištenja raznih alata za izgradnju: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES :{LTBLUE}Pokaži tvrtkine boje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES_NONE :Nijedna
STR_CONFIG_PATCHES_LIVERIES_OWN :Vlastita tvrtka
STR_CONFIG_PATCHES_LIVERIES_ALL :Sve tvrtke
-STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Preferiraj timski chat sa <ENTER>:{ORANGE}{STRING}
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Funkcija kotaÄića: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Preferiraj ekipni razgovor s <ENTER>:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Funkcija kotaÄića za klizanje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM :Zumiraj kartu
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Skrolaj kartom
-STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :IskljuÄeno
-STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Brzina kotaÄića za skrolanje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Kliži kartom
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :IskljuÄen
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Brzina kotaÄića za klizanje: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulacija desnog klika mišem: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :IskljuÄeno
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatski pauziraj prilikom pokretanja nove igre: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Koristi naprednu listu vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Koristi napredni popis vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :IskljuÄeno
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Vlastita tvrtka
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Sve tvrtke
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Koristi indikatore utovara: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}UkljuÄi raspored za vozila: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Pokaži raspored u otkucajima radije nego u danima: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Zadana vrsta traÄnica (poslije nove igre/podizanja igre): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Normalne traÄnice
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Elektrificirane traÄnice
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :Monopruga
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :IskljuÄeno
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Vlastita tvrtka
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Sve tvrtke
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Omogući red vožnje za vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Pokaži raspored u otkucajima rađe nego u danima: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Inicijalna vrsta pruge (poslije nove igre/podizanja igre): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Normalna pruga
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Elektrificirana pruga
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :JednotraÄna pruga
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV :Maglev
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST :Prvi dostupan
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST :Zadnji dostupan
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED :NajÄešće koriÅ¡ten
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST :Prva dostupna
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST :Zadnja dostupna
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED :NajÄešće koriÅ¡tena
-STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE :{LTBLUE}Prikaži alate za građanje kada su prikladna vozila nedostupna: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE :{LTBLUE}Pokaži alate za izgradnju kada su odgovarajuća vozila nedostupna: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Maksimalan broj vlakova po igraÄu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Maximalan broj cestovnih vozila po igraÄu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Maksimalan broj cestovnih vozila po igraÄu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_AIRCRAFT :{LTBLUE}Maksimalan broj zrakoplova po igraÄu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_SHIPS :{LTBLUE}Maximalan broj brodova po igraÄu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_SHIPS :{LTBLUE}Maksimalan broj brodova po igraÄu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_BUILDS_TRAINS :{LTBLUE}IskljuÄi vlakove za raÄunalo: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH :{LTBLUE}IskljuÄi cestovna vozila za raÄunalo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT :{LTBLUE}IskljuÄi zrakoplov za raÄunalo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_SHIPS :{LTBLUE}IskljuÄi cestovna vozila za raÄunalo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT :{LTBLUE}IskljuÄi zrakoplove za raÄunalo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_SHIPS :{LTBLUE}IskljuÄi brodove za raÄunalo: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}Omogući novi AI (alfa): {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER :{LTBLUE}Omogući AI u modu s viÅ¡e igraÄa (eksperimentalno): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Pretpostavljeni period servisiranja vlakova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}Pretpostavljeni period servisiranja vlakova: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Pretpostavljeni period servisiranja cestovnih vozila: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Pretpostavljeni period servisiranja cestovnih vozila: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Pretpostavljeni period servisiranja zrakoplova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Pretpostavljeni period servisiranja aviona: {ORANGE}onemogućeno
-STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Pretpostavljeni period servisiranja brodova: {ORANGE}{STRING} dana/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Pretpostavljeni period servisiranja brodova: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Inicijalni servisni period za vlakove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}Inicijalni servisni period za vlakove: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Inicijalni servisni interval za cestovna vozila: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Inicijalni servisni interval za cestovna vozila: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Inicijalni servisni interval za zrakoplove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Inicijalni servisni interval za zrakoplove: {ORANGE}onemogućeno
+STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Inicijalni servisni interval za brodove: {ORANGE}{STRING} dana/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Inicijalni servisni interval za brodove: {ORANGE}onemogućeno
STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}IskljuÄi servisiranje kada su kvarovi postavljeni na nula: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}UkljuÄi ograniÄenje brzine za vagone: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}Onemogući elektriÄne traÄnice: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}Omogući ograniÄenje brzine za vagone: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}Onemogući elektriÄnu prugu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Vijesti u boji pojavljuju se: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}PoÄetna godina: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ENDING_YEAR :{LTBLUE}Završna godina: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}UkljuÄi teÄnu ekonomiju (viÅ¡e manjih izazova)
-STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Dopusti kupovanje udjela drugih tvrtki
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Kod povlaÄenja, postavi signale svakih/svaku; {ORANGE}{STRING}ploÄica/u
+STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Dopusti kupovanje udjela u drugim tvrtkama
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Kod povlaÄenja, postavi signale svakih; {ORANGE}{STRING} ploÄica
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Automatski izgradi semafore prije: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Izgled grada "bezviše cesta" nije valjan u editoru scenarija
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Raspored grada "nema više cesta" nije valjan u editoru scenarija
STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Odaberi grad-cesta raspored: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS :nema više cesta
-STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :zadano
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :inicijalno
STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS :bolje ceste
STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID :2x2 mreža
STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID :3x3 mreža
@@ -1165,16 +1178,16 @@
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Lijevo
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Sredina
STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT :Desno
-STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}Radijus hvatanja prozora: {ORANGE}{STRING} px
+STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}Radijus hvatanja prozora: {ORANGE}{STRING} px
STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED :{LTBLUE}Radijus hvatanja prozora: {ORANGE}iskljuÄen
STR_CONFIG_PATCHES_TOWN_GROWTH :{LTBLUE}Brzina rasta gradova: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TOWN_GROWTH_NONE :Ništa
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE :Nema
STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW :Sporo
STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL :Normalno
STR_CONFIG_PATCHES_TOWN_GROWTH_FAST :Brzo
STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST :Vrlo brzo
-STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Proporcije mjesta koja će postati gradovi: {ORANGE}1 u {STRING}
-STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Proporcije mjesta koja će postati gradovi: {ORANGE} Ništa
+STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Omjer gradova koji će postati metropole: {ORANGE}1 u {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Omjer gradova koji će postati metropole: {ORANGE}Nijedan
STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}PoÄetni množitelj veliÄine grada: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GUI :{BLACK}SuÄelje
@@ -1182,19 +1195,19 @@
STR_CONFIG_PATCHES_VEHICLES :{BLACK}Vozila
STR_CONFIG_PATCHES_STATIONS :{BLACK}Stanice
STR_CONFIG_PATCHES_ECONOMY :{BLACK}Ekonomija
-STR_CONFIG_PATCHES_AI :{BLACK}Konkurenti
+STR_CONFIG_PATCHES_AI :{BLACK}Suparnici
STR_CONFIG_PATCHES_DISABLED :onemogućeno
STR_CONFIG_PATCHES_INT32 :{NUM}
STR_CONFIG_PATCHES_CURRENCY :{CURRENCY}
-STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Promjeni vrijednost postavke
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Neki ili svi od zadanih servisnih intervala ispod nisu kompatibilni sa odabranim postavkama! 5-90% ili 30-800 dana su valjane vrijednosti
+STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Promijeni vrijednost postavke
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Neki ili svi od zadanih servisnih intervala ispod nisu kompatibilni s odabranim postavkama! Valjane vrijednosti su 5-90% ili 30-800 dana.
STR_CONFIG_PATCHES_YAPF_SHIPS :{LTBLUE}Koristi YAPF za brodove: {ORANGE}{STRING}
STR_CONFIG_PATCHES_YAPF_ROAD :{LTBLUE}Koristi YAPF za cestovna vozila: {ORANGE}{STRING}
STR_CONFIG_PATCHES_YAPF_RAIL :{LTBLUE}Koristi YAPF za vlakove: {ORANGE}{STRING}
-STR_TEMPERATE_LANDSCAPE :Umjereni krajolik
+STR_TEMPERATE_LANDSCAPE :Blagi krajolik
STR_SUB_ARCTIC_LANDSCAPE :Pod-arktiÄki krajolik
STR_SUB_TROPICAL_LANDSCAPE :Sub-tropski krajolik
STR_TOYLAND_LANDSCAPE :Toyland krajolik
@@ -1216,9 +1229,9 @@
STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Ide prema {WAYPOINT}, {VELOCITY}
STR_GO_TO_WAYPOINT :Idi preko {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT :Idi non-stop preko {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT :Idi neprekidno preko {WAYPOINT}
-STR_WAYPOINTNAME_CITY : Čvorište{TOWN}
+STR_WAYPOINTNAME_CITY :Čvorište {TOWN}
STR_WAYPOINTNAME_CITY_SERIAL :Čvorište {TOWN} #{COMMA}
STR_LANDINFO_WAYPOINT :Čvorište
@@ -1230,12 +1243,12 @@
STR_WAYPOINT_RAW :{WAYPOINT}
STR_EDIT_WAYPOINT_NAME :{WHITE}Promijeni ime ÄvoriÅ¡ta
-STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}Ne možeÅ¡ promijeniti ime ÄvoriÅ¡ta...
-STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}Promijeni traÄnicu u ÄvoriÅ¡te
-STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}Ne možeÅ¡ izgraditi željezniÄko ÄvoriÅ¡te ovdje...
-STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}Ne možeÅ¡ ukloniti željezniÄko ÄvoriÅ¡te odavdje...
+STR_CANT_CHANGE_WAYPOINT_NAME :{WHITE}Nije moguće promijeniti ime ÄvoriÅ¡ta...
+STR_CONVERT_RAIL_TO_WAYPOINT_TIP :{BLACK}Pretvori prugu u ÄvoriÅ¡te
+STR_CANT_BUILD_TRAIN_WAYPOINT :{WHITE}Ovdje nije moguće izgraditi željezniÄko ÄvoriÅ¡te...
+STR_CANT_REMOVE_TRAIN_WAYPOINT :{WHITE}Nije moguće ukloniti željezniÄko ÄvoriÅ¡te odavdje...
-STR_BUILD_AUTORAIL_TIP :{BLACK}Izgradi željezniÄku traÄnicu koristeći Autorail modus
+STR_BUILD_AUTORAIL_TIP :{BLACK}Izgradi željezniÄku prugu koristeći Autorail naÄin
STR_NO_TOWN_IN_SCENARIO :{WHITE}...u ovom scenariju nema gradova
@@ -1244,7 +1257,7 @@
STR_RANDOM_TOWNS_TIP :{BLACK}Popuni kartu nasumce smještenim gradovima
STR_MANY_RANDOM_INDUSTRIES :Mnoge nasumiÄne industrije
STR_RANDOM_INDUSTRIES_TIP :{BLACK}Popuni kartu nasumce smještenim industrijama
-STR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Ne možeš generirati gospodarstva...
+STR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Nije moguće generirati industrije...
STR_LANDSCAPING_TOOLBAR_TIP :{BLACK}Otvori alatnu traku za snižavanje/povećavanje, sadnju drveća, itd.
STR_LANDSCAPING_TOOLBAR :{WHITE}Uređivanje krajolika
@@ -1252,13 +1265,13 @@
STR_TREES_RANDOM_TYPE :{BLACK}Raznovrsno drveće
-STR_TREES_RANDOM_TYPE_TIP :{BLACK}Stavi drveće nasumiÄnog tipa
+STR_TREES_RANDOM_TYPE_TIP :{BLACK}Posadi raznovrsno drveće
-STR_CANT_BUILD_CANALS :{WHITE}Ovdje ne možeš graditi kanale...
+STR_CANT_BUILD_CANALS :{WHITE}Ovdje nije moguće izgraditi kanale...
STR_BUILD_CANALS_TIP :{BLACK}Izgradi kanale.
STR_LANDINFO_CANAL :Kanal
-STR_CANT_BUILD_LOCKS :{WHITE}Ne mogu graditi brane ovdje...
+STR_CANT_BUILD_LOCKS :{WHITE}Ovdje nije moguće izgraditi brane...
STR_BUILD_LOCKS_TIP :{BLACK}Izgradi brane
STR_LANDINFO_LOCK :Brana
@@ -1266,16 +1279,16 @@
STR_LANDINFO_COORDS :{BLACK}Koordinate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
-STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Ne možeš ukloniti dio stanice...
-STR_CANT_CONVERT_RAIL :{WHITE}Ne možeÅ¡ pretvoriti vrstu traÄnica ovdje...
-STR_CONVERT_RAIL_TIP :{BLACK}Konvertiraj/Nadogradi vrstu traÄnica
+STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Nije moguće ukloniti dio stanice...
+STR_CANT_CONVERT_RAIL :{WHITE}Ovdje nije moguće pretvoriti vrstu pruge...
+STR_CONVERT_RAIL_TIP :{BLACK}Pretvori/nadogradi vrstu pruge
-STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP :{BLACK}Povucite lokomotivu na ovo mjesto da bi prodaoli cijeli vlak
+STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP :{BLACK}Ovdje povuci lokomotivu kako bi prodao cijeli vlak
STR_DRAG_DROP :{BLACK}Povuci i spusti
STR_STATION_DRAG_DROP :{BLACK}Napravi stanicu koristeći drag & drop
-STR_SELECT_STATION_CLASS_TIP :{BLACK}Odaberite vrstu stanice koju želite vidjeti
-STR_SELECT_STATION_TYPE_TIP :{BLACK}Izaberite vrstu stanice za izgradnju
+STR_SELECT_STATION_CLASS_TIP :{BLACK}Odaberi vrstu stanice za prikazivanje
+STR_SELECT_STATION_TYPE_TIP :{BLACK}Odaberi vrstu stanice za izgradnju
STR_FAST_FORWARD :{BLACK}Premotaj igru naprijed
STR_MESSAGE_HISTORY :{WHITE}Povijest poruka
@@ -1310,24 +1323,24 @@
STR_INDUSTRY_TOO_CLOSE :{WHITE}...preblizu drugoj industriji
-STR_RAIL_REFIT_VEHICLE_TO_CARRY :{BLACK}Prepravi vlak kako bi nosio drugu vrstu tereta
-STR_RAIL_REFIT_VEHICLE :{BLACK}Prepravi vlak
-STR_RAIL_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Izaberi vrstu tereta koju će vlak nositi
-STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED :{BLACK}Prepravi vlak kako bi nosio oznaÄenu vrstu tereta
-STR_RAIL_CAN_T_REFIT_VEHICLE :{WHITE}Ne možeš prepraviti vlak...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Servisni intervali u postotcima: {ORANGE}{STRING}
+STR_RAIL_REFIT_VEHICLE_TO_CARRY :{BLACK}Prenamijeni vlak za prijevoz neke druge vrste tereta
+STR_RAIL_REFIT_VEHICLE :{BLACK}Prenamijeni vlak
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Odaberi vrstu tereta koju će vlak prevoziti
+STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED :{BLACK}Prenamijeni vlak za prijevoz oznaÄene vrste tereta
+STR_RAIL_CAN_T_REFIT_VEHICLE :{WHITE}Nije moguće prenamijeniti vlak...
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Servisni su intervali u postotcima: {ORANGE}{STRING}
STR_CONFIG_GAME_PRODUCTION :{WHITE}Promijeni proizvodnju
TEMP_AI_IN_PROGRESS :{WHITE}Dobrodošli u novi AI pod razvojem. Ukoliko naiđete na probleme, napravite sliku ekrana i stavite ju na forum.
-TEMP_AI_ACTIVATED :{WHITE}Upozorenje: ovaj novi AI je još uvijek alfa! Trenutno, samo kamioni i autobusi rade!
-TEMP_AI_MULTIPLAYER :{WHITE}Upozorenje: implementacije je još uvijek pokusna (koristeći novi AI). Molimo prijavite bilo kakav problem na truelight@openttd.org
+TEMP_AI_ACTIVATED :{WHITE}Upozorenje: ovaj novi AI još uvijek je alfa! Trenutno, samo kamioni i autobusi rade!
+TEMP_AI_MULTIPLAYER :{WHITE}Upozorenje: implementacija je još uvijek pokusna (koristi novi AI). Molimo prijavite bilo kakav problem na truelight@openttd.org
############ network gui strings
STR_NETWORK_MULTIPLAYER :{WHITE}ViÅ¡e igraÄa
STR_NETWORK_PLAYER_NAME :{BLACK}Ime igraÄa:
-STR_NETWORK_ENTER_NAME_TIP :{BLACK}Ovo je ime po kojem će te drugi igraÄi identificirati
+STR_NETWORK_ENTER_NAME_TIP :{BLACK}Ovo je ime po kojem će te drugi igraÄi raspoznavati
STR_NETWORK_CONNECTION :{BLACK}Veza:
STR_NETWORK_CONNECTION_TIP :{BLACK}Izaberi između internetske igre ili igre preko lokalne mreže (LAN)
@@ -1337,7 +1350,7 @@
STR_NETWORK_GAME_NAME :{BLACK}Ime
STR_NETWORK_GAME_NAME_TIP :{BLACK}Ime igre
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Jezik, verzija poslužitelja, itd.
-STR_NETWORK_CLICK_GAME_TO_SELECT :{BLACK}Klikni na igru s liste kako bi ju izabrao
+STR_NETWORK_CLICK_GAME_TO_SELECT :{BLACK}Klikni na igru s popisa kako bi ju odabrao
STR_NETWORK_FIND_SERVER :{BLACK}Pronađi poslužitelj
STR_NETWORK_FIND_SERVER_TIP :{BLACK}Pronađi poslužitelje u mreži
@@ -1347,7 +1360,7 @@
STR_NETWORK_GENERAL_ONLINE :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
STR_NETWORK_CLIENTS_CAPTION :{BLACK}Klijenti
-STR_NETWORK_CLIENTS_CAPTION_TIP :{BLACK}Klijenata online / klijenata maks{}Tvrki online / tvrki maks
+STR_NETWORK_CLIENTS_CAPTION_TIP :{BLACK}Klijenata online / klijenata maks{}Tvrtki online / tvrki maks.
STR_NETWORK_GAME_INFO :{SILVER}INFO O IGRI
STR_ORANGE :{ORANGE}{STRING}
STR_NETWORK_CLIENTS :{SILVER}Klijenti: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
@@ -1362,7 +1375,7 @@
STR_NETWORK_SERVER_OFFLINE :{SILVER}POSLUŽITELJ NEDOSTUPAN
STR_NETWORK_SERVER_FULL :{SILVER}POSLUŽITELJ PUN
STR_NETWORK_VERSION_MISMATCH :{SILVER}RAZLIKA U VERZIJAMA
-STR_NETWORK_GRF_MISMATCH :{SILVER}NEWGRF GREÅ KA
+STR_NETWORK_GRF_MISMATCH :{SILVER}NEWGRF RAZLIKA
STR_NETWORK_JOIN_GAME :{BLACK}Pridruži se igri
@@ -1373,7 +1386,7 @@
STR_NETWORK_NEW_GAME_NAME_TIP :{BLACK}Ime igre bit će prikazno drugim igraÄima u izborniku za odabir igre s viÅ¡e igraÄa
STR_NETWORK_SET_PASSWORD :{BLACK}Postavi zaporku
STR_NETWORK_PASSWORD_TIP :{BLACK}Zaštiti svoju igru pomoću zaporke ukoliko ne želiš da bude javno dostupna
-STR_NETWORK_SELECT_MAP :{BLACK}Izaberi kartu:
+STR_NETWORK_SELECT_MAP :{BLACK}Odaberi kartu:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Koju kartu želiš igrati?
STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
@@ -1384,7 +1397,7 @@
STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maks klijenata:
STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Izaberi maksimalan broj klijenata. Ne moraju sva mjesta biti popunjena.
STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} tvrtk{P a e i}
-STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Maks tvrki:
+STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Maks tvrtki:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}OgraniÄi poslužitelj na odreÄ‘eni broj tvrtki
STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} gledatelj{P "" a a}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Maks promatraÄa:
@@ -1393,9 +1406,9 @@
STR_NETWORK_LANGUAGE_TIP :{BLACK}Drugi igraÄi znat će kojim se jezikom govori na poslužitelju
STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}ZapoÄni igru
-STR_NETWORK_START_GAME_TIP :{BLACK}ZapoÄni novu igru u mreži na nasumiÄnoj mapi ili iz nasumiÄnog scenarija
+STR_NETWORK_START_GAME_TIP :{BLACK}ZapoÄni novu igru u mreži na nasumiÄnoj mapi ili iz scenarija
STR_NETWORK_LOAD_GAME :{BLACK}UÄitaj igru
-STR_NETWORK_LOAD_GAME_TIP :{BLACK}Nastavi snimljenu igru za viÅ¡e igraÄa (pazite da se spojite pod svojim imenom)
+STR_NETWORK_LOAD_GAME_TIP :{BLACK}Nastavi ranije snimljenu igru za viÅ¡e igraÄa (pazite da se spojite pod svojim imenom)
############ Leave those lines in this order!!
STR_NETWORK_LANG_ANY :Bilo koji
@@ -1432,24 +1445,24 @@
STR_NETWORK_GAME_LOBBY :{WHITE}Predvorje igre za viÅ¡e igraÄa
STR_NETWORK_PREPARE_TO_JOIN :{BLACK}Pripremanje za pridruživanje: {ORANGE}{STRING}
-STR_NETWORK_COMPANY_LIST_TIP :{BLACK}Popis svih kompanija trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto
+STR_NETWORK_COMPANY_LIST_TIP :{BLACK}Popis svih tvrtki trenutno u igri. Možete se pridružiti jednoj ili osnovati novu ako postoji slobodno mjesto
STR_NETWORK_NEW_COMPANY :{BLACK}Nova tvrtka
STR_NETWORK_NEW_COMPANY_TIP :{BLACK}Otvori novu tvrtku
STR_NETWORK_SPECTATE_GAME :{BLACK}Gledaj igru
STR_NETWORK_SPECTATE_GAME_TIP :{BLACK}Promatraj igru kao gledatelj
STR_NETWORK_JOIN_COMPANY :{BLACK}Pridruži se tvrtki
-STR_NETWORK_JOIN_COMPANY_TIP :{BLACK}Pomogni upravljati ovom tvrtkom
-STR_NETWORK_REFRESH :{BLACK}Osvježi poslužitelja
+STR_NETWORK_JOIN_COMPANY_TIP :{BLACK}Pomozi upravljati ovom tvrtkom
+STR_NETWORK_REFRESH :{BLACK}Osvježi poslužitelj
STR_NETWORK_REFRESH_TIP :{BLACK}Osvježi podatke o poslužitelju
-STR_NETWORK_COMPANY_INFO :{SILVER}PODACI O TVRTKI
+STR_NETWORK_COMPANY_INFO :{SILVER}PODATCI O TVRTKI
STR_NETWORK_COMPANY_NAME :{SILVER}Ime tvrtke: {WHITE}{STRING}
-STR_NETWORK_INAUGURATION_YEAR :{SILVER}Preuzimanje dužnosti: {WHITE}{NUM}
+STR_NETWORK_INAUGURATION_YEAR :{SILVER}UstoliÄenje: {WHITE}{NUM}
STR_NETWORK_VALUE :{SILVER}Vrijednost tvrtke: {WHITE}{CURRENCY}
STR_NETWORK_CURRENT_BALANCE :{SILVER}Trenutno stanje: {WHITE}{CURRENCY}
STR_NETWORK_LAST_YEARS_INCOME :{SILVER}Prošlogodišnji prihod: {WHITE}{CURRENCY}
-STR_NETWORK_PERFORMANCE :{SILVER}Izvršavanje: {WHITE}{NUM}
+STR_NETWORK_PERFORMANCE :{SILVER}UÄinkovitost: {WHITE}{NUM}
STR_NETWORK_VEHICLES :{SILVER}Vozila: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
STR_NETWORK_STATIONS :{SILVER}Stanice: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
@@ -1458,7 +1471,7 @@
STR_NETWORK_CONNECTING :{WHITE}Spajanje...
############ Leave those lines in this order!!
-STR_NETWORK_CONNECTING_1 :{BLACK}(1/6) Spajanje u toku..
+STR_NETWORK_CONNECTING_1 :{BLACK}(1/6) Spajanje u tijeku..
STR_NETWORK_CONNECTING_2 :{BLACK}(2/6) Provjera ovlaštenja..
STR_NETWORK_CONNECTING_3 :{BLACK}(3/6) ÄŒekanje..
STR_NETWORK_CONNECTING_4 :{BLACK}(4/6) Preuzimanje karte..
@@ -1469,34 +1482,34 @@
STR_NETWORK_CONNECTING_SPECIAL_2 :{BLACK}Dohvaćanje podataka o tvrtki..
############ End of leave-in-this-order
STR_NETWORK_CONNECTING_WAITING :{BLACK}{NUM} klijen{P t ta ata} {P je su je} prije Vas
-STR_NETWORK_CONNECTING_DOWNLOADING :{BLACK} Do sad je preuzeto {NUM} / {NUM} kbajta
+STR_NETWORK_CONNECTING_DOWNLOADING :{BLACK} Do sad je preuzeto {NUM} / {NUM} kilobajta
STR_NETWORK_DISCONNECT :{BLACK}Odspoji
-STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Unesite koliÄinu novca koju želite dati
-STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Poslužitelj je zaštićen. Upišite zaporku
+STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Unesi koliÄinu novca koju želiÅ¡ dati
+STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Poslužitelj je zaštićen. Unesite zaporku
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Tvrtka je zaštićena. Unesite zaporku
STR_NETWORK_CLIENT_LIST :{WHITE}Popis klijenata
-STR_NETWORK_ERR_NOTAVAILABLE :{WHITE}Nisu pronađeni mrežni uređaji ili je kompajlirano bez ENABLE_NETWORK
+STR_NETWORK_ERR_NOTAVAILABLE :{WHITE} Nisu pronađeni mrežni uređaji ili je kompajlirano bez ENABLE_NETWORK
STR_NETWORK_ERR_NOSERVER :{WHITE} Niti jedna mrežna igra nije pronađena
STR_NETWORK_ERR_NOCONNECTION :{WHITE} Poslužitelj nije odgovorio na zahtjev
-STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Ne mogu se spojiti zbog neslaganja u NewGRF
+STR_NETWORK_ERR_NEWGRF_MISMATCH :{WHITE} Ne mogu se spojiti zbog razlike u NewGRF
STR_NETWORK_ERR_DESYNC :{WHITE} Neuspješno usklađivanje mrežne igre
STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Izgubljena veza sa mrežnom igrom
STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Nije moguće uÄitati snimljenu igru
-STR_NETWORK_ERR_SERVER_START :{WHITE} Nemoguće je pokrenuti poslužitelja
+STR_NETWORK_ERR_SERVER_START :{WHITE} Nemoguće je pokrenuti poslužitelj
STR_NETWORK_ERR_CLIENT_START :{WHITE} Nije se moguće spojiti
STR_NETWORK_ERR_TIMEOUT :{WHITE} Istekla je veza #{NUM}
STR_NETWORK_ERR_SERVER_ERROR :{WHITE} Napravljena je greška u protokolu te se veza prekinula
-STR_NETWORK_ERR_WRONG_REVISION :{WHITE}Revizija ovog klijenta ne slaže se sa revizijom servera
+STR_NETWORK_ERR_WRONG_REVISION :{WHITE} Revizija ovog klijenta ne slaže se s revizijom poslužitelja
STR_NETWORK_ERR_WRONG_PASSWORD :{WHITE} Pogrešna zaporka
STR_NETWORK_ERR_SERVER_FULL :{WHITE} Poslužitelj je pun
-STR_NETWORK_ERR_SERVER_BANNED :{WHITE} Zabranjen vam je pristup ovom poslužitelju
-STR_NETWORK_ERR_KICKED :{WHITE} IzbaÄeni ste iz igre
-STR_NETWORK_ERR_CHEATER :{WHITE} Na ovom poslužitelju nije dopušteno varanje
+STR_NETWORK_ERR_SERVER_BANNED :{WHITE} Zabranjen ti je pristup ovom poslužitelju
+STR_NETWORK_ERR_KICKED :{WHITE} IzbaÄen si iz igre
+STR_NETWORK_ERR_CHEATER :{WHITE} Na ovome poslužitelju varanje nije dopušteno
-STR_NETWORK_ERR_LEFT :je napustio igru
+STR_NETWORK_ERR_LEFT :je napusti{G o la lo} igru
############ Leave those lines in this order!!
STR_NETWORK_ERR_CLIENT_GENERAL :opća greška
STR_NETWORK_ERR_CLIENT_DESYNC :greška u sinkronizaciji
@@ -1509,23 +1522,23 @@
STR_NETWORK_ERR_CLIENT_WRONG_REVISION :pogrešna revizija
STR_NETWORK_ERR_CLIENT_NAME_IN_USE :ime se već koristi
STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD :pogrešna zaporka
-STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH :pogreÅ¡an igraÄ-id u DoCommand
+STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH :pogreÅ¡an id igraÄa u DoCommand
STR_NETWORK_ERR_CLIENT_KICKED :izbaÄen{G "" a o} od strane poslužitelja
STR_NETWORK_ERR_CLIENT_CHEATER :je pokuša{G o la lo} varati
STR_NETWORK_ERR_CLIENT_SERVER_FULL :poslužitelj je pun
############ End of leave-in-this-order
STR_NETWORK_CLIENT_JOINED :se pridruži{G o la lo} igri
STR_NETWORK_GIVE_MONEY :je da{G o la lo} novac Vašoj tvrtki ({CURRENCY})
-STR_NETWORK_GAVE_MONEY_AWAY :dali ste {STRING} novac ({CURRENCY})
-STR_NETWORK_CHAT_COMPANY_CAPTION :[Tim]:
-STR_NETWORK_CHAT_COMPANY :[Tim] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_COMPANY :[Tim] Za {STRING}: {GRAY}{STRING}
+STR_NETWORK_GAVE_MONEY_AWAY :da{G o la lo} si {STRING} novac ({CURRENCY})
+STR_NETWORK_CHAT_COMPANY_CAPTION :[Ekipa]:
+STR_NETWORK_CHAT_COMPANY :[Ekipa] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_TO_COMPANY :[Ekipa] Za {STRING}: {GRAY}{STRING}
STR_NETWORK_CHAT_CLIENT_CAPTION :[Privatno] :
STR_NETWORK_CHAT_CLIENT :[Privatno] {STRING}: {GRAY}{STRING}
STR_NETWORK_CHAT_TO_CLIENT :[Privatno] Za {STRING}: {GRAY}{STRING}
STR_NETWORK_CHAT_ALL_CAPTION :[Svima] :
STR_NETWORK_CHAT_ALL :[Svima] {STRING}: {GRAY}{STRING}
-STR_NETWORK_NAME_CHANGE :je promjeni {G o la lo} ime u
+STR_NETWORK_NAME_CHANGE :je promjeni {G o la lo} svoje ime u
STR_NETWORK_SERVER_SHUTDOWN :{WHITE} Poslužitelj je zatvorio sesiju
STR_NETWORK_SERVER_REBOOT :{WHITE} Poslužitelj se ponovno pokreće...{}Molimo priÄekajte...
@@ -1546,19 +1559,19 @@
############ end network gui strings
-STR_CONFIG_PATCHES_MAP_X :{LTBLUE}VeliÄina karte X: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y :{LTBLUE}VeliÄina karte Y: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_X :{LTBLUE}X veliÄina karte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_Y :{LTBLUE}Y veliÄina karte: {ORANGE}{STRING}
##### PNG-MAP-Loader
STR_PNGMAP_ERROR :{WHITE}Nemoguće je uÄitati krajolik iz PNG-a...
STR_PNGMAP_ERR_FILE_NOT_FOUND :{WHITE}...datoteka nije pronađena.
-STR_PNGMAP_ERR_IMAGE_TYPE :{WHITE}...ne mogu konvertirati tip slike. 8 ili 24-bitni PNG je potreban.
+STR_PNGMAP_ERR_IMAGE_TYPE :{WHITE}...ne mogu pretvoriti vrstu slike. Potrebna je 8 ili 24-bitna PNG slika.
STR_PNGMAP_ERR_MISC :{WHITE}...nešto je otišlo u krivom smjeru. Oprostite. (vjerojatno je pokvarena datoteka)
STR_BMPMAP_ERROR :{WHITE}Ne mogu uÄitati krajolik iz BMP...
-STR_BMPMAP_ERR_IMAGE_TYPE :{WHITE}...ne mogu pretvoriti tip slike.
+STR_BMPMAP_ERR_IMAGE_TYPE :{WHITE}...ne mogu pretvoriti vrstu slike.
##id 0x0800
STR_0800_COST :{TINYFONT}{RED}Trošak: {CURRENCY}
@@ -1569,8 +1582,8 @@
STR_FEEDER :{YELLOW}Prebaci: {CURRENCY}
STR_0805_ESTIMATED_COST :{WHITE}Predviđeni trošak: {CURRENCY}
STR_0807_ESTIMATED_INCOME :{WHITE}Predviđeni prihod: {CURRENCY}
-STR_0808_CAN_T_RAISE_LAND_HERE :{WHITE}Ne možeš povisiti zemlju ovdje...
-STR_0809_CAN_T_LOWER_LAND_HERE :{WHITE}Ne možeš sniziti zemlju ovdje...
+STR_0808_CAN_T_RAISE_LAND_HERE :{WHITE}Ovdje nije moguće povisiti zemlju...
+STR_0809_CAN_T_LOWER_LAND_HERE :{WHITE}Ovdje nije moguće sniziti zemlju...
STR_080A_ROCKS :Stijenje
STR_080B_ROUGH_LAND :Surova zemlja
STR_080C_BARE_LAND :Ogoljena zemlja
@@ -1585,76 +1598,76 @@
STR_1002_EXCAVATION_WOULD_DAMAGE :{WHITE}Iskopavanje bi oštetilo tunel
STR_1003_ALREADY_AT_SEA_LEVEL :{WHITE}Već je na razini mora
STR_1004_TOO_HIGH :{WHITE}Previsoko
-STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nije prikladno za želježnicke traÄnice
+STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nije prikladno za želježnicku prugu
STR_1007_ALREADY_BUILT :{WHITE}...već izgrađeno
-STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}MoraÅ¡ najprije ukloniti traÄnice
+STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Najprije moraÅ¡ ukloniti željezniÄku prugu
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Izgradnja željeznice
-STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Izgradnja elektrificiranih traÄnica
+STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Izgradnja elektrificirane željeznice
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Izgradnja jednotraÄne željeznice
STR_100C_MAGLEV_CONSTRUCTION :{WHITE}Izgradnja MagLeva
STR_100D_SELECT_RAIL_BRIDGE :{WHITE}Odaberi željezniÄki most
-STR_100E_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Ovdje nije moguće graditi željezniÄko spremiÅ¡te...
+STR_100E_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Ovdje nije moguće izgraditi željezniÄko spremiÅ¡te...
STR_100F_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Ovdje nije moguće izgraditi željezniÄku stanicu...
-STR_1010_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ovdje ne možeš postaviti znakove...
-STR_1011_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ovdje ne možeÅ¡ graditi traÄnice...
-STR_1012_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Odavde ne možeÅ¡ ukloniti traÄnice...
-STR_1013_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Ovdje ne možeš maknuti znakove...
+STR_1010_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ovdje nije moguće postaviti signale...
+STR_1011_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ovdje nije moguće izgraditi željezniÄke traÄnice...
+STR_1012_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nije moguće ukloniti željezniÄku prugu odavdje...
+STR_1013_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Nije moguće ukloniti signale odavdje...
STR_1014_TRAIN_DEPOT_ORIENTATION :{WHITE}Smjer spremišta vlakova
-STR_1015_RAILROAD_CONSTRUCTION :Izgradnja traÄnica
-STR_TOOLB_ELRAIL_CONSTRUCTION :Izgradnja elektriÄne željezniÄke pruge
+STR_1015_RAILROAD_CONSTRUCTION :Izgradnja željeznice
+STR_TOOLB_ELRAIL_CONSTRUCTION :Izgradnja elektrificirane željeznice
STR_1016_MONORAIL_CONSTRUCTION :Izgradnja jednotraÄne željeznice
STR_1017_MAGLEV_CONSTRUCTION :Izgradnja MagLeva
-STR_1018_BUILD_RAILROAD_TRACK :{BLACK}Izgradi traÄnicu
-STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Izgradi spremište vlakova (za gradnju i servisiranje vlakova)
+STR_1018_BUILD_RAILROAD_TRACK :{BLACK}Izgradi željezniÄku prugu
+STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Izgradi spremište vlakova (za izgradnju i servisiranje vlakova)
STR_101A_BUILD_RAILROAD_STATION :{BLACK}Izgradi željezniÄku stanicu
-STR_101B_BUILD_RAILROAD_SIGNALS :{BLACK}Izgradi željezniÄke znakove
+STR_101B_BUILD_RAILROAD_SIGNALS :{BLACK}Izgradi željezniÄke signale
STR_101C_BUILD_RAILROAD_BRIDGE :{BLACK}Izgradi željezniÄki most
STR_101D_BUILD_RAILROAD_TUNNEL :{BLACK}Izgradi željezniÄki tunel
-STR_101E_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Prebacuj izgradnju/uklanjanje za traÄnice i željezniÄke signale
-STR_101F_BRIDGE_SELECTION_CLICK :{BLACK}Odabir mosta - pritisni na most koji želiš izgraditi
+STR_101E_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Aktiviraj izgradnju/uklanjanje željezniÄke pruge i znakova
+STR_101F_BRIDGE_SELECTION_CLICK :{BLACK}Izbor mosta - klikni na most koji želiš izgraditi
STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO :{BLACK}Odaberi smjer željezniÄkog spremiÅ¡ta
-STR_1021_RAILROAD_TRACK :TraÄnica
-STR_1023_RAILROAD_TRAIN_DEPOT :Spremište vlakova
+STR_1021_RAILROAD_TRACK :ŽeljezniÄka pruga
+STR_1023_RAILROAD_TRAIN_DEPOT :ŽeljezniÄko spremiÅ¡te vlakova
STR_1024_AREA_IS_OWNED_BY_ANOTHER :{WHITE}...podruÄje je u vlasniÅ¡tvu druge tvrke
-STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :TraÄnice s normalnim znakovima
-STR_RAILROAD_TRACK_WITH_PRESIGNALS :TraÄnice s prethodno postavljenim znakovima
-STR_RAILROAD_TRACK_WITH_EXITSIGNALS :TraÄnice s izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :TraÄnice s kombo znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :TraÄnice sa normalnim i prethodno postavljenim znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :TraÄnice sa normalnim i izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :TraÄnice s normalnim i kombo znakovima
-STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :TraÄnice sa prethodno postavljenim i izlaznim znakovima
-STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :TraÄnice s prethodno postavljenim i kombo znakovima
-STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :TraÄnice s izlaznim i kombo znakovima
-STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Morati prvo maknuti željezniÄku stanicu
+STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :ŽeljezniÄke traÄnice s normalnim signalima
+STR_RAILROAD_TRACK_WITH_PRESIGNALS :ŽeljezniÄke traÄnice s prethodno postavljenim signalima
+STR_RAILROAD_TRACK_WITH_EXITSIGNALS :ŽeljezniÄke traÄnice s izlaznim signalima
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :ŽeljezniÄke traÄnice s kombo signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :ŽeljezniÄke traÄnice s normalnim i prethodno postavljenim signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :ŽeljezniÄke traÄnice sa normalnim i izlaznim signalima
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :ŽeljezniÄke traÄnice s normalnim i kombo signalima
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :ŽeljezniÄke traÄnice s prethodno postavljenim i izlaznim signalima
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :ŽeljezniÄke traÄnice s prethodno postavljenim i kombo signalima
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :ŽeljezniÄke traÄnice s izlaznim i kombo signalima
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Najprije moraÅ¡ ukloniti željezniÄku stanicu
##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST :{WHITE}Moraš prvo ukloniti cestu
+STR_1801_MUST_REMOVE_ROAD_FIRST :{WHITE}Najprije moraš ukloniti cestu
STR_ROAD_WORKS_IN_PROGRESS :{WHITE}Cestovni radovi u tijeku
STR_1802_ROAD_CONSTRUCTION :{WHITE}Izgradnja ceste
-STR_1802_TRAMWAY_CONSTRUCTION :{WHITE}Konstruiranje Tramvaja
-STR_1803_SELECT_ROAD_BRIDGE :{WHITE}Izaberi cestovni most
-STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}...jednosmjerne ceste ne mogu imati raskršća
-STR_1804_CAN_T_BUILD_ROAD_HERE :{WHITE}Ovdje ne možeš graditi cestu...
-STR_1804_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Ne mogu izgraditi tramvaj ovdje...
-STR_1805_CAN_T_REMOVE_ROAD_FROM :{WHITE}Odavde ne možeš maknuti cestu...
-STR_1805_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Ne mogu maknuti tramvaj odavde...
+STR_1802_TRAMWAY_CONSTRUCTION :{WHITE}Izgradnja tramvaja
+STR_1803_SELECT_ROAD_BRIDGE :{WHITE}Odaberi cestovni most
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}...jednosmjerne ceste ne mogu imati raskrižja
+STR_1804_CAN_T_BUILD_ROAD_HERE :{WHITE}Ovdje nije moguće izgraditi cestu...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Ovdje nije moguće izgraditi tramvaj...
+STR_1805_CAN_T_REMOVE_ROAD_FROM :{WHITE}Nije moguće ukloniti cestu odavdje...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Nije moguće ukloniti tramvaj odavdje...
STR_1806_ROAD_DEPOT_ORIENTATION :{WHITE}Smjer cestovnog spremišta
-STR_1806_TRAM_DEPOT_ORIENTATION :{WHITE}Smjer Tramvajskog Skladišta
-STR_1807_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Ovdje ne možeš izgraditi spremište cestovnih vozila...
-STR_1807_CAN_T_BUILD_TRAM_VEHICLE :{WHITE}Ne mogu izgraditi skladište tramvaja ovdje
+STR_1806_TRAM_DEPOT_ORIENTATION :{WHITE}Smjer tramvajskog spremišta
+STR_1807_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Ovdje nije moguće izgraditi spremište cestovnih vozila...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE :{WHITE}Ovdje nije moguće izgraditi tramvajsko spremište...
STR_1808_CAN_T_BUILD_BUS_STATION :{WHITE}Nije moguće izgraditi autobusnu stanicu...
STR_1809_CAN_T_BUILD_TRUCK_STATION :{WHITE}Nije moguće izgraditi kamionski terminal...
-STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Ne mogu izgraditi tramvajsku stanicu za putnike...
-STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Nemogu izgraditi teretnu tramvajsku stanicu...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Nije moguće izgraditi tramvajsku stanicu za putnike...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Nije moguće izgraditi teretnu tramvajsku stanicu...
STR_180A_ROAD_CONSTRUCTION :Izgradnja ceste
-STR_180A_TRAMWAY_CONSTRUCTION :Konstruiranje tramvaja
+STR_180A_TRAMWAY_CONSTRUCTION :Izgradnja tramvaja
STR_180B_BUILD_ROAD_SECTION :{BLACK}Izgradi dio ceste
-STR_180B_BUILD_TRAMWAY_SECTION :{BLACK}Izgradi dio tramvaja
+STR_180B_BUILD_TRAMWAY_SECTION :{BLACK}Izgradi tramvajski dio
STR_180C_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Izgradi spremište cestovnih vozila (za izgradnju i servisiranje vozila)
-STR_180C_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Izgradi skladište za tramvajska vozila(za izgradnju i servisiranje vozila)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Izgradi spremište tramvajskih vozila (za izgradnju i servisiranje vozila)
STR_180D_BUILD_BUS_STATION :{BLACK}Izgradi autobusnu stanicu
STR_180E_BUILD_TRUCK_LOADING_BAY :{BLACK}Izgradi pretovarni kamionski terminal
STR_180D_BUILD_PASSENGER_TRAM_STATION :{BLACK}Izgradi putniÄku tramvajsku stanicu
@@ -1663,19 +1676,19 @@
STR_180F_BUILD_TRAMWAY_BRIDGE :{BLACK}Izgradi tramvajski most
STR_1810_BUILD_ROAD_TUNNEL :{BLACK}Izgradi cestovni tunel
STR_1810_BUILD_TRAMWAY_TUNNEL :{BLACK}Izgradi tramvajski tunel
-STR_1811_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Prebacuj izgradnju/uklanjanje ceste
-STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}UkljuÄi izgradnju/brisanje za konstruiranje tramvaja
-STR_1813_SELECT_ROAD_VEHICLE_DEPOT :{BLACK}Izaberi smjer spremišta cestovnih vozila
-STR_1813_SELECT_TRAM_VEHICLE_DEPOT :{BLACK}Odaberi smjer skladišta za tramvaj
+STR_1811_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Aktiviraj izgradnju/uklanjanje ceste
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Aktiviraj izgradnju/brisanje za izgradnju tramvaja
+STR_1813_SELECT_ROAD_VEHICLE_DEPOT :{BLACK}Odaberi smjer spremišta cestovnih vozila
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT :{BLACK}Odaberi smjer tramvajskog spremišta
STR_1814_ROAD :Cesta
STR_1815_ROAD_WITH_STREETLIGHTS :Cesta sa semaforima
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_CAN_T_REMOVE_BUS_STATION :{WHITE}Ne mogu maknuti autobusnu stanicu...
-STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Ne mogu maknuti kamionsku stanicu...
-STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Ne mogu maknuti putniÄku tramvajsku stanicu...
-STR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Ne mogu maknuti teretnu tramvajsku stanicu...
+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...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Nije moguće ukloniti teretnu tramvajsku stanicu...
##id 0x2000
STR_2000_TOWNS :{WHITE}Gradovi
@@ -1684,13 +1697,13 @@
STR_TOWN_LABEL_TINY_BLACK :{TINYFONT}{BLACK}{TOWN}
STR_TOWN_LABEL_TINY_WHITE :{TINYFONT}{WHITE}{TOWN}
STR_2002 :{TINYFONT}{BLACK}{SIGN}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Građevina mora prvo biti srušena
+STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Najprije moraš srušiti građevinu
STR_2005 :{WHITE}{TOWN}
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}Grad se ne može preimenovati...
+STR_2008_CAN_T_RENAME_TOWN :{WHITE}Nije moguće preimenovati grad...
STR_2009_LOCAL_AUTHORITY_REFUSES :{WHITE}{TOWN} lokalna samouprava odbija to dozvoliti
-STR_200A_TOWN_NAMES_CLICK_ON_NAME :{BLACK}Imena gradova - pritisni na ime kako bi centrirao pogled na zaslon
+STR_200A_TOWN_NAMES_CLICK_ON_NAME :{BLACK}Imena gradova - klikni na ime kako bi centrirao pogled na grad
STR_200B_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centriraj glavni pogled na lokaciju grada
STR_200C_CHANGE_TOWN_NAME :{BLACK}Promijeni ime grada
STR_200D_PASSENGERS_LAST_MONTH_MAX :{BLACK}Putnika prošli mjesec: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA}
@@ -1713,7 +1726,7 @@
STR_201E_STADIUM :Stadion
STR_201F_OLD_HOUSES :Stare kuće
STR_2020_LOCAL_AUTHORITY :{BLACK}Lokalna samouprava
-STR_2021_SHOW_INFORMATION_ON_LOCAL :{BLACK}Prikaži informacije o lokalnoj samoupravi
+STR_2021_SHOW_INFORMATION_ON_LOCAL :{BLACK}Pokaži informacije o lokalnoj samoupravi
STR_2022_LOCAL_AUTHORITY :{WHITE}Lokalna samouprava {TOWN}
STR_2023_TRANSPORT_COMPANY_RATINGS :{BLACK}Ocjene prijevoznih tvrtki:
STR_2024 :{YELLOW}{COMPANY} {COMPANYNUM}: {ORANGE}{STRING}
@@ -1725,13 +1738,13 @@
STR_202B_SERVICES_ALREADY_SUBSIDISED :{BLACK}Usluge subvencionirane:
STR_202C_FROM_TO :{ORANGE}{STRING} iz {STATION} prema {STATION}{YELLOW} ({COMPANY}
STR_202D_UNTIL :{YELLOW}, do {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED :{BLACK}{BIGFONT}Istekla je ponuda subvencije:{}{}Prijevoz tereta ( {STRING} ) od {STRING} do {STRING} neće više biti subvencioniran.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE :{BLACK}{BIGFONT}PovuÄena subvencija:{}{}Prijevoz tereta ( {STRING} ) od {STATION} do {STATION} nije viÅ¡e subvencioniran.
-STR_2030_SERVICE_SUBSIDY_OFFERED :{BLACK}{BIGFONT}Ponuđena je subvencija:{}{}Prvi koji preveze teret ({STRING}) od {STRING} do {STRING} dobivat će subvenciju od lokalne samouprave!
-STR_2031_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se 50% više sljedećih godinu dana!
-STR_2032_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se dvostruko sljedećih godinu dana!
-STR_2033_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se trostruko sljedećih godinu dana!
-STR_2034_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodjeljena tvrtki {COMPANY}!{}{}Prijevoz tereta ({STRING}) od {STATION} do {STATION} plaćat će se Äetverostruko sljedećih godinu dana!
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED :{BLACK}{BIGFONT}Istekla je ponuda subvencije:{}{}Prijevoz {STRING.gen} od {STRING} do {STRING} više ne će biti subvencioniran.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE :{BLACK}{BIGFONT}PovuÄena subvencija:{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} viÅ¡e nije subvencioniran.
+STR_2030_SERVICE_SUBSIDY_OFFERED :{BLACK}{BIGFONT}Ponuđena je subvencija:{}{}Prvi koji preveze {STRING.aku} od {STRING} do {STRING} primat će jednogodišnju subvenciju od lokalne samouprave!
+STR_2031_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se 50% više sljedećih godinu dana!
+STR_2032_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se dvostruko sljedećih godinu dana!
+STR_2033_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se trostruko sljedećih godinu dana!
+STR_2034_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}Subvencija je dodijeljena tvrtki {COMPANY}!{}{}Prijevoz {STRING.gen} od {STATION} do {STATION} plaćat će se Äetverostruko sljedećih godinu dana!
STR_2035_LOCAL_AUTHORITY_REFUSES :{WHITE}{TOWN} lokalne vlasti odbijaju dozvoliti izgradnju joÅ¡ jedne zraÄne luke u ovom gradu
STR_2036_COTTAGES :Kolibe
STR_2037_HOUSES :Kuće
@@ -1746,14 +1759,14 @@
STR_2040_CINEMA :Kino
STR_2041_SHOPPING_MALL :TrgovaÄki centar
STR_2042_DO_IT :{BLACK}UÄini to
-STR_2043_LIST_OF_THINGS_TO_DO_AT :{BLACK}Popis stvari koje treba uÄiniti u ovom gradu - pritisni za dodatne informacije
+STR_2043_LIST_OF_THINGS_TO_DO_AT :{BLACK}Popis stvari koje treba uÄiniti u ovom gradu - klikni za dodatne informacije
STR_2044_CARRY_OUT_THE_HIGHLIGHTED :{BLACK}IzvrÅ¡i akcije oznaÄene na gornjem popisu
-STR_2045_ACTIONS_AVAILABLE :{BLACK}Dostupne akcije:
+STR_2045_ACTIONS_AVAILABLE :{BLACK}Dostupne radnje:
STR_2046_SMALL_ADVERTISING_CAMPAIGN :Mala oglasna kampanja
STR_2047_MEDIUM_ADVERTISING_CAMPAIGN :Srednja oglasna kampanja
STR_2048_LARGE_ADVERTISING_CAMPAIGN :Velika oglasna kampanja
STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION :Financiraj popravljanje lokalne prometnice
-STR_204A_BUILD_STATUE_OF_COMPANY :Izgradi kip vlasnika tvrke
+STR_204A_BUILD_STATUE_OF_COMPANY :Izgradi kip vlasnika tvrtke
STR_204B_FUND_NEW_BUILDINGS :Financiraj nove građevine
STR_204C_BUY_EXCLUSIVE_TRANSPORT :Kupi ekskluzivna prava prijevozna
STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY :Podmiti lokalnu samoupravu
@@ -1765,7 +1778,7 @@
STR_2052_FUND_THE_CONSTRUCTION_OF :{WHITE}{STRING}{}{YELLOW} Financiraj izgradnju novih poslovnih prostora u gradu.{} Trošak: {CURRENCY}
STR_2053_BUY_1_YEAR_S_EXCLUSIVE :{WHITE}{STRING}{}{YELLOW} Kupi jednogodišnje ekskluzivno pravo prijevoza u gradu. Gradska vlast će dopustiti putnicima i teretu da koriste stanice samo tvoje tvrtke.{} Trošak: {CURRENCY}
STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC :{WHITE}{STRING}{}{YELLOW} Podmiti lokalnu vlast zbog povećanja rejtinga, riskirajući ozbiljne kazne ako vas uhvate{} Trošak: {CURRENCY}
-STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING :{BIGFONT}{BLACK}{TOWN} zahvatile prometne gužve!{}{}Program popravka cesta koji financira tvrtka {COMPANY} slijedećih će 6 mjeseci zadavati glavobolje motociskistima!
+STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING :{BIGFONT}{BLACK}{TOWN} zahvatile prometne gužve!{}{}Program rekonstrukcije cesta koji financira tvrtka {COMPANY} sljedećih će 6 mjeseci zadavati glavobolje motoriziranima!
STR_2056 :{TINYFONT}{WHITE}{TOWN}
STR_2057 :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_2058_UNDER_CONSTRUCTION :{STRING} (u izgradnji)
@@ -1786,21 +1799,21 @@
STR_2802_TREES :{WHITE}Drveće
STR_2803_TREE_ALREADY_HERE :{WHITE}...ovdje već postoji drvo
STR_2804_SITE_UNSUITABLE :{WHITE}...neprikladno mjesto
-STR_2805_CAN_T_PLANT_TREE_HERE :{WHITE}Ovdje ne možeš posaditi drvo...
+STR_2805_CAN_T_PLANT_TREE_HERE :{WHITE}Ovdje nije moguće posaditi drvo...
STR_2806 :{WHITE}{SIGN}
STR_2808_TOO_MANY_SIGNS :{WHITE}...previše znakova
-STR_2809_CAN_T_PLACE_SIGN_HERE :{WHITE}Ovdje ne možeš postaviti znak...
+STR_2809_CAN_T_PLACE_SIGN_HERE :{WHITE}Ovdje nije moguće postaviti znak...
STR_280A_SIGN :Znak
STR_280B_EDIT_SIGN_TEXT :{WHITE}Izmijeni tekst znaka
-STR_280C_CAN_T_CHANGE_SIGN_NAME :{WHITE}Ne možeš promijeniti ime znaka...
-STR_280D_SELECT_TREE_TYPE_TO_PLANT :{BLACK}Izaberi vrstu drveta za sadnju
+STR_280C_CAN_T_CHANGE_SIGN_NAME :{WHITE}Nije moguće promijeniti ime znaka...
+STR_280D_SELECT_TREE_TYPE_TO_PLANT :{BLACK}Odaberi vrstu drveta za sadnju
STR_280E_TREES :Drveće
STR_280F_RAINFOREST :Kišna šuma
STR_2810_CACTUS_PLANTS :Kaktusi
##id 0x3000
-STR_3000_RAIL_STATION_SELECTION :{WHITE}Odabir željezniÄke stanice
-STR_3001_AIRPORT_SELECTION :{WHITE}Odabir zraÄne luke
+STR_3000_RAIL_STATION_SELECTION :{WHITE}Izbor željezniÄke stanice
+STR_3001_AIRPORT_SELECTION :{WHITE}Izbor zraÄne luke
STR_3002_ORIENTATION :{BLACK}Smjer
STR_3003_NUMBER_OF_TRACKS :{BLACK}Broj traÄnica
STR_3004_PLATFORM_LENGTH :{BLACK}Dužina platforme
@@ -1812,12 +1825,12 @@
STR_3008B_TOO_MANY_TRUCK_STOPS :{WHITE}Previše kamionskih stanica
STR_3009_TOO_CLOSE_TO_ANOTHER_STATION :{WHITE}Preblizu drugoj stanici/terminalu
STR_300A_0 :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD :{WHITE}Prvo moraÅ¡ uniÅ¡titi željezniÄku stanicu
+STR_300B_MUST_DEMOLISH_RAILROAD :{WHITE}Najprije moraÅ¡ sruÅ¡iti željezniÄku stanicu
STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Preblizu drugoj zraÄnoj luci
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}MoraÅ¡ uniÅ¡titi zraÄnu luku prvo
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Najprije moraÅ¡ sruÅ¡iti zraÄnu luku
STR_3030_RENAME_STATION_LOADING :Preimenuj stanicu/terminal
-STR_3031_CAN_T_RENAME_STATION :{WHITE}Ne možeš preimenovati stanicu...
+STR_3031_CAN_T_RENAME_STATION :{WHITE}Nije moguće preimenovati stanicu...
STR_3032_RATINGS :{BLACK}Ocjene
STR_3033_ACCEPTS :{BLACK}Prihvaća
STR_3034_LOCAL_RATING_OF_TRANSPORT :{BLACK}Lokalna ocjena usluge prijevoza:
@@ -1841,30 +1854,30 @@
STR_3042_BUS_STATION_ORIENTATION :{WHITE}Smjer autobusne stanice
STR_3043_TRUCK_STATION_ORIENT :{WHITE}Smjer kamionskog terminala
STR_3042_PASSENGER_TRAM_STATION_ORIENTATION :{WHITE}Orijentacija putniÄkog tramvaja
-STR_3043_CARGO_TRAM_STATION_ORIENT :{WHITE}Orijentacija tovarnog tramvaja
-STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Prvo moraš uništiti autobusnu stanicu
-STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Prvo moraš uništiti kamionski terminal
-STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Morate prvo maknuti putniÄku tramvajsku stanicu
-STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Morate prvo maknuti teretnu tramvajsku stanicu
-STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} Stanic{P a e a}
+STR_3043_CARGO_TRAM_STATION_ORIENT :{WHITE}Orijentacija teretnog tramvaja
+STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Najprije moraš srušiti autobusnu stanicu
+STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Najprije moraš srušiti kamionski terminal
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Najprije moraÅ¡ sruÅ¡iti putniÄku tramvajsku stanicu
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Najprije moraš srušiti teretnu tramvajsku stanicu
+STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} stanic{P a e a}
STR_3049_0 :{YELLOW}{STATION} {STATIONFEATURES}
STR_304A_NONE :{YELLOW}- Ništa -
STR_304B_SITE_UNSUITABLE :{WHITE}...neprikladno mjesto
STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Preblizu drugom pristaništu
-STR_304D_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Prvo moraš srušiti pristanište
-STR_304E_SELECT_RAILROAD_STATION :{BLACK}Izaberi smjer željezniÄke stanice
-STR_304F_SELECT_NUMBER_OF_PLATFORMS :{BLACK}Izaberi broj perona na željezniÄkoj stanici
-STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Izaberi dužinu željezniÄke stanice
-STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Izaberi smjer autobusne stanice
-STR_3052_SELECT_TRUCK_LOADING_BAY :{BLACK}Izaberi smjer kamionskog terminala
-STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION :{BLACK}Odaberite smjer putniÄke tramvajske stanice
-STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION :{BLACK}Odaberite smjer teretne tramvajske stanice
+STR_304D_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Najprije moraš srušiti pristanište
+STR_304E_SELECT_RAILROAD_STATION :{BLACK}Odaberi smjer željezniÄke stanice
+STR_304F_SELECT_NUMBER_OF_PLATFORMS :{BLACK}Odaberi broj perona na željezniÄkoj stanici
+STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Odaberi dužinu željezniÄke stanice
+STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Odaberi smjer autobusne stanice
+STR_3052_SELECT_TRUCK_LOADING_BAY :{BLACK}Odaberi smjer kamionskog terminala
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION :{BLACK}Odaberi smjer putniÄke tramvajske stanice
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION :{BLACK}Odaberi smjer teretne tramvajske stanice
STR_3053_CENTER_MAIN_VIEW_ON_STATION :{BLACK}Centriraj glavni pogled na lokaciju stanice
STR_3054_SHOW_STATION_RATINGS :{BLACK}Pokaži ocjene stanice
STR_3055_CHANGE_NAME_OF_STATION :{BLACK}Promijeni ime stanice
-STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO :{BLACK}Prikaži popis prihvaćenog tereta
-STR_3057_STATION_NAMES_CLICK_ON :{BLACK}Imena stanica - pritisni ime da bi centrirao glavni pogled na stanicu
-STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT :{BLACK}Izaberi veliÄinu/tip zraÄne luke
+STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO :{BLACK}Prikaži popis tereta koji se prihvaća
+STR_3057_STATION_NAMES_CLICK_ON :{BLACK}Imena stanica - klikni na ime kako bi centrirao glavni pogled na stanicu
+STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT :{BLACK}Odaberi veliÄinu/vrstu zraÄne luke
STR_305C_0 :{STATION} {STATIONFEATURES}
STR_STATION_SIGN_TINY :{TINYFONT}{STATION}
STR_305E_RAILROAD_STATION :ŽeljezniÄka stanica
@@ -1881,22 +1894,22 @@
STR_306A_BUOY_IN_THE_WAY :{WHITE}...plutaÄa na putu
STR_306C_STATION_TOO_SPREAD_OUT :{WHITE}...stanica previše proširena
STR_306D_NONUNIFORM_STATIONS_DISALLOWED :{WHITE}...neujednaÄene stanice onemogućene
-STR_USE_CTRL_TO_SELECT_MORE :{BLACK}Drži CTRL kako bi izabrao više od jednog itema
+STR_USE_CTRL_TO_SELECT_MORE :{BLACK}Drži CTRL kako bi odabrao više od jedne stavke
STR_UNDEFINED :(neodređen znakovni niz)
STR_STAT_CLASS_DFLT :Pretpostavljena stanica
STR_STAT_CLASS_WAYP :Čvorišta
##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION :{WHITE}Smjer brodskog spremišta
+STR_3800_SHIP_DEPOT_ORIENTATION :{WHITE}Smjer spremišta brodova
STR_3801_MUST_BE_BUILT_ON_WATER :{WHITE}...mora biti izgrađen na vodi
-STR_3802_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Ovdje ne možeš graditi brodsko spremište...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION :{BLACK}Izaberi smjer brodskog spremišta
+STR_3802_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Ovdje nije moguće izgraditi spremište brodova...
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION :{BLACK}Odaberi smjer spremišta brodova
STR_3804_WATER :Voda
STR_3805_COAST_OR_RIVERBANK :Obala ili rijeÄni nasip
-STR_3806_SHIP_DEPOT :Brodsko spremište
-STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Ne možeš graditi na vodi
-STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Morate prvo maknuti kanal
+STR_3806_SHIP_DEPOT :Spremište brodova
+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
##id 0x4000
STR_4000_SAVE_GAME :{WHITE}Spremi igru
@@ -2003,11 +2016,10 @@
STR_5001_ROAD_VEHICLE_IN_TUNNEL :{WHITE}Cestovno vozilo u tunelu
STR_5003_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Smeta drugi tunel
STR_5005_UNABLE_TO_EXCAVATE_LAND :{WHITE}Ne moguće iskopoati zemlju na drugoj strani tunela
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Moraš prvo srušiti tunel
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Moraš prvo srušiti most
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Najprije moraš srušiti tunel
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Najprije moraš srušiti most
STR_5008_CANNOT_START_AND_END_ON :{WHITE}PoÄetak i kraj ne mogu biti na istom mjestu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Ispod mosta mora biti ravna zemlja ili voda
-STR_500A_START_AND_END_MUST_BE_IN :{WHITE}PoÄetak i kraj moraju biti u istoj liniji
+STR_500A_START_AND_END_MUST_BE_IN :{WHITE}PoÄetak i kraj moraju biti u ravnini
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Neprikladan teren za ulaz u tunel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
STR_500E_SUSPENSION_STEEL :Viseći, ÄeliÄni
@@ -2018,8 +2030,8 @@
STR_5013_CONCRETE :Betonski
STR_5014_TUBULAR_STEEL :Cijevni, ÄeliÄni
STR_BRIDGE_TUBULAR_SILICON :Cjevni, silikonski
-STR_5015_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Ovdje se ne može graditi most...
-STR_5016_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Ovdje se ne može graditi tunel...
+STR_5015_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Ovdje nije moguće izgraditi most...
+STR_5016_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Ovdje nije moguće izgraditi tunel...
STR_5017_RAILROAD_TUNNEL :ŽeljezniÄki tunel
STR_5018_ROAD_TUNNEL :Cestovni tunel
STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE :ÄŒeliÄni viseći željezniÄki most
@@ -2041,10 +2053,10 @@
STR_5800_OBJECT_IN_THE_WAY :{WHITE}Smeta objekt
STR_5801_TRANSMITTER :OdaÅ¡iljaÄ
STR_5802_LIGHTHOUSE :Svjetionik
-STR_5803_COMPANY_HEADQUARTERS :Sjedište tvrke
-STR_5804_COMPANY_HEADQUARTERS_IN :{WHITE}...smeta sjedište tvrke
-STR_5805_COMPANY_OWNED_LAND :Zemlja u posjedu tvrke
-STR_5806_CAN_T_PURCHASE_THIS_LAND :{WHITE}Ova zemlja ne može se kupiti...
+STR_5803_COMPANY_HEADQUARTERS :Sjedište tvrtke
+STR_5804_COMPANY_HEADQUARTERS_IN :{WHITE}...smeta sjedište tvrtke
+STR_5805_COMPANY_OWNED_LAND :Zemlja u posjedu tvrtke
+STR_5806_CAN_T_PURCHASE_THIS_LAND :{WHITE}Ovu zemlju nije moguće kupiti...
STR_5807_YOU_ALREADY_OWN_IT :{WHITE}...već je u tvom vlasništvu!
@@ -2118,11 +2130,11 @@
STR_680D_INTELLIGENCE_OF_COMPETITORS :{LTBLUE}Inteligencija natjecatelja: {ORANGE}{STRING}
STR_680E_VEHICLE_BREAKDOWNS :{LTBLUE}Kvarovi na vozilima: {ORANGE}{STRING}
STR_680F_SUBSIDY_MULTIPLIER :{LTBLUE}Subvencijski množitelj: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION :{LTBLUE}Troškovi građenja: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION :{LTBLUE}Troškovi izgradnje: {ORANGE}{STRING}
STR_6811_TERRAIN_TYPE :{LTBLUE}Vrsta terena: {ORANGE}{STRING}
STR_6812_QUANTITY_OF_SEA_LAKES :{LTBLUE}KoliÄina mora/jezera: {ORANGE}{STRING}
STR_6813_ECONOMY :{LTBLUE}Ekonomija: {ORANGE}{STRING}
-STR_6814_TRAIN_REVERSING :{LTBLUE}Promjena smjera vlakova: {ORANGE}{STRING}
+STR_6814_TRAIN_REVERSING :{LTBLUE}Promjena smjera vlaka: {ORANGE}{STRING}
STR_6815_DISASTERS :{LTBLUE}Prirodne katastrofe: {ORANGE}{STRING}
STR_16816_CITY_APPROVAL :{LTBLUE}Stav gradsko vijeća prema restrukturiranju podruÄja: {ORANGE}{STRING}
############ range for difficulty settings ends
@@ -2164,7 +2176,7 @@
STR_6835_AT_END_OF_LINE_ONLY :IskljuÄivo na kraju pruge
STR_6836_OFF :IskljuÄeno
STR_6837_ON :UkljuÄeno
-STR_6838_SHOW_HI_SCORE_CHART :{BLACK}Prikaz tablice najboljih rezultata
+STR_6838_SHOW_HI_SCORE_CHART :{BLACK}Pokaži tablice najboljih rezultata
STR_6839_PERMISSIVE :Dopustiv
STR_683A_TOLERANT :Tolerantan
STR_683B_HOSTILE :Agresivan
@@ -2181,12 +2193,12 @@
STR_7009_PRESIDENT_NAME :{BLACK}Ime direktora
STR_700A_COMPANY_NAME :Ime tvrtke
STR_700B_PRESIDENT_S_NAME :Ime direktora
-STR_700C_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Ime tvrtke ne može se promijeniti...
-STR_700D_CAN_T_CHANGE_PRESIDENT :{WHITE}Ne možeš promijeniti ime direktora...
+STR_700C_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Ime tvrtke nije moguće promijeniti...
+STR_700D_CAN_T_CHANGE_PRESIDENT :{WHITE}Nije moguće promijeniti ime direktora...
STR_700E_FINANCES :{WHITE}{COMPANY} Financije {BLACK}{COMPANYNUM}
STR_700F_EXPENDITURE_INCOME :{WHITE}Izdatci/Prihodi
STR_7010 :{WHITE}{NUM}
-STR_7011_CONSTRUCTION :{GOLD}Građenje
+STR_7011_CONSTRUCTION :{GOLD}Izgradnja
STR_7012_NEW_VEHICLES :{GOLD}Nova vozila
STR_7013_TRAIN_RUNNING_COSTS :{GOLD}Troškovi uporabe vlakova
STR_7014_ROAD_VEH_RUNNING_COSTS :{GOLD}Troškovi uporabe cestovnih vozila
@@ -2203,7 +2215,7 @@
STR_701F :{BLACK}+{CURRENCY}
STR_7020_TOTAL :{WHITE}Ukupno:
STR_7021 :{COMPANY} {COMPANYNUM}
-STR_7022_INCOME_GRAPH :{WHITE}Graf prihoda
+STR_7022_INCOME_GRAPH :{WHITE}Grafikon prihoda
STR_CURRCOMPACT :{CURRCOMPACT}
STR_7024 :{COMMA}
STR_7025_OPERATING_PROFIT_GRAPH :{WHITE}Grafikon operativne dobiti
@@ -2214,16 +2226,16 @@
STR_7029_BORROW :{BLACK}Pozajmi {SKIP}{SKIP}{CURRENCY}
STR_702A_REPAY :{BLACK}Otplati {SKIP}{SKIP}{CURRENCY}
STR_702B_MAXIMUM_PERMITTED_LOAN :{WHITE}...najveći dopušteni zajam iznosi {CURRENCY}
-STR_702C_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Ne možeš dobiti još kredita...
+STR_702C_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Nije moguće posuditi još više novaca...
STR_702D_LOAN_ALREADY_REPAYED :{WHITE}...nema zajma za otplatu
STR_702E_REQUIRED :{WHITE}...{CURRENCY} potrebno
-STR_702F_CAN_T_REPAY_LOAN :{WHITE}Ne možeš otplatiti zajam...
+STR_702F_CAN_T_REPAY_LOAN :{WHITE}Nije moguće otplatiti zajam...
STR_INSUFFICIENT_FUNDS :{WHITE}Ne možeš dati novac koji je pozajmljen od banke...
-STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT :{BLACK}Odaberi novo lice za direktora
-STR_7031_CHANGE_THE_COMPANY_VEHICLE :{BLACK}Promijeni izgled vozila tvrtke
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT :{BLACK}Odaberi novo lice direktora
+STR_7031_CHANGE_THE_COMPANY_VEHICLE :{BLACK}Promijeni shemu boja za vozila tvrtke
STR_7032_CHANGE_THE_PRESIDENT_S :{BLACK}Promjeni ime direktora
STR_7033_CHANGE_THE_COMPANY_NAME :{BLACK}Promijeni ime tvrtke
-STR_7034_CLICK_ON_SELECTED_NEW_COLOR :{BLACK}Klikni na odabranu boju
+STR_7034_CLICK_ON_SELECTED_NEW_COLOR :{BLACK}Klikni na željenu boju
STR_7035_INCREASE_SIZE_OF_LOAN :{BLACK}Povećaj iznos zajma
STR_7036_REPAY_PART_OF_LOAN :{BLACK}Otplati dio zajma
STR_7037_PRESIDENT :{WHITE}{PLAYERNAME}{}{GOLD}(Direktor)
@@ -2234,19 +2246,19 @@
STR_AIRCRAFT :{WHITE}{COMMA} zrakoplov
STR_SHIPS :{WHITE}{COMMA} brod{P "" a ova}
STR_7042_NONE :{WHITE}Ništa
-STR_7043_FACE_SELECTION :{WHITE}Odabir lica
+STR_7043_FACE_SELECTION :{WHITE}Izbor lica
STR_7044_MALE :{BLACK}Muško
STR_7045_FEMALE :{BLACK}Žensko
STR_7046_NEW_FACE :{BLACK}Novo lice
-STR_7047_CANCEL_NEW_FACE_SELECTION :{BLACK}Odustani od odabira novog lica
-STR_7048_ACCEPT_NEW_FACE_SELECTION :{BLACK}Prihvati odabir novog lica
+STR_7047_CANCEL_NEW_FACE_SELECTION :{BLACK}Odustani od izbora novog lica
+STR_7048_ACCEPT_NEW_FACE_SELECTION :{BLACK}Prihvati izbor novog lica
STR_7049_SELECT_MALE_FACES :{BLACK}Odaberi muška lica
STR_704A_SELECT_FEMALE_FACES :{BLACK}Odaberi ženska lica
STR_704B_GENERATE_RANDOM_NEW_FACE :{BLACK}Generiraj nasumiÄno novo lice
STR_704C_KEY :{BLACK}KljuÄ
-STR_704D_SHOW_KEY_TO_GRAPHS :{BLACK}Prikaži kljuÄeve po grafovima
-STR_704E_KEY_TO_COMPANY_GRAPHS :{WHITE}KljuÄ za grafove tvrtke
-STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY :{BLACK}Klikni ovdje za ukljuÄivanje/iskljuÄivanje tvrke s grafa
+STR_704D_SHOW_KEY_TO_GRAPHS :{BLACK}Pokaži kljuÄeve na grafikonima
+STR_704E_KEY_TO_COMPANY_GRAPHS :{WHITE}KljuÄ za grafikone tvrtke
+STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY :{BLACK}Klikni ovdje za ukljuÄivanje/iskljuÄivanje tvrtke s grafikona
STR_7050_UNITS_OF_CARGO_DELIVERED :{WHITE}Dostavljenih jedinica tereta
STR_7051_COMPANY_PERFORMANCE_RATINGS :{WHITE}Ocjena uÄinka tvrtke (najveća ocjena = 1000)
STR_7052_COMPANY_VALUES :{WHITE}Vrijednost tvrtki
@@ -2256,18 +2268,18 @@
STR_7056_TRANSPORT_COMPANY_IN_TROUBLE :{BLACK}{BIGFONT}Prijevozna tvrtka u nevoljama!
STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED :{BLACK}{BIGFONT}{COMPANY} će biti rasprodana ili objaviti bankrot ukoliko se uÄinak uskoro ne poboljÅ¡a!
STR_7058_PRESIDENT :{BLACK}{PLAYERNAME}{}(Direktor)
-STR_7059_TRANSPORT_COMPANY_MERGER :{BLACK}{BIGFONT}Spajanje prijevoznih tvrki!
+STR_7059_TRANSPORT_COMPANY_MERGER :{BLACK}{BIGFONT}Spajanje prijevoznih tvrtki!
STR_705A_HAS_BEEN_SOLD_TO_FOR :{BLACK}{BIGFONT}{COMPANY} je prodana tvrtki {COMPANY} za {CURRENCY}!
-STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT :{WHITE}Tražimo prijevoznu tvrku koja bi preuzela našu tvrtku.{}{}Želiš li kupiti tvrtku{COMPANY} za {CURRENCY}?
+STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT :{WHITE}Tražimo prijevoznu tvrtku koja bi preuzela našu tvrtku.{}{}Želiš li kupiti tvrtku {COMPANY} za {CURRENCY}?
STR_705C_BANKRUPT :{BLACK}{BIGFONT}Bankrot!
STR_705D_HAS_BEEN_CLOSED_DOWN_BY :{BLACK}{BIGFONT}{COMPANY} je zatvorena od strane kreditora i sva je imovina rasprodana!
STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED :{BLACK}{BIGFONT}Osnovana je nova prijevozna tvrtka!
STR_705F_STARTS_CONSTRUCTION_NEAR :{BLACK}{BIGFONT}{COMPANY} zapoÄinje gradnju blizu grada {TOWN}!
-STR_7060_CAN_T_BUY_COMPANY :{WHITE}Ne možeš kupiti tvrtku...
+STR_7060_CAN_T_BUY_COMPANY :{WHITE}Nije moguće kupiti tvrtku...
STR_7061_CARGO_PAYMENT_RATES :{WHITE}Isplatne rate tereta
STR_7062_DAYS_IN_TRANSIT :{BLACK}{TINYFONT}Dana u tranzitu
STR_7063_PAYMENT_FOR_DELIVERING :{BLACK}{TINYFONT}Plaćanje za dostavu 10 jedinica (ili 10,000 litara) tereta za udaljenost od 20 kvadrata
-STR_7064_TOGGLE_GRAPH_FOR_CARGO :{BLACK}Aktiviraj/deaktiviraj graf za vrstu tereta
+STR_7064_TOGGLE_GRAPH_FOR_CARGO :{BLACK}UkljuÄi/iskljuÄi grafikon za vrstu tereta
STR_7065 :{BLACK}{TINYFONT}{STRING}
STR_7066_ENGINEER :Inženjer
STR_7067_TRAFFIC_MANAGER :Prijevozni upravitelj
@@ -2280,39 +2292,39 @@
STR_706E_TYCOON :Tajkun
STR_706F_BUILD_HQ :{BLACK}Izgradi sjedište tvrtke
STR_7070_BUILD_COMPANY_HEADQUARTERS :{BLACK}Izgradi središte tvrtke / pogledaj sjedište tvrtke
-STR_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Izgradi sjedište kompanije negdje dalje za 1% troška od vrijednosti kompanije
-STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Ne mogu izgraditi sjedište tvrke...
+STR_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Izgradi sjedište tvrtke negdje drugdje za 1% troška od cjelokupne vrijednosti tvrtke
+STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Nije moguće izgraditi sjedište tvrtke...
STR_7072_VIEW_HQ :{BLACK}Pogledaj sjedište tvrtke
STR_RELOCATE_HQ :{BLACK}Premjesti sjedište kompanije
STR_COMPANY_PASSWORD :{BLACK}Zaporka
-STR_COMPANY_PASSWORD_TOOLTIP :{BLACK}Zaštiti svoju tvrku od neovlaštenog korištenje pomoću zaporke.
+STR_COMPANY_PASSWORD_TOOLTIP :{BLACK}Zaštiti svoju tvrtku od neovlaštenog korištenja pomoću zaporke.
STR_SET_COMPANY_PASSWORD :Postavi zaporku tvrtke
STR_7073_WORLD_RECESSION_FINANCIAL :{BIGFONT}{BLACK}Svjetska recesija!{}{}Financijski struÄnjaci oÄekuju najgore zbog ekonomske krize!
STR_7074_RECESSION_OVER_UPTURN_IN :{BIGFONT}{BLACK}Recesija zavrÅ¡ena!{}{}Obrat u trgovanu daje samopouzdanje gospodarstvu jer ekonomija jaÄa!
STR_7075_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Namjesti veliku/malu veliÄinu prozora
STR_7076_COMPANY_VALUE :{GOLD}Vrijednost tvrtke: {WHITE}{CURRENCY}
STR_7077_BUY_25_SHARE_IN_COMPANY :{BLACK}Kupi 25% udjela u tvrtci
-STR_7078_SELL_25_SHARE_IN_COMPANY :{BLACK}Prodaj 25% udio u tvrtci
+STR_7078_SELL_25_SHARE_IN_COMPANY :{BLACK}Prodaj 25% udjela u tvrtci
STR_7079_BUY_25_SHARE_IN_THIS_COMPANY :{BLACK}Kupi 25% udjela u ovoj tvrtci
STR_707A_SELL_25_SHARE_IN_THIS_COMPANY :{BLACK}Prodaj 25% udjela u ovoj tvrtci
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Ne možeš kupiti 25% udjela u ovoj tvrtci...
-STR_707C_CAN_T_SELL_25_SHARE_IN :{WHITE}Ne možeš prodati 25% udjela u ovoj tvrtci...
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nije moguće kupiti 25% udjela u ovoj tvrtci...
+STR_707C_CAN_T_SELL_25_SHARE_IN :{WHITE}Nije moguće prodati 25% udjela u ovoj tvrtci...
STR_707D_OWNED_BY :{WHITE}({COMMA}% u vlasništvu {COMPANY})
STR_707E_OWNED_BY_OWNED_BY :{WHITE}({COMMA}% u vlasništvu {COMPANY}{} {COMMA}% u vlasništvu {COMPANY})
STR_707F_HAS_BEEN_TAKEN_OVER_BY :{BLACK}{BIGFONT}{COMPANY} je preuzeta od strane tvrtke {COMPANY}!
STR_7080_PROTECTED :{WHITE}Ova tvrka još nije dovoljno stara da bi trgovala udjelima...
STR_LIVERY_DEFAULT :Standardna boja
-STR_LIVERY_STEAM :Parna lokomotva
-STR_LIVERY_DIESEL :Dieselska lokomotiva
+STR_LIVERY_STEAM :Parna lokomotiva
+STR_LIVERY_DIESEL :Dizelska lokomotiva
STR_LIVERY_ELECTRIC :ElektriÄna lokomotiva
STR_LIVERY_MONORAIL :JednotraÄna lokomotiva
-STR_LIVERY_MAGLEV :Maglevska lokomotiva
+STR_LIVERY_MAGLEV :Maglev lokomotiva
STR_LIVERY_DMU :DMU
STR_LIVERY_EMU :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM :Lokomotiva s putnicima (Parna)
-STR_LIVERY_PASSENGER_WAGON_DIESEL :PutniÄka lokomotiva (dizelska)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Lokomotiva s putnicima (ElektriÄna)
+STR_LIVERY_PASSENGER_WAGON_STEAM :PutniÄka kola (parna)
+STR_LIVERY_PASSENGER_WAGON_DIESEL :PutniÄka kola (dizelska)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC :PutniÄka kola (elektriÄna)
STR_LIVERY_FREIGHT_WAGON :Teretni vagon
STR_LIVERY_BUS :Autobus
STR_LIVERY_TRUCK :Kamion
@@ -2322,7 +2334,7 @@
STR_LIVERY_SMALL_PLANE :Mali zrakoplov
STR_LIVERY_LARGE_PLANE :Veliki zrakoplov
STR_LIVERY_PASSENGER_TRAM :PutniÄki tramvaj
-STR_LIVERY_FREIGHT_TRAM :Tovarni tramvaj
+STR_LIVERY_FREIGHT_TRAM :Teretni tramvaj
STR_LIVERY_GENERAL_TIP :{BLACK}Prikaži generalne sheme boja
STR_LIVERY_TRAIN_TIP :{BLACK}Prikaži sheme boja za vlak
@@ -2334,17 +2346,17 @@
STR_LIVERY_PANEL_TIP :{BLACK}Izaberi shemu boja za promjenu, ili višestruke sheme pomoću CTRL+klik. Klikni na kućicu kako bi odredio uporabu sheme
##id 0x8000
-STR_8000_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (Para)
+STR_8000_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (parni)
STR_8001_MJS_250_DIESEL :MJS 250 (Diesel)
STR_8002_PLODDYPHUT_CHOO_CHOO :Ploddyphut Choo-Choo
STR_8003_POWERNAUT_CHOO_CHOO :Powernaut Choo-Choo
STR_8004_MIGHTYMOVER_CHOO_CHOO :Mightymover Choo-Choo
STR_8005_PLODDYPHUT_DIESEL :Ploddyphut Diesel
STR_8006_POWERNAUT_DIESEL :Powernaut Diesel
-STR_8007_WILLS_2_8_0_STEAM :Wills 2-8-0 (Para)
-STR_8008_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (Para)
-STR_8009_GINZU_A4_STEAM :Ginzu 'A4' (Para)
-STR_800A_SH_8P_STEAM :SH '8P' (Para)
+STR_8007_WILLS_2_8_0_STEAM :Wills 2-8-0 (parni)
+STR_8008_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (parni)
+STR_8009_GINZU_A4_STEAM :Ginzu 'A4' (parni)
+STR_800A_SH_8P_STEAM :SH '8P' (parni)
STR_800B_MANLEY_MOREL_DMU_DIESEL :Manley-Morel DMU (Diesel)
STR_800C_DASH_DIESEL :'Dash' (Diesel)
STR_800D_SH_HENDRY_25_DIESEL :SH/Hendry '25' (Diesel)
@@ -2526,18 +2538,18 @@
STR_80BD_MIGHTYMOVER_CANDY_TRUCK :MightyMover Kamona za slatkiše
STR_80BE_POWERNAUGHT_CANDY_TRUCK :Powernaught Kamion za slatkiše
STR_80BF_WIZZOWOW_CANDY_TRUCK :Wizzwow Kamion za slatkiše
-STR_80C0_MIGHTYMOVER_BATTERY_TRUCK :MightyMover Kamiona za baterije
-STR_80C1_POWERNAUGHT_BATTERY_TRUCK :Powernaught Kamion za baterije
-STR_80C2_WIZZOWOW_BATTERY_TRUCK :Wizzwwow Kamion za baterije
-STR_80C3_MIGHTYMOVER_FIZZY_DRINK :MightyMover Kamion za gazirana pića
-STR_80C4_POWERNAUGHT_FIZZY_DRINK :Powernaught Kamion za gazirana pića
-STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK :Wizzwow Kamion za gazirana pića
-STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK :MightyMover kamion s plastikom
-STR_80C7_POWERNAUGHT_PLASTIC_TRUCK :Powernaught kamion s plastikom
-STR_80C8_WIZZOWOW_PLASTIC_TRUCK :Wizzowow kamion s plastikom
-STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK :MightyMover kamion s žvakaÄim gumama
-STR_80CA_POWERNAUGHT_BUBBLE_TRUCK :Powernaught kamion s žvakaÄim gumama
-STR_80CB_WIZZOWOW_BUBBLE_TRUCK :Wizzowow kamion s žvakaÄim gumama
+STR_80C0_MIGHTYMOVER_BATTERY_TRUCK :MightyMover kamion za baterije
+STR_80C1_POWERNAUGHT_BATTERY_TRUCK :Powernaught kamion za baterije
+STR_80C2_WIZZOWOW_BATTERY_TRUCK :Wizzwwow kamion za baterije
+STR_80C3_MIGHTYMOVER_FIZZY_DRINK :MightyMover kamion za gazirana pića
+STR_80C4_POWERNAUGHT_FIZZY_DRINK :Powernaught kamion za gazirana pića
+STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK :Wizzwow kamion za gazirana pića
+STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK :MightyMover PlastiÄni Kamion
+STR_80C7_POWERNAUGHT_PLASTIC_TRUCK :Powernaught PlastiÄni Kamion
+STR_80C8_WIZZOWOW_PLASTIC_TRUCK :Wizzwow PlastiÄni kamion
+STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK :MightyMover kamion sa žvakaÄim gumama
+STR_80CA_POWERNAUGHT_BUBBLE_TRUCK :Powernaught kamion sa žvakaÄim gumama
+STR_80CB_WIZZOWOW_BUBBLE_TRUCK :Wizzowow kamion sa žvakaÄim gumama
STR_80CC_MPS_OIL_TANKER :MPS naftna cisterna
STR_80CD_CS_INC_OIL_TANKER :CS-Inc. naftna cisterna
STR_80CE_MPS_PASSENGER_FERRY :MPS putniÄki trajekt
@@ -2591,16 +2603,16 @@
STR_80FE_GURU_X2_HELICOPTER :Guru X2 Helicopter
STR_80FF_POWERNAUT_HELICOPTER :Powernaut Helicopter
STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE :{WHITE}Poruka od proizvoÄ‘aÄa vozila
-STR_8101_WE_HAVE_JUST_DESIGNED_A :{GOLD}Upravo smo dizajnirani novi {STRING} - jeste li zainteresirani za jednogodiÅ¡nje iskljuÄivo pravo uporabe ovog vozila, tako da vidimo kako se vozilo ponaÅ¡a prije nego Å¡to postane univerzalno dostupno?
+STR_8101_WE_HAVE_JUST_DESIGNED_A :{GOLD}Upravo smo dizajnirani novi {STRING} - jeste li zainteresirani za jednogodišnje ekskluzivno pravo uporabe ovog vozila, kako bi vidjeli kako se vozilo ponaša prije nego što postane univerzalno dostupno?
STR_8102_RAILROAD_LOCOMOTIVE :željezniÄka lokomotiva
STR_8103_ROAD_VEHICLE :cestovno vozilo
STR_8104_AIRCRAFT :zrakoplov
STR_8105_SHIP :brod
-STR_8106_MONORAIL_LOCOMOTIVE :monorail lokomotiva
+STR_8106_MONORAIL_LOCOMOTIVE :jednotraÄna željezniÄka lokomotiva
STR_8107_MAGLEV_LOCOMOTIVE :maglev lokomotiva
##id 0x8800
-STR_8800_TRAIN_DEPOT :{WHITE}{TOWN} Spremište vlakova
+STR_8800_TRAIN_DEPOT :{WHITE}Spremište vlakova grada {TOWN}
STR_8801_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi vlak je stigao na {STATION}!
STR_8802_DETAILS :{WHITE}{VEHICLE} (Detalji)
STR_8803_TRAIN_IN_THE_WAY :{WHITE}Vlak na putu
@@ -2612,16 +2624,16 @@
STR_8809_GO_TO_TRANSFER_UNLOAD :Go to {STATION} (Transferiraj i otiđi prazan)
STR_880A_GO_TO_LOAD :Idi do{STATION} (Utovar)
STR_880B_GO_TO_TRANSFER_LOAD :Idi do {STATION} (Transferiraj i priÄekaj puni utovar)
-STR_880C_GO_NON_STOP_TO :Idi non-stop do {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER :Idi non-stop do {STATION} (Transferiraj i preuzmi teret)
-STR_880E_GO_NON_STOP_TO_UNLOAD :Idi non-stop do {STATION} (Istovar)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD :Idi non-stop do {STATION} (Transferiraj i otiđi prazan)
-STR_8810_GO_NON_STOP_TO_LOAD :Idi non-stop do{STATION} (Utovar)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD :Idi non-stop do {STATION} (Transferiraj i priÄekaj puni utovar)
-STR_GO_TO_TRAIN_DEPOT :Idi do {TOWN} spremište vlakova
-STR_SERVICE_AT_TRAIN_DEPOT :Servisiraj u {TOWN} spremištu vlakova
-STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT :Idi non-stop do {TOWN} spremišta vlakova
-STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT :Servisiraj non-stop u {TOWN} ŽeljezniÄkom SkladiÅ¡tu
+STR_880C_GO_NON_STOP_TO :Idi neprekidno do {STATION}
+STR_880D_GO_TO_NON_STOP_TRANSFER :Idi neprekidno do {STATION} (Transferiraj i preuzmi teret)
+STR_880E_GO_NON_STOP_TO_UNLOAD :Idi neprekidno do {STATION} (Istovar)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD :Idi neprekidno do {STATION} (Transferiraj i otiđi prazan)
+STR_8810_GO_NON_STOP_TO_LOAD :Idi neprekidno do {STATION} (Utovar)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD :Idi neprekidno do {STATION} (Transferiraj i priÄekaj puni utovar)
+STR_GO_TO_TRAIN_DEPOT :Idi u spremište vlakova grada {TOWN}
+STR_SERVICE_AT_TRAIN_DEPOT :Servisiranje u spremištu vlakova grada {TOWN}
+STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT :Idi neprekidno do spremišta vlakova grada {TOWN}
+STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT :Servisiraj neprekidno u spremištu vlakova grada {TOWN}
STR_TIMETABLE_GO_TO :{STRING} {STRING}
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Putovanje (bez rasporeda)
@@ -2630,10 +2642,10 @@
STR_TIMETABLE_DAYS :{COMMA} dan{P "" a a}
STR_TIMETABLE_TICKS :{COMMA} tik{P "" a ova}
-STR_HEADING_FOR_TRAIN_DEPOT :{ORANGE} Krećem za {TOWN} ŽeljezniÄko SkladiÅ¡te
-STR_HEADING_FOR_TRAIN_DEPOT_VEL :{ORANGE} Krećem za {TOWN} ŽeljezniÄko SkladiÅ¡te, {VELOCITY}
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE :{LTBLUE}Servis u {TOWN} ŽeljezniÄkom SkladiÅ¡tu
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL :{LTBLUE}Servis kod {TOWN} spremište vlakova, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT :{ORANGE}Kreće se prema spremištu vlakova grada {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_VEL :{ORANGE}Kreće se prema spremištu vlakova grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE :{LTBLUE}Servisiranje u spremištu vlakova grada {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL :{LTBLUE}Servisiranje u spremištu vlakova grada {TOWN}, {VELOCITY}
STR_INVALID_ORDER :{RED} (Neispravna naredba)
@@ -2644,32 +2656,32 @@
STR_8814_TRAIN_IS_WAITING_IN_DEPOT :{WHITE}Vlak {COMMA} Äeka u spremiÅ¡tu
STR_8815_NEW_VEHICLES :{BLACK}Nova vozila
STR_8816 :{BLACK}-
-STR_8819_TRAIN_TOO_LONG :{WHITE}Vlak predugaÄak
+STR_8819_TRAIN_TOO_LONG :{WHITE}PredugaÄak vlak
STR_881A_TRAINS_CAN_ONLY_BE_ALTERED :{WHITE}Vlakovi mogu biti izmjenjeni jedino kad su zaustavljeni u spremištu
-STR_881B_TRAINS :{WHITE}{COMPANY} - {COMMA} Vlak{P "" a ova}
+STR_881B_TRAINS :{WHITE}{COMPANY} - {COMMA} vlak{P "" a ova}
STR_881C_NEW_RAIL_VEHICLES :{WHITE}Nova željezniÄka vozila
-STR_NEW_ELRAIL_VEHICLES :{WHITE}Nova vozila elektriÄne pruge
-STR_881D_NEW_MONORAIL_VEHICLES :{WHITE}Nova monorail vozila
+STR_NEW_ELRAIL_VEHICLES :{WHITE}Nova elektriÄna pružna vozila
+STR_881D_NEW_MONORAIL_VEHICLES :{WHITE}Nova jednotraÄna željezniÄka vozila
STR_881E_NEW_MAGLEV_VEHICLES :{WHITE}Nova maglev vozila
-STR_ALL_AVAIL_RAIL_VEHICLES :{WHITE}ŽeljezniÄka vozila
+STR_ALL_AVAIL_RAIL_VEHICLES :{WHITE}Pružna vozila
STR_881F_BUILD_VEHICLE :{BLACK}Izgradi vozilo
STR_CLONE_ROAD_VEHICLE :{BLACK}Kloniraj vozilo
STR_CLONE_ROAD_VEHICLE_INFO :{BLACK}Ovo će izgraditi kopiju cestovnog vozila. Control-clik će dijeliti naredbe
-STR_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju cestovnog vozila. Kliknite na ovu tipku i onda na cestovno vozilo unutar ili izvan skladišta. CTRL-klik će podijeliti naredbe
+STR_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju cestovnog vozila. Klikni na ovaj gumb i onda na cestovno vozilo unutar ili izvan spremišta. CTRL+klik će dijeliti naredbe
STR_CLONE_TRAIN :{BLACK}Kloniraj vlak
STR_CLONE_TRAIN_INFO :{BLACK}Ovo će izgraditi kopiju vlaka ukljuÄujući sve vagone. Control-klik će dijeliti naredbe
-STR_CLONE_TRAIN_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju vlaka ukljuÄujući vagone. Kliknite na ovu tipku i onda na vlak unutar ili izvan skladiÅ¡ta. CTRL-klik će podijeliti naredbe
+STR_CLONE_TRAIN_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju vlaka ukljuÄujući sve vagone. Kliknite na ovaj gumb i onda na vlak unutar ili izvan spremiÅ¡ta. CTRL-klik će dijeliti naredbe
STR_8820_RENAME :{BLACK}Preimenuj
STR_8823_SKIP :{BLACK}PreskoÄi
STR_8824_DELETE :{BLACK}Obriši
-STR_8825_NON_STOP :{BLACK}Non-stop
+STR_8825_NON_STOP :{BLACK}Neprekidno
STR_8826_GO_TO :{BLACK}Idi do
STR_8827_FULL_LOAD :{BLACK}Puni utovar
STR_8828_UNLOAD :{BLACK}Istovar
STR_REFIT :{BLACK}Prenamijeni
-STR_REFIT_TIP :{BLACK}Odaberi tip tereta za prenamijeniti u ovoj narudžbi. CTRL-klik za brisanje uputa za prenamijenu
+STR_REFIT_TIP :{BLACK}Odaberi vrstu tereta za prenamijenu u ovoj naredbi. CTRL+klik kako bi uklonio naputak za prenamjenu
STR_REFIT_ORDER :(Prenamijeni u {STRING})
STR_TIMETABLE_VIEW :{BLACK} Raspored
STR_TIMETABLE_VIEW_TOOLTIP :{BLACK}Prebacivanje na pogled rasporeda
@@ -2677,53 +2689,53 @@
STR_882A_END_OF_ORDERS :{SETX 10}- - Kraj naredbi - -
STR_FULLLOAD_OR_SERVICE :{SKIP}{SKIP}{STRING}
STR_SERVICE :{BLACK}Servis
-STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE :{WHITE}Ne mogu izgraditi željezniÄko vozilo...
+STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE :{WHITE}Nije moguće izgraditi željezniÄko vozilo...
STR_882C_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
STR_882D_VALUE :{LTBLUE}{ENGINE}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
STR_882E :{WHITE}{VEHICLE}
STR_882F_LOADING_UNLOADING :{LTBLUE}Utovar / Istovar
-STR_TRAIN_MUST_BE_STOPPED :{WHITE}Vlak mora biti zaustavljan unutar skladišta
-STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Ne mogu poslati vlak u spremište...
+STR_TRAIN_MUST_BE_STOPPED :{WHITE}Vlak mora biti zaustavljen unutar spremišta
+STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Nije moguće poslati vlak u spremište...
STR_8831_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Nema mjesta za nove naredbe
STR_8832_TOO_MANY_ORDERS :{WHITE}Previše naredbi
-STR_8833_CAN_T_INSERT_NEW_ORDER :{WHITE}Ne možeš ubaciti novu naredbu...
-STR_8834_CAN_T_DELETE_THIS_ORDER :{WHITE}Ne možeš obrisati ovu naredbu...
-STR_8835_CAN_T_MODIFY_THIS_ORDER :{WHITE}Ne možeš izmjeniti ovu naredbu...
-STR_CAN_T_MOVE_THIS_ORDER :{WHITE}Ne mogu pomaknuti ovu naredbu...
-STR_CAN_T_SKIP_ORDER :{WHITE}Ne mohu preskoÄiti trenutaÄnu naredbu...
-STR_CAN_T_SKIP_TO_ORDER :{WHITE}Nwe mogu skoÄiti na odabranu naredbu...
-STR_8837_CAN_T_MOVE_VEHICLE :{WHITE}Ne možeš pomaknuti vozilo...
+STR_8833_CAN_T_INSERT_NEW_ORDER :{WHITE}Nije moguće ubaciti novu naredbu...
+STR_8834_CAN_T_DELETE_THIS_ORDER :{WHITE}Nije moguće obrisati ovu naredbu...
+STR_8835_CAN_T_MODIFY_THIS_ORDER :{WHITE}Nije moguće izmijeniti ovu naredbu...
+STR_CAN_T_MOVE_THIS_ORDER :{WHITE}Nije moguće pomaknuti ovu naredbu...
+STR_CAN_T_SKIP_ORDER :{WHITE}Neije moguće preskoÄiti trenutnu naredbu...
+STR_CAN_T_SKIP_TO_ORDER :{WHITE}Nije moguće skoÄiti na odabranu naredbu...
+STR_8837_CAN_T_MOVE_VEHICLE :{WHITE}Nije moguće ukloniti vozilo...
STR_REAR_ENGINE_FOLLOW_FRONT_ERROR :{WHITE}Stražnja lokomotiva će uvijek pratiti svog prednjeg dvojnika
STR_8838_N_A :N/A{SKIP}
-STR_8839_CAN_T_SELL_RAILROAD_VEHICLE :{WHITE}Ne možeÅ¡ prodati željezniÄko vozilo
+STR_8839_CAN_T_SELL_RAILROAD_VEHICLE :{WHITE}Nije moguće prodati željezniÄko vozilo
STR_883A_UNABLE_TO_FIND_ROUTE_TO :{WHITE}Ne može pronaći put do lokalnog spremišta
-STR_883B_CAN_T_STOP_START_TRAIN :{WHITE}Ne možeš zaustaviti/pokrenuti vlak...
+STR_883B_CAN_T_STOP_START_TRAIN :{WHITE}Nije moguće zaustaviti/pokrenuti vlak...
STR_883C_SERVICING_INTERVAL_DAYS :{BLACK}Servisni interval: {LTBLUE}{COMMA}dana{BLACK} Zadnji servis: {LTBLUE}{DATE_LONG}
STR_SERVICING_INTERVAL_PERCENT :{BLACK}Servisni interval: {LTBLUE}{COMMA}%{BLACK} Zadnji servis: {LTBLUE}{DATE_LONG}
STR_883D_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Vlakovi - klikni na vlak za informacije
STR_883E_BUILD_NEW_TRAINS_REQUIRES :{BLACK}Izgradi/kupi nove vlakove (zahtijeva spremište vlakova)
STR_883F_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Vlakovi - klikni na vlak za informacije., vuci vozilo kako bi dodao/oduzeo od vlaka
STR_8840_BUILD_NEW_TRAIN_VEHICLE :{BLACK}Izgradi novi vlak
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE :{BLACK}Povuci vlak ovdje za prodaju
-STR_8842_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Centriraj glavni pogled na lokaciju željezniÄkog skladiÅ¡ta
-STR_8843_TRAIN_VEHICLE_SELECTION :{BLACK}Lista za odabiranje vlakova - klikni na vlak za informacije
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE :{BLACK}Ovdje povuci vlak kako bi ga prodao
+STR_8842_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Centriraj glavni pogled na lokaciju željezniÄkog spremiÅ¡ta
+STR_8843_TRAIN_VEHICLE_SELECTION :{BLACK}Popis izabranih vlakova - klikni na vlak za informacije
STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN :{BLACK}Izgradi oznaÄeni vlak
-STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Preimenuj tip vlaka
-STR_8846_CURRENT_TRAIN_ACTION_CLICK :{BLACK}Akcije trenutnog vlaka - klikni za zaustavljanje/pokretanje vlaka
+STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Preimenuj vrstu vagona
+STR_8846_CURRENT_TRAIN_ACTION_CLICK :{BLACK}Trenutna radnja vlaka - klikni ovdje kako bi zaustavio/pokrenuo vlak
STR_8847_SHOW_TRAIN_S_ORDERS :{BLACK}Pokaži naredbe vlaka
STR_8848_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Centriraj glavni pogled na lokaciju vlaka
-STR_8849_SEND_TRAIN_TO_DEPOT :{BLACK}Pošalji vlak u skladište. CTRL+klik će ga samo servisirati
-STR_884A_FORCE_TRAIN_TO_PROCEED :{BLACK}Natjeraj vlak da nastavi bez Äekanja za odobrenjem signala
+STR_8849_SEND_TRAIN_TO_DEPOT :{BLACK}Pošalji vlak u spremište. CTRL+klik će samo servisirati
+STR_884A_FORCE_TRAIN_TO_PROCEED :{BLACK}Natjeraj vlak da nastavi bez Äekanja signala odobrenja
STR_884B_REVERSE_DIRECTION_OF_TRAIN :{BLACK}Okreni smjer vlaka
-STR_884C_SHOW_TRAIN_DETAILS :{BLACK}Prikaži detalje vlaka
+STR_884C_SHOW_TRAIN_DETAILS :{BLACK}Pokaži detalje vlaka
STR_884D_INCREASE_SERVICING_INTERVAL :{BLACK}Povećaj servisni interval
STR_884E_DECREASE_SERVICING_INTERVAL :{BLACK}Smanji servisni interval
-STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED :{BLACK}Pokaži detalje prevoženog tereta
+STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED :{BLACK}Pokaži detalje tereta koji se prevozi
STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES :{BLACK}Pokaži detalje vagona
-STR_8851_SHOW_CAPACITIES_OF_EACH :{BLACK}Pokaži kapacitet svakog vagona
-STR_8852_SHOW_TOTAL_CARGO :{BLACK}Pokaži potpuni kapacitet vlaka, podijeljen prema tipu tereta
-STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Lista naredbi - klikni na naredbu da ju oznaÄiÅ¡. CTRL + klik klizi na stanicu
-STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}PreskoÄi trenutnu naredbu, i pokreni slijedeću. CTRL + klik preskaÄe na odabranu naredbu
+STR_8851_SHOW_CAPACITIES_OF_EACH :{BLACK}Pokaži nosivosti svakog vagona
+STR_8852_SHOW_TOTAL_CARGO :{BLACK}Pokaži ukupnu nosivost vlaka podijeljenu prema vrsti tereta
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Popis naredbi - klikni na naredbu kako bi ju oznaÄio. CTRL + klik klizi na stanicu
+STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}PreskoÄi trenutnu naredbu i pokreni slijedeću. CTRL + klik preskaÄe na odabranu naredbu
STR_8854_DELETE_THE_HIGHLIGHTED :{BLACK}ObriÅ¡i oznaÄenu naredbu
STR_8855_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Napravi oznaÄenu naredbu da bude non-stop
STR_8856_INSERT_A_NEW_ORDER_BEFORE :{BLACK}Umetni novu naredbu prije odabrane naredbe, ili dodaj na kraj liste
@@ -2742,126 +2754,126 @@
STR_885F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY})
STR_8860_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od zadnjeg servisa: {LTBLUE}{COMMA}
STR_8861_STOPPED :{RED}Zaustavljen
-STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Ne mogu natjerati vlak da ignorira znakove dok je opasnost...
+STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Nije moguće natjerati vlak da ignorira signale dok traje opasnost...
STR_8863_CRASHED :{RED}Slupan!
STR_8865_NAME_TRAIN :{WHITE}Imenuj vlak
-STR_8866_CAN_T_NAME_TRAIN :{WHITE}Ne mogu imenovati vlak...
+STR_8866_CAN_T_NAME_TRAIN :{WHITE}Nije moguće imenovati vlak...
STR_8867_NAME_TRAIN :{BLACK}Imenuj vlak
-STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Vlak se sudario!{}{COMMA} poginulih u eksploziji nakon sudara
-STR_8869_CAN_T_REVERSE_DIRECTION :{WHITE}Ne mogu promijeniti smjer vlaka...
-STR_886A_RENAME_TRAIN_VEHICLE_TYPE :{WHITE}Preimenuj vrstu vlaka
-STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Ne mogu preimenovati tip vagona...
-STR_886D_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Naprvi da oznaÄeni red prisili vozilo da izbaci teret
+STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Vlak se sudario!{}{COMMA} poginu{P o la lih} u eksploziji nakon sudara
+STR_8869_CAN_T_REVERSE_DIRECTION :{WHITE}Nije moguće promijeniti smjer vlaka...
+STR_886A_RENAME_TRAIN_VEHICLE_TYPE :{WHITE}Preimenuj vrstu vagona
+STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Nije moguće preimenovati vrstu vagona...
+STR_886D_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Napravi da oznaÄena naredba prisili vozilo da izbaci teret
STR_886F_TRANSFER :{BLACK}Transfer
STR_CLEAR_TIME :{BLACK}Obriši vrijeme
STR_RESET_LATENESS :{BLACK}PoniÅ¡ti BrojaÄ KaÅ¡njenja
STR_TRAIN_STOPPING :{RED}Zaustavljam
STR_TRAIN_STOPPING_VEL :{RED}Zaustavljam, {VELOCITY}
-STR_INCOMPATIBLE_RAIL_TYPES :Nekompatibilan tip traÄnica
+STR_INCOMPATIBLE_RAIL_TYPES :Nekompatibilna vrsta traÄnica
STR_TRAIN_NO_POWER :{RED}Nema struje
-STR_TRAIN_START_NO_CATENARY :Ovim traÄnicama nedostaje vuÄna užad, tako da vlak ne može krenuti
+STR_TRAIN_START_NO_CATENARY :Ovoj pruzi nedostaje vuÄna užad, stoga vlak ne može krenuti
STR_NEW_VEHICLE_NOW_AVAILABLE :{BLACK}{BIGFONT}Novi {STRING} je sada dostupan!
STR_NEW_VEHICLE_TYPE :{BLACK}{BIGFONT}{ENGINE}
STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Novi {STRING} je sada dostupan! - {ENGINE}
-STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Ne mogu rasporediti vozilo...
+STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Nije moguće rasporediti vozilo...
STR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Vozila mogu Äekati samo na stanicama.
STR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Ovo vozilo se ne zaustavlja na ovoj stanici.
STR_TIMETABLE_CHANGE_TIME :{BLACK}Promijeni Vrijeme
STR_TIMETABLE_STATUS_ON_TIME :Ovo vozilo vozi na vrijeme
STR_TIMETABLE_STATUS_LATE :Ovo vozilo trenutaÄno {STRING} kasni
STR_TIMETABLE_STATUS_EARLY :Ovo vozilo je stiglo {STRING} ranije
-STR_TIMETABLE_TOTAL_TIME :Ovaj raspored će trebati {STRING} za završetak
-STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :OVaj raspored će trebati najmanje {STRING} za završetak (nije sve raspoređeno)
+STR_TIMETABLE_TOTAL_TIME :Ovaj raspored trebat će {STRING} za završetak
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :Ovaj raspored trebat će najmanje {STRING} za završetak (nije sve raspoređeno)
STR_TIMETABLE_AUTOFILL :{BLACK}Automatsko punjenje
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Napuni raspored automatski sa vrijednostima iz prvog puta
##id 0x9000
STR_9000_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Cestovno vozilo na putu
-STR_9001_ROAD_VEHICLES :{WHITE}{COMPANY} - {COMMA} Cestovno vozilo{P "" a a}
+STR_9001_ROAD_VEHICLES :{WHITE}{COMPANY} - {COMMA} cestovn{P o a ih} vozil{P o a a}
STR_9002 :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT :{WHITE}{TOWN} Spremište cestovnih vozila
+STR_9003_ROAD_VEHICLE_DEPOT :{WHITE}Spremište cestovnih vozila grada {TOWN}
STR_9004_NEW_VEHICLES :{BLACK}Nova vozila
STR_9006_NEW_ROAD_VEHICLES :{WHITE}Nova cestovna vozila
STR_9007_BUILD_VEHICLE :{BLACK}Izgradi vozilo
-STR_9009_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Ne mogu izgraditi cestovno vozilo...
+STR_9009_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Nije moguće izgraditi cestovno vozilo...
STR_900C_DETAILS :{WHITE}{VEHICLE} (Detalji)
STR_900D_AGE_RUNNING_COST_YR :{BLACK}Starost: {LTBLUE}{STRING}{BLACK} Trošak uporabe {LTBLUE}{CURRENCY}/god
STR_900E_MAX_SPEED :{BLACK}Maks brzina: {LTBLUE}{VELOCITY}
STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY})
STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarovi od posljednjeg servisa: {LTBLUE}{COMMA}
STR_9011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_9012_CAPACITY :{BLACK}Kapacitet: {LTBLUE}{CARGO}
+STR_9012_CAPACITY :{BLACK}Nosivost: {LTBLUE}{CARGO}
STR_9013_MUST_BE_STOPPED_INSIDE :{WHITE}...mora biti zaustavljen unutar spremišta cestovnih vozila
-STR_9014_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Ne mogu prodati cestovno vozilo...
-STR_9015_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}Ne mogu zaustaviti/pokrenuti cestovno vozilo...
+STR_9014_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Nije moguće prodati cestovno vozilo...
+STR_9015_CAN_T_STOP_START_ROAD_VEHICLE :{WHITE}Nije moguće zaustaviti/pokrenuti cestovno vozilo...
STR_9016_ROAD_VEHICLE_IS_WAITING :{WHITE}Cestovno vozilo {COMMA} Äeka u spremiÅ¡tu
-STR_HEADING_FOR_ROAD_DEPOT :{ORANGE}Kreće se prema {TOWN} cestovnom spremištu
-STR_HEADING_FOR_ROAD_DEPOT_VEL :{ORANGE}Kreće se prema {TOWN} cestovnom spremištu, {VELOCITY}
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE :{LTBLUE}Servisiranje u {TOWN} cestovnom spremištu
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL :{LTBLUE}Seervisiranje u {TOWN} cestovnom spremištu, {VELOCITY}
-STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT :{WHITE}Ne mogu poslati vozilo u spremište...
+STR_HEADING_FOR_ROAD_DEPOT :{ORANGE}Kreće se prema cestovnom spremištu grada {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_VEL :{ORANGE}Kreće se prema cestovnom spremištu grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE :{LTBLUE}Servisiranje u cestovnom spremištu grada {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL :{LTBLUE}Servisiranje u cestovnom spremištu grada {TOWN}, {VELOCITY}
+STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT :{WHITE}Nije moguće poslati vozilo u spremište...
STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Ne mogu pronaći lokalno spremište
STR_901A_ROAD_VEHICLES_CLICK_ON :{BLACK}Cestovna vozila - klikni na vozilo za informacije
STR_901B_BUILD_NEW_ROAD_VEHICLES :{BLACK}Izgradi nova cestovna vozila (zahtijeva spremište cestovnih vozila)
STR_901C_CURRENT_VEHICLE_ACTION :{BLACK}Trenutna radnja vozila - klikni ovdje kako bi zaustavio/pokrenuo vozilo
-STR_901D_SHOW_VEHICLE_S_ORDERS :{BLACK}Prikaži naredbe vozila
+STR_901D_SHOW_VEHICLE_S_ORDERS :{BLACK}Pokaži naredbe vozila
STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE :{BLACK}Centriraj glavni pogled na lokaciju vozila
STR_901F_SEND_VEHICLE_TO_DEPOT :{BLACK}Pošalji vozilo u spremište. CTRL+klik će samo servisirati
STR_9020_FORCE_VEHICLE_TO_TURN_AROUND :{BLACK}Natjeraj vozila da se okrene natrag
-STR_9021_SHOW_ROAD_VEHICLE_DETAILS :{BLACK}Prikaži detalje cestovnog vozila
+STR_9021_SHOW_ROAD_VEHICLE_DETAILS :{BLACK}Pokaži detalje cestovnog vozila
STR_9022_VEHICLES_CLICK_ON_VEHICLE :{BLACK}Vozila - klikni na vozilo za informaciju
STR_9023_BUILD_NEW_ROAD_VEHICLE :{BLACK}Izgradi novo cestovno vozilo
STR_9024_DRAG_ROAD_VEHICLE_TO_HERE :{BLACK}Povuci cestovno vozilo ovdje kako bi ga prodao
STR_9025_CENTER_MAIN_VIEW_ON_ROAD :{BLACK}Centriraj glavni pogled na lokaciju spremišta cestovnih vozila
-STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Popis cestovnih vozila - pritisni na vozilo za informacije
+STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Popis izabranih cestovnih vozila - klikni na vozilo za informacije
STR_9027_BUILD_THE_HIGHLIGHTED_ROAD :{BLACK}Izgradi oznaÄeno cestovno vozilo
STR_902A_COST_SPEED_RUNNING_COST :{BLACK}Trošak: {CURRENCY}{}Brzina: {VELOCITY}{}Trošak uporabe: {CURRENCY}/god{}Kapacitet: {CARGO}
-STR_ARTICULATED_RV_CAPACITY :{BLACK}Kapacitet: {LTBLUE}
+STR_ARTICULATED_RV_CAPACITY :{BLACK}Nosivost: {LTBLUE}
STR_BARE_CARGO :{CARGO}
STR_902C_NAME_ROAD_VEHICLE :{WHITE}Imenuj cestovno vozilo
-STR_902D_CAN_T_NAME_ROAD_VEHICLE :{WHITE}Ne mogu imenovati cestovno vozilo...
+STR_902D_CAN_T_NAME_ROAD_VEHICLE :{WHITE}Nije moguće imenovati cestovno vozilo...
STR_902E_NAME_ROAD_VEHICLE :{BLACK}Imenuj cestovno vozilo
STR_902F_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi bus je stigao na {STATION}!
STR_9030_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi kamion je stigao na {STATION}!
STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}GraÄ‘ani slave . . .{}Prvi putniÄki tramvaj je stigao na {STATION}!
-STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni tramvaj je stigao u {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Građani slave . . .{}Prvi teretni tramvaj je stigao na {STATION}!
STR_9031_ROAD_VEHICLE_CRASH_DRIVER :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}VozaÄ poginuo u eksploziji nakon sudara s vlakom
STR_9032_ROAD_VEHICLE_CRASH_DIE :{BLACK}{BIGFONT}Sudar cestovnog vozila!{}{COMMA} poginulih u eksploziji nakon sudara s vlakom
-STR_9033_CAN_T_MAKE_VEHICLE_TURN :{WHITE}Ne mogu natjerati vozilo da se okrene...
+STR_9033_CAN_T_MAKE_VEHICLE_TURN :{WHITE}Nije moguće natjerati vozilo da se okrene...
STR_ONLY_TURN_SINGLE_UNIT :{WHITE}Ne mogu okreniti vozila koja se sastoje od više jedinica
STR_9034_RENAME :{BLACK}Preimenuj
STR_9035_RENAME_ROAD_VEHICLE_TYPE :{BLACK}Preimenuj vrstu cestovnog vozila
STR_9036_RENAME_ROAD_VEHICLE_TYPE :{WHITE}Preimenuj vrstu cestovnog vozila
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Ne mogu preimenovati vrstu cestovnog vozila...
-STR_9038_GO_TO_ROADVEH_DEPOT :Idi prema spremištu cestovnih vozila {TOWN}
-STR_SERVICE_AT_ROADVEH_DEPOT :Servisiranje pri {TOWN} spremištu cestovnih vozila
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Nije moguće preimenovati vrstu cestovnog vozila...
+STR_9038_GO_TO_ROADVEH_DEPOT :Idi prema spremištu cestovnih vozila grada {TOWN}
+STR_SERVICE_AT_ROADVEH_DEPOT :Servisiranje u spremištu cestovnih vozila grada {TOWN}
-STR_REFIT_ROAD_VEHICLE_TO_CARRY :{BLACK}Prenamijeni cestovno vozilo za prijevoz druge vrste tereta
+STR_REFIT_ROAD_VEHICLE_TO_CARRY :{BLACK}Prenamijeni cestovno vozilo za prijevoz neke druge vrste tereta
STR_REFIT_ROAD_VEHICLE :{BLACK}Prenamijeni cestovno vozilo
-STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED :{BLACK}Prenamijeni cestovno vozilo za prijevoz druge vrste tereta
-STR_REFIT_ROAD_VEHICLE_CAN_T :{WHITE}Ne mogu prenamijeniti cestovno vozilo...
-STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Izaberi vrstu tereta koje će cestovno vozilo prevoziti
+STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED :{BLACK}Prenamijeni cestovno vozilo za prijevoz oznaÄene vrste tereta
+STR_REFIT_ROAD_VEHICLE_CAN_T :{WHITE}Nije moguće prenamijeniti cestovno vozilo...
+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 ne mogu izgraditi pristanište...
-STR_9803_SHIP_DEPOT :{WHITE}{TOWN} Spremište brodova
+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
-STR_9805_SHIPS :{WHITE}{COMPANY} - {COMMA} Brod{P "" a ova}
+STR_9805_SHIPS :{WHITE}{COMPANY} - {COMMA} brod{P "" a ova}
STR_9808_NEW_SHIPS :{WHITE}Novi brodovi
STR_9809_BUILD_SHIP :{BLACK}Izgradi brod
STR_CLONE_SHIP :{BLACK}Kloniraj brod
STR_CLONE_SHIP_INFO :{BLACK}Ovo će izgradi kopiju broda. Control-klik će dijeliti naredbe
-STR_CLONE_SHIP_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju broda. Kliknite na ovu tipku i onda na brod unutar ili izvan skladišta. CTRL-klik će podijeliti naredbe
+STR_CLONE_SHIP_DEPOT_INFO :{BLACK}Ovo će napraviti kopiju broda. Klikni na ovaj gumb i onda na brod unutar ili izvan spremišta. CTRL+klik će dijeliti naredbe
STR_980B_SHIP_MUST_BE_STOPPED_IN :{WHITE}Brod mora biti zaustavljen u spremištu
-STR_980C_CAN_T_SELL_SHIP :{WHITE}Ne mogu prodati brod...
-STR_980D_CAN_T_BUILD_SHIP :{WHITE}Ne mogu izgraditi brod...
+STR_980C_CAN_T_SELL_SHIP :{WHITE}Nije moguće prodati brod...
+STR_980D_CAN_T_BUILD_SHIP :{WHITE}Nije moguće izgraditi brod...
STR_980E_SHIP_IN_THE_WAY :{WHITE}Smeta brod
STR_980F :{WHITE}{VEHICLE}
STR_9811_DETAILS :{WHITE}{VEHICLE} (Detalji)
@@ -2870,66 +2882,66 @@
STR_9814_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY})
STR_9815_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od posljednjeg servisa: {LTBLUE}{COMMA}
STR_9816_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađeno: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_9817_CAPACITY :{BLACK}Zapremnina: {LTBLUE}{CARGO}
-STR_9818_CAN_T_STOP_START_SHIP :{WHITE}Ne mogu pokrenuti/zaustaviti brod...
-STR_9819_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Ne mogu poslati brod u skladište...
-STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Ne mogu naći lokalno spremište
-STR_HEADING_FOR_SHIP_DEPOT :{ORANGE}Kreće se prema {TOWN} spremištu brodova
-STR_HEADING_FOR_SHIP_DEPOT_VEL :{ORANGE}Kreće se prema {TOWN} spremištu brodova, {VELOCITY}
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE :{LTBLUE}Servisiranje u {TOWN} spremištu brodova
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL :{LTBLUE}Servisiranje u {TOWN} spremištu brodova, {VELOCITY}
+STR_9817_CAPACITY :{BLACK}Nosivost: {LTBLUE}{CARGO}
+STR_9818_CAN_T_STOP_START_SHIP :{WHITE}Nije moguće pokrenuti/zaustaviti brod...
+STR_9819_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Nije moguće poslati brod u spremište...
+STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Ne mogu pronaći lokalno spremište
+STR_HEADING_FOR_SHIP_DEPOT :{ORANGE}Kreće se prema spremištu brodova grada {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_VEL :{ORANGE}Kreće se prema spremištu brodova grada {TOWN}, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE :{LTBLUE}Servisiranje u spremištu brodova grada {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL :{LTBLUE}Servisiranje u spremištu brodova grada {TOWN}, {VELOCITY}
STR_981C_SHIP_IS_WAITING_IN_DEPOT :{WHITE}Brod {COMMA} Äeka u spremiÅ¡tu
STR_981D_BUILD_SHIP_DOCK :{BLACK}Izgradi brodsko pristanište
-STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING :{BLACK}Izgradi spremište brodova (za gradnu i servisiranje brodova)
+STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING :{BLACK}Izgradi spremište brodova (za izgradnju i servisiranje brodova)
STR_981F_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Brodovi - klikni na brod za informacije
STR_9820_BUILD_NEW_SHIP :{BLACK}Izgradi novi brod
STR_9821_DRAG_SHIP_TO_HERE_TO_SELL :{BLACK}Povuci brod ovdje kako bi ga prodao
STR_9822_CENTER_MAIN_VIEW_ON_SHIP :{BLACK}Centriraj glavni pogled na lokaciju spremišta brodova
STR_9823_SHIPS_CLICK_ON_SHIP_FOR :{BLACK}Brodovi - klikni na brod za informacije
STR_9824_BUILD_NEW_SHIPS_REQUIRES :{BLACK}Izgradi nove brodove (zahtijeva spremište brodova)
-STR_9825_SHIP_SELECTION_LIST_CLICK :{BLACK}Popis brodova - pritisni na brod za informacije
+STR_9825_SHIP_SELECTION_LIST_CLICK :{BLACK}Popis izabranih brodova - klikni na brod za informacije
STR_9826_BUILD_THE_HIGHLIGHTED_SHIP :{BLACK}Izgradi oznaÄeni brod
-STR_9827_CURRENT_SHIP_ACTION_CLICK :{BLACK}Trenutna radnja broda - pritisni ovdje za zaustavljanje/pokretanje broda
-STR_9828_SHOW_SHIP_S_ORDERS :{BLACK}Prikaži naredbe broda
+STR_9827_CURRENT_SHIP_ACTION_CLICK :{BLACK}Trenutna radnja broda - klikni ovdje kako bi zaustavio/pokrenuo brod
+STR_9828_SHOW_SHIP_S_ORDERS :{BLACK}Pokaži naredbe broda
STR_9829_CENTER_MAIN_VIEW_ON_SHIP :{BLACK}Centriraj glavni pogled na lokaciju broda
STR_982A_SEND_SHIP_TO_DEPOT :{BLACK}Pošalji brod u spremište. CTRL+klik će samo servisirati
-STR_982B_SHOW_SHIP_DETAILS :{BLACK}Prikaži detalje broda
-STR_982E_COST_MAX_SPEED_CAPACITY :{BLACK}Trošak {CURRENCY} Maks. brzina: {VELOCITY}{}Kapacitet: {CARGO}{}Trošak uporabe: {CURRENCY}/god
+STR_982B_SHOW_SHIP_DETAILS :{BLACK}Pokaži detalje broda
+STR_982E_COST_MAX_SPEED_CAPACITY :{BLACK}Trošak {CURRENCY} Maks. brzina: {VELOCITY}{}Nosivost: {CARGO}{}Trošak uporabe: {CURRENCY}/god
STR_982F_NAME_SHIP :{BLACK}Imenuj brod
STR_9831_NAME_SHIP :{WHITE}Imenuj brod
-STR_9832_CAN_T_NAME_SHIP :{WHITE}Ne mogu imenovati brod...
+STR_9832_CAN_T_NAME_SHIP :{WHITE}Nije moguće imenovati brod...
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi brod je stigao u {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Smjesti plutaÄu koja može biti koriÅ¡tena kao pokazatelj puta
-STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Ne mogu staviti plutaÄu ovdje...
+STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Nije moguće staviti plutaÄu ovdje...
STR_9836_RENAME :{BLACK}Preimenuj
STR_9837_RENAME_SHIP_TYPE :{BLACK}Preimenuj vrstu broda
STR_9838_RENAME_SHIP_TYPE :{WHITE}Preimenuj vrstu broda
-STR_9839_CAN_T_RENAME_SHIP_TYPE :{WHITE}Ne mogu preimenovati vrstu broda...
-STR_983A_REFIT_CARGO_SHIP_TO_CARRY :{BLACK}Prenamijeni teretni brod da nosi neku drugu vrstu tereta
+STR_9839_CAN_T_RENAME_SHIP_TYPE :{WHITE}Nije moguće preimenovati vrstu broda...
+STR_983A_REFIT_CARGO_SHIP_TO_CARRY :{BLACK}Prenamijeni teretni brod za prijevoz neke druge vrste tereta
STR_983B_REFIT :{WHITE}{VEHICLE} (Prenamijeni)
STR_983C_REFIT_SHIP :{BLACK}Prenamijeni brod
-STR_983D_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Odabri vrstu tereta za prijevoz brodom:
-STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED :{BLACK}Prenamjeni brod za prijevoz oznaÄene vrste tereta
-STR_983F_SELECT_CARGO_TYPE_TO_CARRY :{GOLD}Odabri vrstu tereta za prijevoz:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova zapremnina: {GOLD}{CARGO}{}{BLACK}Cijena prenamjene: {GOLD}{CURRENCY}
-STR_9841_CAN_T_REFIT_SHIP :{WHITE}Ne mogu prenamijeniti brod...
+STR_983D_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Odaberi vrstu tereta za prijevoz brodom
+STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED :{BLACK}Prenamijeni brod za prijevoz oznaÄene vrste tereta
+STR_983F_SELECT_CARGO_TYPE_TO_CARRY :{GOLD}Odaberi vrstu tereta za prijevoz:
+STR_9840_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova nosivost: {GOLD}{CARGO}{}{BLACK}Cijena prenamjene: {GOLD}{CURRENCY}
+STR_9841_CAN_T_REFIT_SHIP :{WHITE}Nije moguće prenamijeniti brod...
STR_9842_REFITTABLE :(prenamjenjiv)
-STR_GO_TO_SHIP_DEPOT :Idi u {TOWN} spremište brodova
-SERVICE_AT_SHIP_DEPOT :Servis u brodskom spremištu grada {TOWN}
+STR_GO_TO_SHIP_DEPOT :Idi u spremište brodova grada {TOWN}
+SERVICE_AT_SHIP_DEPOT :Servis u spremištu brodova grada {TOWN}
##id 0xA000
STR_A000_AIRPORTS :{WHITE}ZraÄne luke
-STR_A001_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Ne možeÅ¡ graditi zraÄnu luku ovdje...
-STR_A002_AIRCRAFT_HANGAR :{WHITE}{STATION} Spremište zrakoplova
+STR_A001_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Ovdje nije moguće izgraditi zraÄnu luku...
+STR_A002_AIRCRAFT_HANGAR :{WHITE}{STATION} Zrakoplovni hangar
STR_A003_NEW_AIRCRAFT :{BLACK}Novi zrakoplov
STR_CLONE_AIRCRAFT :{BLACK}Kloniraj zrakoplov
STR_CLONE_AIRCRAFT_INFO :{BLACK}Ovo će izgraditi kopiju zrakoplova. Control-klik će dijeliti naredbe
-STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Ovo će napraviti kopiju zrakoplova. Klikni ovaj gumb i onda na zrakoplov unutar ili izvan hangara. Control+klik će dijeliti naredbe.
+STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Ovo će napraviti kopiju zrakoplova. Klikni ovaj gumb i onda na zrakoplov unutar ili izvan hangara. Control+klik će dijeliti naredbe
STR_A005_NEW_AIRCRAFT :{WHITE}Novi zrakoplov
STR_A006_BUILD_AIRCRAFT :{BLACK}Izgradi zrakoplov
-STR_A008_CAN_T_BUILD_AIRCRAFT :{WHITE}Ne mogu izgraditi zrakoplov...
-STR_A009_AIRCRAFT :{WHITE}{COMPANY} - {COMMA} zrakoplov
+STR_A008_CAN_T_BUILD_AIRCRAFT :{WHITE}Nije moguće izgraditi zrakoplov...
+STR_A009_AIRCRAFT :{WHITE}{COMPANY} - {COMMA} zrakoplova
STR_A00A :{WHITE}{VEHICLE}
STR_A00B_ORDERS :{WHITE}{VEHICLE} (Naredbe)
STR_A00C_DETAILS :{WHITE}{VEHICLE} (Detalji)
@@ -2938,38 +2950,38 @@
STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Dobit ove godine: {LTBLUE}{CURRENCY} (prošle godine: {CURRENCY})
STR_A010_RELIABILITY_BREAKDOWNS :{BLACK}Pouzdanost: {LTBLUE}{COMMA}% {BLACK}Kvarova od poslijednjeg servisa: {LTBLUE}{COMMA}
STR_A011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
-STR_A012_CAN_T_SEND_AIRCRAFT_TO :{WHITE}Ne mogu poslati zrakoplov u hangar
-STR_HEADING_FOR_HANGAR :{ORANGE}Putuje prema {STATION} hangaru
-STR_HEADING_FOR_HANGAR_VEL :{ORANGE}Putuje prema {STATION} hangaru, {VELOCITY}
-STR_HEADING_FOR_HANGAR_SERVICE :{LTBLUE}Servis u {STATION} hangaru
-STR_HEADING_FOR_HANGAR_SERVICE_VEL :{LTBLUE}Servis u {STATION} hangaru, {VELOCITY}
+STR_A012_CAN_T_SEND_AIRCRAFT_TO :{WHITE}Nije moguće poslati zrakoplov u hangar
+STR_HEADING_FOR_HANGAR :{ORANGE}Putuje prema hangaru stanice {STATION}
+STR_HEADING_FOR_HANGAR_VEL :{ORANGE}Putuje prema hangaru stanice {STATION}, {VELOCITY}
+STR_HEADING_FOR_HANGAR_SERVICE :{LTBLUE}Servisiranje u hangaru stanice {STATION}
+STR_HEADING_FOR_HANGAR_SERVICE_VEL :{LTBLUE}Servisiranje u hangaru stanice {STATION}, {VELOCITY}
STR_A014_AIRCRAFT_IS_WAITING_IN :{WHITE}Zrakoplov {COMMA} Äeka u hangaru
STR_A015_AIRCRAFT_IN_THE_WAY :{WHITE}Smeta zrakoplov
-STR_A016_CAN_T_STOP_START_AIRCRAFT :{WHITE}Ne mogu zaustaviti/pokrenuti zrakoplov...
+STR_A016_CAN_T_STOP_START_AIRCRAFT :{WHITE}Nije moguće zaustaviti/pokrenuti zrakoplov...
STR_A017_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Zrakoplov je u letu
STR_A019_CAPACITY :{BLACK}Nosivost: {LTBLUE}{CARGO}, {CARGO}
STR_A01A_CAPACITY :{BLACK}Nosivost: {LTBLUE}{CARGO}
STR_A01B_AIRCRAFT_MUST_BE_STOPPED :{WHITE}Zrakoplov mora biti zaustavljen u hangaru
-STR_A01C_CAN_T_SELL_AIRCRAFT :{WHITE}Ne možeš prodati zrakoplov...
+STR_A01C_CAN_T_SELL_AIRCRAFT :{WHITE}Nije moguće prodati zrakoplov...
STR_A01D_AIRPORT_CONSTRUCTION :Izgradnja zraÄne luke
STR_A01E_BUILD_AIRPORT :{BLACK}Izgradi zraÄnu luku
STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Zrakoplov - klikni na zrakoplov za informacije
-STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES :{BLACK}Izgradi novi zrakoplov(potreban je aerodrom sa hangarom)
-STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Zrakoplov - kliknite na zrakoplov za informacije
+STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES :{BLACK}Izgradi novi zrakoplov (potrebna je zraÄna luka s hangarom)
+STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT :{BLACK}Zrakoplov - klikni na zrakoplov za informacije
STR_A022_BUILD_NEW_AIRCRAFT :{BLACK}Izgradi novi zrakoplov
STR_A023_DRAG_AIRCRAFT_TO_HERE_TO :{BLACK}Povuci zrakoplov ovdje kako bi ga prodao
STR_A024_CENTER_MAIN_VIEW_ON_HANGAR :{BLACK}Centriraj glavni pogled na lokaciju hangara
-STR_A025_AIRCRAFT_SELECTION_LIST :{BLACK}Popis zrakoplova - klini na zrakoplov za informacije
+STR_A025_AIRCRAFT_SELECTION_LIST :{BLACK}Popis izabranih zrakoplova - klikni na zrakoplov za informacije
STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT :{BLACK}Izgradi oznaÄeni zrakoplov
-STR_A027_CURRENT_AIRCRAFT_ACTION :{BLACK}Trenutka radnja zrakoplova - kliknite ovdje za zaustavljanje/pokretanje zrakoplova
-STR_A028_SHOW_AIRCRAFT_S_ORDERS :{BLACK}Prikaži naredbe zrakoplova
+STR_A027_CURRENT_AIRCRAFT_ACTION :{BLACK}Trenutna radnja zrakoplova - klikni ovdje kako bi zaustavio/pokrenuo zrakoplov
+STR_A028_SHOW_AIRCRAFT_S_ORDERS :{BLACK}Pokaži naredbe zrakoplova
STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT :{BLACK} Centrirajte glavni prozor na lokaciju zrakoplova
-STR_A02A_SEND_AIRCRAFT_TO_HANGAR :{BLACK}Pošaljite avion u hangar. CTRL + klik će ga samo servisirati
-STR_A02B_SHOW_AIRCRAFT_DETAILS :{BLACK}Prikaži detalje zrakoplova
-STR_A02E_COST_MAX_SPEED_CAPACITY :{BLACK}Trošak: {CURRENCY} Maks. brzina: {VELOCITY}{}Kapacitet: {COMMA} putnika, {COMMA} poštanskih vreća{}Trošak uporabe {CURRENCY}/god
+STR_A02A_SEND_AIRCRAFT_TO_HANGAR :{BLACK}Pošalji avion u hangar. CTRL+klik će samo servisirati
+STR_A02B_SHOW_AIRCRAFT_DETAILS :{BLACK}Pokaži detalje zrakoplova
+STR_A02E_COST_MAX_SPEED_CAPACITY :{BLACK}Trošak: {CURRENCY} Maks. brzina: {VELOCITY}{}Nosivost: {COMMA} putnika, {COMMA} poštanskih vreća{}Trošak uporabe {CURRENCY}/god
STR_A030_NAME_AIRCRAFT :{WHITE}Imenuj zrakoplov
-STR_A031_CAN_T_NAME_AIRCRAFT :{WHITE}Ne mogu imenovati zrakoplov...
+STR_A031_CAN_T_NAME_AIRCRAFT :{WHITE}Nije moguće imenovati zrakoplov...
STR_A032_NAME_AIRCRAFT :{BLACK}Imenuj zrakoplov
STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Građani slave . . .{}Prvi zrakoplov je stigao na {STATION}!
STR_A034_PLANE_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Pad zrakoplova!{}{COMMA} poginulih u eksploziji na {STATION}
@@ -2978,17 +2990,17 @@
STR_A037_RENAME :{BLACK}Preimenuj
STR_A038_RENAME_AIRCRAFT_TYPE :{BLACK}Preimenuj vrstu zrakoplova
STR_A039_RENAME_AIRCRAFT_TYPE :{WHITE}Preimenuj vrstu zrakoplova
-STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Ne mogu preimenovati vrstu zrakoplova...
-STR_A03B_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Prenamijeni zrakoplov da nosi drugu vrstu tereta
+STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Nije moguće preimenovati vrstu zrakoplova...
+STR_A03B_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Prenamijeni zrakoplov za prijevoz neke druge vrste tereta
STR_A03C_REFIT :{WHITE}{VEHICLE} (Prenamijeni)
STR_A03D_REFIT_AIRCRAFT :{BLACK}Prenamijeni zrakoplov
-STR_A03E_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Izaberi vrstu tereta koju će zrakoplov nositi
-STR_A03F_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Prenamijeni zrakoplov da nosi oznaÄenu vrstu tereta
-STR_A040_SELECT_CARGO_TYPE_TO_CARRY :{GOLD}OznaÄi vrstu tereta za prijenos:
-STR_A041_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Novi kapacitet: {GOLD}{STRING}{}{BLACK}Trošak prenamjene: {GOLD}{CURRENCY}
-STR_A042_CAN_T_REFIT_AIRCRAFT :{WHITE}Ne mogu prenamijeniti zrakoplov...
-STR_GO_TO_AIRPORT_HANGAR :Idi u {STATION} Hangar
-SERVICE_AT_AIRPORT_HANGAR :Servis u hangaru {STATION}
+STR_A03E_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Odaberi vrstu tereta koju će zrakoplov prevoziti
+STR_A03F_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Prenamijeni zrakoplov za prijevoz oznaÄene vrste tereta
+STR_A040_SELECT_CARGO_TYPE_TO_CARRY :{GOLD}Odaberi vrstu tereta za prijevoz:
+STR_A041_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova nosivost: {GOLD}{STRING}{}{BLACK}Trošak prenamjene: {GOLD}{CURRENCY}
+STR_A042_CAN_T_REFIT_AIRCRAFT :{WHITE}Nije moguće prenamijeniti zrakoplov...
+STR_GO_TO_AIRPORT_HANGAR :Idi u hangar stanice {STATION}
+SERVICE_AT_AIRPORT_HANGAR :Servisiranje u hangaru stanice {STATION}
STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Raspored)
@@ -3021,7 +3033,7 @@
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Cargo:
STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Novac:
STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Zajam:
-STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Totalno:
+STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Ukupno:
############ End of order list
STR_PERFORMANCE_DETAIL_VEHICLES_TIP :{BLACK}Broj vozila; ovo ukljuÄuje cestovna vozila, vlakove, brodove i avione
STR_PERFORMANCE_DETAIL_STATIONS_TIP :{BLACK}Broj dijelova stanice. Svaki dio stanice (npr. željezniÄki kolodvor, autobusna postaja, aerodrom) se raÄuna, Äak i ako su spojene kao jedna stanica
@@ -3032,7 +3044,7 @@
STR_PERFORMANCE_DETAIL_CARGO_TIP :{BLACK}Broj vrsta tereta dostavljenog u zadnjoj Äetvrtini
STR_PERFORMANCE_DETAIL_MONEY_TIP :{BLACK}KoliÄina novca koji ova kompanija ima u banci
STR_PERFORMANCE_DETAIL_LOAN_TIP :{BLACK}Iznos novca koji je ova tvrtka pozajmila
-STR_PERFORMANCE_DETAIL_TOTAL_TIP :{BLACK}Totalni broj bodova od mogućih bodova
+STR_PERFORMANCE_DETAIL_TOTAL_TIP :{BLACK}Ukupni broj bodova od mogućih bodova
STR_NEWGRF_SETTINGS_BUTTON :{BLACK}NewGRF Postavke
STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF postavke
@@ -3059,8 +3071,8 @@
STR_NEWGRF_ADD :{BLACK}Dodaj
STR_NEWGRF_ADD_TIP :{BLACK}Dodaj NewGRF datoteku u listu
-STR_NEWGRF_REMOVE :{BLACK}Obriši
-STR_NEWGRF_REMOVE_TIP :{BLACK}Obriši odabranu NewGRF datoteku sa liste
+STR_NEWGRF_REMOVE :{BLACK}Ukloni
+STR_NEWGRF_REMOVE_TIP :{BLACK}Ukloni odabranu NewGRF datoteku s popisa
STR_NEWGRF_MOVEUP :{BLACK}Pomakni gore
STR_NEWGRF_MOVEUP_TIP :{BLACK}Pomakni odabranu NewGRF datoteku gore na listi
STR_NEWGRF_MOVEDOWN :{BLACK} Pomakni dolje
@@ -3101,42 +3113,42 @@
STR_PLANE :{BLACK}{PLANE}
STR_SHIP :{BLACK}{SHIP}
-STR_SCHEDULED_TRAINS :{WHITE}{STATION} - {COMMA} Vlak{P "" a ova}
+STR_SCHEDULED_TRAINS :{WHITE}{STATION} - {COMMA} vlak{P "" a ova}
STR_SCHEDULED_ROAD_VEHICLES :{WHITE}{STATION} - {COMMA} Cestovn{P o a ih} vozil{P o a a}
STR_SCHEDULED_AIRCRAFT :{WHITE}{STATION} - {COMMA} Zrakoplov
STR_SCHEDULED_SHIPS :{WHITE}{STATION} - {COMMA} Brod{P "" a ova}
-STR_SCHEDULED_TRAINS_TIP :{BLACK}Prikaži sve vlakove koji imaju ovu stanicu u svom rasporedu
+STR_SCHEDULED_TRAINS_TIP :{BLACK}Pokaži sve vlakove koji imaju ovu stanicu u svom rasporedu
STR_SCHEDULED_ROAD_VEHICLES_TIP :{BLACK}Prikaži sva cestovna vozila koja imaju ovu stanicu u svom rasporedu
STR_SCHEDULED_AIRCRAFT_TIP :{BLACK}Prikaži sve zrakoplove koji imaju ovu stanicu u svom rasporedu
STR_SCHEDULED_SHIPS_TIP :{BLACK}Prikaži sve brodove koji imaju ovu stanicu u svom rasporedu
-STR_VEH_WITH_SHARED_ORDERS_LIST :{WHITE}Djeljene naredbe za {COMMA} vozil{P o a a}
-STR_VEH_WITH_SHARED_ORDERS_LIST_TIP :{BLACK}Prikaži sva vozila koja dijele ovaj raspored.
+STR_VEH_WITH_SHARED_ORDERS_LIST :{WHITE}Dijeljene naredbe za {COMMA} vozil{P o a a}
+STR_VEH_WITH_SHARED_ORDERS_LIST_TIP :{BLACK}Pokaži sva vozila koja dijele ovaj raspored.
### depot strings
STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Upravo se spremaš prodati sva vozila u spremištu. Jesi li siguran?
-STR_DEPOT_WRONG_DEPOT_TYPE :Pogrešna vrsta skladišta
+STR_DEPOT_WRONG_DEPOT_TYPE :Pogrešna vrsta spremišta
STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP :{BLACK}Prodaj sve vlakove u spremištu
STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP :{BLACK}Prodaj sva cestovna vozila u spremištu
STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP :{BLACK}Prodaj sve brodove u spremištu
STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP :{BLACK}Prodaj sve zrakoplove u hangaru
-STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP :{BLACK}Daje popis svih vlakova u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP :{BLACK}Daje popis svih cestovnih vozila u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP :{BLACK}Daje popis svih brodova u trenutnom spremištu, zajedno s njihovim naredbama
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP :{BLACK}Daje popis svih zrakoplova u trenutnom spremištu, zajedno s njihovim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP :{BLACK}Daje popis svih vlakova koji imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP :{BLACK}Daje popis svih cestovnih vozila koje imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP :{BLACK}Daje popis svih brodova koji imaju trenutno spremište među svojim naredbama
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP :{BLACK}Daje popis svih zrakoplova koji imaju bilo koji hangar ove zraÄne luke meÄ‘u svojim naredbama
STR_DEPOT_AUTOREPLACE_TRAIN_TIP :{BLACK}Automatski zamijeni sve vlakove u spremištu
STR_DEPOT_AUTOREPLACE_ROADVEH_TIP :{BLACK}Automatski zamijeni sva cestovna vozikla u spremištu
STR_DEPOT_AUTOREPLACE_SHIP_TIP :{BLACK}Automatski zamijeni sve brodove u spremištu
STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP :{BLACK}Automatski zamijeni sve zrakoplove u spremištu
-STR_VEHICLE_LIST_TRAIN_DEPOT :{BLACK}{STRING} - {COMMA} Vlak{P "" a ova}
-STR_VEHICLE_LIST_ROADVEH_DEPOT :{BLACK}{STRING} - {COMMA} Cestovn{P o a ih} vozil{P o a a}
-STR_VEHICLE_LIST_SHIP_DEPOT :{BLACK}{STRING} - {COMMA} Brod{P "" a ova}
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT :{BLACK}{STRING} - {COMMA} Zrakoplov
+STR_VEHICLE_LIST_TRAIN_DEPOT :{BLACK}{STRING} - {COMMA} vlak{P "" a ova}
+STR_VEHICLE_LIST_ROADVEH_DEPOT :{BLACK}{STRING} - {COMMA} cestovn{P o a ih} vozil{P o a a}
+STR_VEHICLE_LIST_SHIP_DEPOT :{BLACK}{STRING} - {COMMA} brod{P "" a ova}
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT :{BLACK}{STRING} - {COMMA} zrakoplova
STR_REPLACE_VEHICLES_WHITE :{WHITE}Zamijeni {STRING}
STR_REPLACE_VEHICLES_START :{BLACK}PoÄni zamijenjivati vozila
@@ -3147,13 +3159,13 @@
STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Odaberite novi tip lokomotive koji želite koristiti umjesto lijevo odabranog tipa lokomotive
STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Klikni za zaustavljanje zamjene lijevo odabranog tipa lokomotive
STR_REPLACE_HELP_START_BUTTON :{BLACK}Klikni za poÄetak zamjene lijevo odabrane lokomotive sa desno odabranim tipom
-STR_REPLACE_HELP_RAILTYPE :{BLACK}Odaberite tip traÄnica za koji želite zamijeniti lokomotive
+STR_REPLACE_HELP_RAILTYPE :{BLACK}Odaberite vrstu željeznice za koju želite zamijeniti lokomotive
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Prikazuje sa kojom se lokomotivom zamjenjuje lijevo odabrana lokomotiva, ako postoji koji
STR_REPLACE_HELP :{BLACK}Ovo dozvoljava zamjenu jednog tipa lokomotive sa drugim, kada vlakovi prvotnog tipa uđu u stovarište
-STR_REPLACE_REMOVE_WAGON :{BLACK}Brisanje vagona: {ORANGE}{SKIP}{STRING}
-STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Neka automatska zamijena drži dužinu vlaka istom briÅ¡ući vagone(poÄevÅ¡i od naprijed), ako bi zamijena lokomotive vlak uÄinila dužim.
+STR_REPLACE_REMOVE_WAGON :{BLACK}Uklanjanje vagona: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Ukoliko bi zamjena lokomotive uÄinla vlak dužim, neka automatska zamjena zadrži istu dužinu vlaka tako da ukloni suviÅ¡ne vagone (poÄevÅ¡i od naprijed).
STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Zamjenjujem:{ORANGE}{SKIP}{SKIP}{STRING}
-STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}EXPERIMENTALNA FUNKCIJA {} Prebaci između prozora za izmjenu lokomotiva i vagona.{}Izmjena vagona će se izvršiti samo ako novi vagon može biti prenamijenjen za prijevoz istog tipa tereta kao i stari vagon. Ovo se provjerava za svaki vagon kada se stvarna zamjena odvija.
+STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK} POKUSNA FUNKCIJA {} Prebaci između prozora za izmjenu lokomotiva i vagona.{}Izmjena vagona izvršit će se samo ako novi vagon može biti prenamijenjen za prijevoz istog tipa tereta kao i stari vagon. Ovo se provjerava za svaki vagon kada se stvarna zamjena odvija.
STR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Vozilo nije dostupno
STR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Vozilo nije dostupno
STR_SHIP_NOT_AVAILABLE :{WHITE}Brod nije dostupan
@@ -3162,28 +3174,28 @@
STR_ENGINES :Lokomotive
STR_WAGONS :Vagoni
-STR_MASS_STOP_DEPOT_TRAIN_TIP :{BLACK}Pritisni za zaustavljanje svih vlakova u spremištu
-STR_MASS_STOP_DEPOT_ROADVEH_TIP :{BLACK}Pritisni za zaustavljanje svih cestovnih vozila u spremištu
-STR_MASS_STOP_DEPOT_SHIP_TIP :{BLACK}Pritisni za zaustavljanje svih brodova u spremištu
-STR_MASS_STOP_HANGAR_TIP :{BLACK}Pritisni za zaustavljanje svih zrakoplova u hangaru
+STR_MASS_STOP_DEPOT_TRAIN_TIP :{BLACK}Klikni za zaustavljanje svih vlakova u spremištu
+STR_MASS_STOP_DEPOT_ROADVEH_TIP :{BLACK}Klikni za zaustavljanje svih cestovnih vozila u spremištu
+STR_MASS_STOP_DEPOT_SHIP_TIP :{BLACK}Klikni za zaustavljanje svih brodova u spremištu
+STR_MASS_STOP_HANGAR_TIP :{BLACK}Klikni za zaustavljanje svih zrakoplova u hangaru
-STR_MASS_START_DEPOT_TRAIN_TIP :{BLACK}Pritisni za pokretanje svih vlakova u spremištu
-STR_MASS_START_DEPOT_ROADVEH_TIP :{BLACK}Pritisni za pokretanje svih cestovnih vozila u spremištu
-STR_MASS_START_DEPOT_SHIP_TIP :{BLACK}Pritisni za pokretanje svih brodova u spremištu
-STR_MASS_START_HANGAR_TIP :{BLACK}Klikni za pokretanje svih aviona u hangaru
+STR_MASS_START_DEPOT_TRAIN_TIP :{BLACK}Klikni za pokretanje svih vlakova u spremištu
+STR_MASS_START_DEPOT_ROADVEH_TIP :{BLACK}Klikni za pokretanje svih cestovnih vozila u spremištu
+STR_MASS_START_DEPOT_SHIP_TIP :{BLACK}Klikni za pokretanje svih brodova u spremištu
+STR_MASS_START_HANGAR_TIP :{BLACK}Klikni za pokretanje svih zrakoplova u hangaru
-STR_MASS_STOP_LIST_TIP :{BLACK}Klikni za zaustavljanje svih vozila na listi
-STR_MASS_START_LIST_TIP :{BLACK}Klikni za pokretanje svih vozila na listi
+STR_MASS_STOP_LIST_TIP :{BLACK}Klikni za zaustavljanje svih vozila na popisu
+STR_MASS_START_LIST_TIP :{BLACK}Klikni za pokretanje svih vozila na popisu
STR_SHORT_DATE :{WHITE}{DATE_TINY}
-STR_SIGN_LIST_CAPTION :{WHITE}Popis znakova - {COMMA} Znak{P "" a ova}
+STR_SIGN_LIST_CAPTION :{WHITE}Popis znakova - {COMMA} znak{P "" a ova}
-STR_ORDER_REFIT_FAILED :{WHITE}Prepravke narudžbi nisu uspjele {STRING} {COMMA}
+STR_ORDER_REFIT_FAILED :{WHITE}Naredba prenamijeni neuspjela zaustavljena {STRING} {COMMA}
############ Lists rail types
-STR_RAIL_VEHICLES :TraÄna Vozila
-STR_ELRAIL_VEHICLES :ElektriÄna željezniÄka vozila
+STR_RAIL_VEHICLES :Pružna vozila
+STR_ELRAIL_VEHICLES :ElektriÄna pružna vozila
STR_MONORAIL_VEHICLES :JednotraÄna vozila
STR_MAGLEV_VEHICLES :Maglev željezniÄka vozila
@@ -3195,16 +3207,16 @@
STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Brzina: {GOLD}{VELOCITY}{BLACK} Snaga: {GOLD}{POWER}
STR_PURCHASE_INFO_SPEED :{BLACK}Brzina: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}Trošak uporabe: {GOLD}{CURRENCY}/god
-STR_PURCHASE_INFO_CAPACITY :{BLACK}Kapacitet: {GOLD}{CARGO}{STRING}
+STR_PURCHASE_INFO_CAPACITY :{BLACK}Nosivost: {GOLD}{CARGO}{STRING}
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Dizajnirana: {GOLD}{NUM}{BLACK} Životni vijek: {GOLD}{COMMA} godina
STR_PURCHASE_INFO_RELIABILITY :{BLACK}Maks. pouzdanost: {GOLD}{COMMA}%
STR_PURCHASE_INFO_COST :{BLACK}Trošak: {GOLD}{CURRENCY}
STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Težina: {GOLD}{WEIGHT_S} ({WEIGHT_S})
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Trošak: {GOLD}{CURRENCY}{BLACK} Brzina: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Zapremnina: {GOLD}{COMMA} putnika, {COMMA} vreća s poštom
+STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Nosivost: {GOLD}{COMMA} putnika, {COMMA} vreća s poštom
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK} Pokretni vagoni:.{GOLD}+{POWER}{BLACK} Težina: {GOLD}+{WEIGHT_S}
-STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Promjenjivo u: {GOLD}
-STR_PURCHASE_INFO_ALL_TYPES :Svi tipovi tereta
+STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Prenamjenjivo u: {GOLD}
+STR_PURCHASE_INFO_ALL_TYPES :Sve vrste tereta
STR_PURCHASE_INFO_ALL_BUT :Sve osim {GOLD}
STR_PURCHASE_INFO_MAX_TE :{BLACK} Maks. vuÄni napor: {GOLD}{FORCE}
@@ -3268,16 +3280,16 @@
########### String for new airports
STR_SMALL_AIRPORT :{BLACK}Mala
STR_CITY_AIRPORT :{BLACK}Grad
-STR_METRO_AIRPORT :{BLACK}Metropolitanski airport
-STR_INTERNATIONAL_AIRPORT :{BLACK}Međunarodni aerodrom
+STR_METRO_AIRPORT :{BLACK}Metropolitanska zraÄna luka
+STR_INTERNATIONAL_AIRPORT :{BLACK}MeÄ‘unarodna zraÄna luka
STR_COMMUTER_AIRPORT :{BLACK}Redoviti putnik
STR_INTERCONTINENTAL_AIRPORT :{BLACK}Međukontinentalni
STR_HELIPORT :{BLACK}Heliodrom
-STR_HELIDEPOT :{BLACK}Spremište za helikoptere
+STR_HELIDEPOT :{BLACK}Spremište helikoptera
STR_HELISTATION :{BLACK}Stanica za helikoptere
-STR_SMALL_AIRPORTS :{BLACK}Mali aerodromi
-STR_LARGE_AIRPORTS :{BLACK}Veliki aerodromi
+STR_SMALL_AIRPORTS :{BLACK}Male zraÄne luke
+STR_LARGE_AIRPORTS :{BLACK}Velike zraÄne luke
STR_HUB_AIRPORTS :{BLACK}SrediÅ¡nje zraÄne luke
STR_HELIPORTS :{BLACK}Helicopterske zraÄne luke
@@ -3304,7 +3316,7 @@
STR_TRANSPARENT_TREES_DESC :{BLACK}Namjesti prozirnost za drveće
STR_TRANSPARENT_HOUSES_DESC :{BLACK}Namjesti prozirnost za kuće
STR_TRANSPARENT_INDUSTRIES_DESC :{BLACK}Namjesti prozirnost za industrije
-STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Namjesti prozirnost za građevine poput postaja, spremišta, smjerokaza i užadi
+STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Namjesti prozirnost za graÄ‘evine poput postaja, spremiÅ¡ta, ÄvoriÅ¡ta i vuÄne užadi
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Namjesti prozirnost za mostove
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Namjesti prozirnost za strukture poput svjetionika i antena, možda u budućnosti i vizualne efekte
STR_TRANSPARENT_LOADING_DESC :{BLACK}Namjesti prozirnost za indikatore uÄitavanja
@@ -3319,11 +3331,11 @@
##### Mass Order
STR_GROUP_NAME_FORMAT :Groupa {COMMA}
STR_GROUP_TINY_NAME :{TINYFONT}{GROUP}
-STR_GROUP_ALL_TRAINS :Sva vozila
+STR_GROUP_ALL_TRAINS :Svi vlakovi
STR_GROUP_ALL_ROADS :Sva cestovna vozila
STR_GROUP_ALL_SHIPS :Svi brodovi
STR_GROUP_ALL_AIRCRAFTS :Svi zrakoplovi
-STR_GROUP_DEFAULT_TRAINS :Negrupirani valkovi
+STR_GROUP_DEFAULT_TRAINS :Negrupirani vlakovi
STR_GROUP_DEFAULT_ROADS :Negrupirana cestovna vozila
STR_GROUP_DEFAULT_SHIPS :Negrupirani brodovi
STR_GROUP_DEFAULT_AIRCRAFTS :Negrupirani zrakoplovi
@@ -3331,21 +3343,21 @@
STR_GROUP_ADD_SHARED_VEHICLE :Dodaj dijeljena vozila
STR_GROUP_REMOVE_ALL_VEHICLES :Ukloni sva vozila
-STR_GROUP_TRAINS_CAPTION :{WHITE}{GROUP} - {COMMA} Vlak{P "" a ova}
+STR_GROUP_TRAINS_CAPTION :{WHITE}{GROUP} - {COMMA} vlak{P "" a ova}
STR_GROUP_ROADVEH_CAPTION :{WHITE}{GROUP} - {COMMA} Cestovno vozil{P o a a}
STR_GROUP_SHIPS_CAPTION :{WHITE}{GROUP} - {COMMA} Brod{P "" a ova}
STR_GROUP_AIRCRAFTS_CAPTION :{WHITE}{GROUP} - {COMMA} Zrakoplov
STR_GROUP_RENAME_CAPTION :{BLACK}Preimenuj grupu
STR_GROUP_REPLACE_CAPTION :{WHITE}Zamjeni vozila "{GROUP}"
-STR_GROUP_CAN_T_CREATE :{WHITE}Ne mogu kreirati grupu...
-STR_GROUP_CAN_T_DELETE :{WHITE}Ne mogu obrisati ovu grupu...
-STR_GROUP_CAN_T_RENAME :{WHITE}Ne mogu preimenovati ovu grupu...
-STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Nije moguće maknuti sva vozila iz ove grupe...
+STR_GROUP_CAN_T_CREATE :{WHITE}Nije moguće kreirati grupu...
+STR_GROUP_CAN_T_DELETE :{WHITE}Nije moguće obrisati ovu grupu...
+STR_GROUP_CAN_T_RENAME :{WHITE}Nije moguće preimenovati ovu grupu...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Nije moguće ukloniti sva vozila iz ove grupe...
STR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Nije moguće dodati vozila u ovu grupu
-STR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Ne možeš dodati dijeljena vozila u grupu...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Nije moguće dodati dijeljena vozila u grupu...
-STR_GROUPS_CLICK_ON_GROUP_FOR_TIP :{BLACK}Groupe - Klikni na grupu kako bi izlista sva vozila ove grupe
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP :{BLACK}Groupe - klikni na grupu kako bi izlistao sva vozila ove grupe
STR_GROUP_CREATE_TIP :{BLACK}Klikni za kreiranje grupe
STR_GROUP_DELETE_TIP :{BLACK}Obriši odabranu grupu
STR_GROUP_RENAME_TIP :{BLACK}Preimenuj odabranu grupu
@@ -3369,4 +3381,4 @@
STR_FUND_NEW_INDUSTRY :{BLACK}Financiraj
STR_PROSPECT_NEW_INDUSTRY :{BLACK}Prospekt
STR_BUILD_NEW_INDUSTRY :{BLACK}Izgradi
-STR_INDUSTRY_SELECTION_HINT :{BLACK}Izaberi prikladnu industriju s ove liste
+STR_INDUSTRY_SELECTION_HINT :{BLACK}Izaberi prikladnu industriju s ovog popisa
--- a/src/lang/czech.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/czech.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1078,6 +1078,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_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}
@@ -1161,9 +1162,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :pohyb po mapÄ›
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :nic
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Rychlost skrolovacÃho koleÄka: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulace pravého tlaÄÃtka: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command + kliknutÃ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control + kliknutÃ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :vypnutá
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Zastavit automaticky hru pÅ™i zaÄÃnánà nové hry: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}PoužÃvat pokroÄilý seznam vozidel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :ne
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :u vlastnà spoleÄnosti
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :u vÅ¡ech spoleÄnostÃ
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}PoužÃvat ukazatele naloženÃ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :ne
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :u vlastnà spoleÄnosti
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :u vÅ¡ech spoleÄnostÃ
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Povolit jÃzdnà řády vozidel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Zobrazit jÃzdnà řády v cyklech mÃsto ve dnech: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Výchozà druh kolejà (v nové hÅ™e/po naÄtenà hry): {ORANGE}{STRING}
@@ -2062,7 +2075,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Nutno nejprve zniÄit tunel
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Nutno nejprve zniÄit most
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Nelze zaÄÃt a skonÄit na stejném mÃstÄ›
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Pod mostem je nutná rovná země nebo voda
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}ZaÄátek a konec musà být ve stejné výšce
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}MÃsto nevhodné pro vjezd do tunelu
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3240,7 +3252,7 @@
STR_SHORT_DATE :{WHITE}{DATE_TINY}
STR_SIGN_LIST_CAPTION :{WHITE}Seznam popisků - {COMMA} popis{P ek ky ků}
-STR_ORDER_REFIT_FAILED :{WHITE}Přestavba se nezdařila. Konec.{STRING} {COMMA}
+STR_ORDER_REFIT_FAILED :{WHITE}Selhánà refitu pÅ™Ãkazu zastavilo {STRING} {COMMA}
############ Lists rail types
--- a/src/lang/danish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/danish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :Til
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Vis køretøjets fart i statusbaren: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Tillad bygning på skråninger og kyster: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Tillad landskabsformning under bygninger, spor, etc. (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Tillad mere realistisk størrelse på stationernes opland: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Tillad nedriving af industribygninger, flere veje, osv: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Aktiver bygning af meget lange tog: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Rul kort
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Slået fra
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Rulleknap-hastighed på kort: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Højreklik-emulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommandoklik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrolklik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Fra
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Sæt automatisk på pause når nyt spil startes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Brug avanceret køretøjsliste: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Fra
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eget firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alle firmaer
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Benyt laste-indikatorer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Fra
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eget firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Alle firmaer
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Slå køreplaner for transportmidler til: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Vis køreplan i tik i stedet for dage: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Standard skinnetype (efter nyt spil/hentet spil): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
STR_BUOY_IS_IN_USE :{WHITE}... bøjen er i brug!
+STR_LANDINFO_COORDS :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne en del af en station...
STR_CANT_CONVERT_RAIL :{WHITE}Kan ikke konvertere jernbanetype her...
@@ -1372,18 +1386,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Beskyt dit spil med et kodeord hvis du ikke vil have fremmede med
STR_NETWORK_SELECT_MAP :{BLACK}Vælg et kort:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Hvilket kort vil du spille?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maksimalt antal tilladte klienter:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Vælg det maksimale antal klienter. Det er ikke nødvendigt at fylde dem alle
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :LAN / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (bekendtgør spillet)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" er}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maksimalt antal tilladte klienter:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Vælg det maksimale antal klienter. Det er ikke nødvendigt at fylde dem alle
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} firma{P "" er}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Maks. selskaber:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Begræns serveren til et bestemt antal selskaber
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} tilskuer{P "" e}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Maks. tilskuere:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Begræns serveren til et bestemt antal tilskurere
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Talt sprog:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Andre spillere vil vide hvilket sprog, der bliver talt på serveren
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Start spillet
STR_NETWORK_START_GAME_TIP :{BLACK}Start et nyt netværksspil med et tilfældigt kort eller et scenarie
STR_NETWORK_LOAD_GAME :{BLACK}Hent et spil
@@ -1611,9 +1630,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Jernbane med almindelige signaler
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Jernbane med præ-signaler
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Jernbane med exit-signaler
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Jernbaneskinne med kombi-signaler
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Jernbanespor med normale og præ-signaler
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbanespor med normale og exit-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbaneskinne med normale og kombi-signaler
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Jernbanespor med præ- og exit-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Jernbaneskinne med præ- og kombi-signaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbaneskinne med exit- og kombi-signaler
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Jernbanestation skal fjernes først
@@ -1994,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Det er nødvendigt at rive tunnelen ned først
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Det er nødvendigt at rive broen ned først
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan ikke starte og slutte på samme position
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Der skal være fladt land eller vand under broen
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start- og slutposition skal være på linje
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Dette sted er ikke brugbart til starten af en tunnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Omdøb den valgte gruppe
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Klik for at beskytte denne gruppe mod global auto-udskiftning
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/dutch.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/dutch.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :Aan
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Geef snelheid in statusbalk weer: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Bouwen op hellingen toestaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Omgeving aanpassen onder gebouwen, spoorweg, enz. toestaan (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Gebruik realistisch handelsgebied: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Sta verwijderen van meer stedelijke wegen, bruggen, tunnels, enz. toe: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Zeer lange treinen toestaan: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll kaart
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Uit
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Kaart muiswiel snelheid: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Rechts-klik emulatie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Opdracht-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Uit
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatisch pauzeren wanneer je een nieuw spel start: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Gebruik de geavanceerde voertuigenlijst: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Uit
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eigen bedrijf
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alle bedrijven
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Gebruik laad indicatoren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Uit
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eigen bedrijf
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Alle bedrijven
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Activeer dienstregeling voor voertuigen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Toon dienstregeling in tikken ipv in dagen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Standaard spoorsoort (bij nieuw of opgeslagen spel): {ORANGE}{STRING}
@@ -2004,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Tunnel moet eerst afgebroken worden
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Brug moet eerst afgebroken worden
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan niet beginnen en eindigen op dezelfde plaats
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Vlak land of water vereist onder brug
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Begin en einde moeten op een lijn staan
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Locatie ongeschikt voor ingang tunnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/english.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/english.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :On
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Show vehicle speed in status bar: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Allow building on slopes and coasts: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Allow terraforming under buildings, tracks, etc. (autoslope): {ORANGE}{STRING1}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Allow more realistically sized catchment areas: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Allow removal of more town-owned roads, bridges, etc: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Enable building very long trains: {ORANGE}{STRING1}
@@ -1046,6 +1047,8 @@
STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Road vehicle queueing (with quantum effects): {ORANGE}{STRING1}
STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Pan window when mouse is at the edge: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Allow bribing of the local authority: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE :{LTBLUE}Allow buying exclusive transport rights: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Allow sending money to other companies: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nonuniform stations: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING1}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
@@ -1111,7 +1114,13 @@
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatically pause when starting a new game: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Use the advanced vehicle list: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Own company
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :All companies
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Use loading indicators: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Own company
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :All companies
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Enable timetabling for vehicles: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Show timetable in ticks rather than days: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Default rail type (after new game/game load): {ORANGE}{STRING1}
@@ -1180,6 +1189,7 @@
STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Proportion of towns that will become cities: {ORANGE}1 in {STRING1}
STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Proportion of towns that will become cities: {ORANGE}None
STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}Initial city size multiplier: {ORANGE}{STRING1}
+STR_CONFIG_MODIFIED_ROAD_REBUILD :{LTBLUE}Remove absurd road-elements during the road construction
STR_CONFIG_PATCHES_GUI :{BLACK}Interface
STR_CONFIG_PATCHES_CONSTRUCTION :{BLACK}Construction
@@ -2010,7 +2020,8 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Must demolish tunnel first
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Must demolish bridge first
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Cannot start and end in the same spot
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Level land or water required under bridge
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Bridge heads not at the same level
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Bridge is too low for the terrain
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start and end must be in line
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Site unsuitable for tunnel entrance
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/esperanto.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/esperanto.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1910,7 +1910,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}AntaÅe forigu tunelon
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}AntaÅe forigu ponton
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ne povas komenci kaj fini en la sama loko
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Ebena lando aÅ akvo necesas sub la ponto
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Komenco kaj fino devas esti samliniaj
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Nekonvena loko por tunelkomenco
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/estonian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/estonian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -258,7 +258,7 @@
STR_POPUP_CAUTION_CAPTION :{WHITE}Ettevaatust!
STR_00B4_CAN_T_DO_THIS :{WHITE}Seda ei saa teha....
STR_00B5_CAN_T_CLEAR_THIS_AREA :{WHITE}Seda ala ei saa puhastada....
-STR_00B6_ORIGINAL_COPYRIGHT :{BLACK}Originaali autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud
+STR_00B6_ORIGINAL_COPYRIGHT :{BLACK}Algupärane autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud
STR_00B7_VERSION :{BLACK}OpenTTD versioon {REV}
STR_00BA_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2007 OpenTTD meeskond
STR_TRANSLATED_BY :{BLACK} Tõlgi(d) -
@@ -724,7 +724,7 @@
STR_0225 :{BLACK}{DOWNARROW}
STR_0228_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Suurenda kõrgendatava/madaldatava maa-ala pindala
STR_0229_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Vähenda kõrgendatava/madaldatava maa-ala pindala
-STR_022A_GENERATE_RANDOM_LAND :{BLACK}Juhusliku kaardi loomine
+STR_022A_GENERATE_RANDOM_LAND :{BLACK}Suvalise kaardi tekitamine
STR_022B_RESET_LANDSCAPE :{BLACK}Nulli maastik
STR_022C_RESET_LANDSCAPE :{WHITE}Nulli maastik
STR_RESET_LANDSCAPE_TOOLTIP :{BLACK}Eemalda kõik mängija omandid
@@ -732,7 +732,7 @@
STR_022E_LANDSCAPE_GENERATION :{BLACK}Maastiku loomine
STR_022F_TOWN_GENERATION :{BLACK}Linnade loomine
STR_0230_INDUSTRY_GENERATION :{BLACK}Tööstuste loomine
-STR_0231_ROAD_CONSTRUCTION :{BLACK}Teeehitus
+STR_0231_ROAD_CONSTRUCTION :{BLACK}Tee-ehitus
STR_0233_TOWN_GENERATION :{WHITE}Linnade loomine
STR_0234_NEW_TOWN :{BLACK}Uus linn
STR_0235_CONSTRUCT_NEW_TOWN :{BLACK}Ehita uus linn
@@ -741,11 +741,11 @@
STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}...liiga lähedal teisele linnale
STR_0239_SITE_UNSUITABLE :{WHITE}...ebasobiv koht
STR_023A_TOO_MANY_TOWNS :{WHITE}...liiga palju linnu
-STR_CANNOT_GENERATE_TOWN :{WHITE}Ei saa ühtegi linna ehitada
+STR_CANNOT_GENERATE_TOWN :{WHITE}Ãœhtegi linna ei saa ehitada...
STR_NO_SPACE_FOR_TOWN :{WHITE}...pole enam ruumi kaardil
STR_023B_INCREASE_SIZE_OF_TOWN :{BLACK}Linna suuruse suurendamine
STR_023C_EXPAND :{BLACK}Laienda
-STR_023D_RANDOM_TOWN :{BLACK}Juhuslik linn
+STR_023D_RANDOM_TOWN :{BLACK}Suvaline linn
STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION :{BLACK}Ehita linn suvalisse kohta
STR_023F_INDUSTRY_GENERATION :{WHITE}Tööstuste loomine
STR_0240_COAL_MINE :{BLACK}Kivisöekaevandus
@@ -822,8 +822,8 @@
STR_0287_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}...iga linna kohta lubatud ainult üks
STR_0288_PLANT_TREES :{BLACK}Istuta puid
STR_0289_PLACE_SIGN :{BLACK}Paigalda silt
-STR_028A_RANDOM_TREES :{BLACK}Juhuslikud puud
-STR_028B_PLANT_TREES_RANDOMLY_OVER :{BLACK}Istutab puid juhuslikult üle kogu maa
+STR_028A_RANDOM_TREES :{BLACK}Suvalised puud
+STR_028B_PLANT_TREES_RANDOMLY_OVER :{BLACK}Istutab puid suvaliselt üle kogu maa
STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Loo maastikule kivised alad
STR_028D_PLACE_LIGHTHOUSE :{BLACK}Ehita tuletorn
STR_028E_PLACE_TRANSMITTER :{BLACK}Paigalda saatjamast
@@ -1120,6 +1120,7 @@
STR_CONFIG_PATCHES_ON :Sees
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Näita olekuribal veovahendi kiirust: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Luba ehitised nõlvadele ja kallastele: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Võimalda maastikujunduse teostust majade, rööbaste jms. all (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Võimalda reaalsemaid veekogu alasid: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Luba linnateede, -sildade, -tunnelite jne lammutamine: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Luba väga pikkade rongide ehitamine: {ORANGE}{STRING}
@@ -1147,7 +1148,7 @@
STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Keri vaadet, kui hiir on viidud ekraani serva: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Luba kohalikule omavalitsusele altkäemaksu maksmine: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Luba suvalise kujuga jaamad: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Uus teeotsimise algoritm(NPF asendab NTP): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL :{LTBLUE}Uus trassi otsimise algoritm(NPF asendab NTP): {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Raskete rongide simuleerimiseks kasutatav raskuse korrutaja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Luba läbisõidupeatused linnateedel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Luba jaamu lähestikku ehitada: {ORANGE}{STRING}
@@ -1203,9 +1204,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Keri kaarti
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Väljas
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Kaardi kerimisrulliku kiirus: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Paremklõpsu matkimine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Väljas
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Mängu isepeatamine uue mängu alustamisel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Kasuta laiendatud sõidukinimekirja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Väljas
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Oma ettevõte
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Kõik ettevõtted
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Kasuta laadimisnäidikuid: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Väljas
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Oma ettevõte
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Kõik ettevõtted
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Luba sõiduplaanide määramine: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Kasuta sõiduplaanis päevade asemel tikse: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Algne rööbastee liik (mängu alustamisel/laadimisel): {ORANGE}{STRING}
@@ -1450,12 +1463,12 @@
STR_ORANGE :{ORANGE}{STRING}
STR_NETWORK_CLIENTS :{SILVER}Kliendid: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
STR_NETWORK_LANGUAGE :{SILVER}Keel: {WHITE}{STRING}
-STR_NETWORK_TILESET :{SILVER}Maastikuühikud: {WHITE}{STRING}
+STR_NETWORK_TILESET :{SILVER}Ruudustik: {WHITE}{STRING}
STR_NETWORK_MAP_SIZE :{SILVER}Kaardi suurus: {WHITE}{COMMA}x{COMMA}
STR_NETWORK_SERVER_VERSION :{SILVER}Serveri versioon: {WHITE}{STRING}
STR_NETWORK_SERVER_ADDRESS :{SILVER}Serveri aadress: {WHITE}{STRING} : {NUM}
-STR_NETWORK_START_DATE :{SILVER}Algus aeg: {WHITE}{DATE_SHORT}
-STR_NETWORK_CURRENT_DATE :{SILVER}Hetke aeg: {WHITE}{DATE_SHORT}
+STR_NETWORK_START_DATE :{SILVER}Aeg alguses: {WHITE}{DATE_SHORT}
+STR_NETWORK_CURRENT_DATE :{SILVER}Aeg hetkel: {WHITE}{DATE_SHORT}
STR_NETWORK_PASSWORD :{SILVER}Parooliga kaitstud!
STR_NETWORK_SERVER_OFFLINE :{SILVER}SERVER ON MAAS
STR_NETWORK_SERVER_FULL :{SILVER}SERVER ON TÄIS
@@ -1767,7 +1780,7 @@
STR_1813_SELECT_TRAM_VEHICLE_DEPOT :{BLACK}Vali trammidepoo suund
STR_1814_ROAD :Sõidutee
STR_1815_ROAD_WITH_STREETLIGHTS :Valgustatud sõidutee
-STR_1816_TREE_LINED_ROAD :Kolmerajaline tee
+STR_1816_TREE_LINED_ROAD :Puiestee
STR_1817_ROAD_VEHICLE_DEPOT :Depoo
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Raudteeületuskoht
STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Siinset bussijaama ei saa lammutada...
@@ -2018,7 +2031,7 @@
STR_400D_SAVE_THE_CURRENT_GAME_USING :{BLACK}Salvesta mäng valitud nimega
STR_400E_SELECT_NEW_GAME_TYPE :{WHITE}Vali uue mängu tüüp
STR_400F_SELECT_SCENARIO_GREEN_PRE :{BLACK}Vali valmis kaart (roheline), eelseadistatud mäng (sinine), või juhusliku kaardiga uus mäng
-STR_4010_GENERATE_RANDOM_NEW_GAME :Tekita juhuslik kaart
+STR_4010_GENERATE_RANDOM_NEW_GAME :Tekita suvaline kaart
STR_4011_LOAD_HEIGHTMAP :{WHITE}Laadi kõrguskaart
##id 0x4800
@@ -2104,7 +2117,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Enne tuleb tunnel hävitada
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Enne tuleb sild hävitada
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ei saa alata ja lõppeda samas kohas
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Silla otsade kõrgus peab sama olema
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Algus ja lõpp peavad samal joonel olema
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Koht ei sobi tunneli sissekäiguks
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2162,7 +2174,7 @@
STR_SV_STNAME_EAST : Ida {STRING}
STR_SV_STNAME_WEST : Lääne {STRING}
STR_SV_STNAME_CENTRAL :{STRING} keskus
-STR_SV_STNAME_TRANSFER :{STRING} ülekanne
+STR_SV_STNAME_TRANSFER :{STRING} ümberlaadimispaik
STR_SV_STNAME_HALT :{STRING} peatus
STR_SV_STNAME_VALLEY :{STRING} org
STR_SV_STNAME_HEIGHTS :{STRING} kõrgendikud
@@ -2340,7 +2352,7 @@
STR_7048_ACCEPT_NEW_FACE_SELECTION :{BLACK}Uue näo valimine
STR_7049_SELECT_MALE_FACES :{BLACK}Vali mehe nägu
STR_704A_SELECT_FEMALE_FACES :{BLACK}Vali naise nägu
-STR_704B_GENERATE_RANDOM_NEW_FACE :{BLACK}Loo uus juhuslik nägu
+STR_704B_GENERATE_RANDOM_NEW_FACE :{BLACK}Tekita uus suvaline nägu
STR_704C_KEY :{BLACK}Selgitus
STR_704D_SHOW_KEY_TO_GRAPHS :{BLACK}Näita selgitust graafikute juures
STR_704E_KEY_TO_COMPANY_GRAPHS :{WHITE}Ettevõttegraafiku selgitus
@@ -2688,8 +2700,8 @@
STR_80FD_TRICARIO_HELICOPTER :Tricario helikopter
STR_80FE_GURU_X2_HELICOPTER :Guru X2 helikopter
STR_80FF_POWERNAUT_HELICOPTER :Powernaut helikopter
-STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE :{WHITE}Teade veovahendi tootjalt
-STR_8101_WE_HAVE_JUST_DESIGNED_A :{GOLD}Me oleme just kujundanud uue {STRING}{P "" i} - kas te tahaksite testida seda aasta aega enne, kui see on saadaval kõigile?
+STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE :{WHITE}Teade veovahendite tootjalt
+STR_8101_WE_HAVE_JUST_DESIGNED_A :{GOLD}Me töötasime välja uue {STRING}{P "" i}. Kas te oleksite huvitatud selle ainuõiguslikust katsetamisest järgneva aasta jooksul, et me saaksime jälgida kuidas see toimib?
STR_8102_RAILROAD_LOCOMOTIVE :raudteevedur
STR_8103_ROAD_VEHICLE :mootorsõiduk
STR_8104_AIRCRAFT :lennuk
@@ -2705,17 +2717,17 @@
STR_8804 :{SETX 10}{COMMA}: {STRING} {STRING}
STR_8805 :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
STR_8806_GO_TO :Mine {STATION}
-STR_8807_GO_TO_TRANSFER :Mine {STATION} (vea ja võta laadung peale)
+STR_8807_GO_TO_TRANSFER :Mine {STATION} (laadi ümber ja võta laadung peale)
STR_8808_GO_TO_UNLOAD :Mine {STATION} (laadi maha)
-STR_8809_GO_TO_TRANSFER_UNLOAD :Mine {STATION} (vea ja jäta tühjaks)
+STR_8809_GO_TO_TRANSFER_UNLOAD :Mine {STATION} (laadi ümber ja jäta tühjaks)
STR_880A_GO_TO_LOAD :Mine {STATION} (laadi)
-STR_880B_GO_TO_TRANSFER_LOAD :Mine {STATION} (vea ja oota täislaadungit)
+STR_880B_GO_TO_TRANSFER_LOAD :Mine {STATION} (laadi ümber ja oota täislaadungit)
STR_880C_GO_NON_STOP_TO :Sõida läbi {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER :Sõida läbi {STATION} (vea ja oota täislaadungit)
+STR_880D_GO_TO_NON_STOP_TRANSFER :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
STR_880E_GO_NON_STOP_TO_UNLOAD :Sõida läbi {STATION} (laadi maha)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD :Sõida läbi {STATION} (vea ja jäta tühjaks)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD :Sõida läbi {STATION} (laadi ümber ja jäta tühjaks)
STR_8810_GO_NON_STOP_TO_LOAD :Sõida läbi {STATION} (laadi)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD :Sõida läbi {STATION} (vea ja oota täislaadungit)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
STR_GO_TO_TRAIN_DEPOT :Mine linna {TOWN} rongidepoosse
STR_SERVICE_AT_TRAIN_DEPOT :Hoolda linna {TOWN} rongidepoos
STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT :Sõida läbi linna {TOWN} rongidepoo
@@ -2808,7 +2820,7 @@
STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN :{BLACK}Ehita valitud raudteesõiduk
STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Muuda raudteesõiduki tüübinime
STR_8846_CURRENT_TRAIN_ACTION_CLICK :{BLACK}Praegune rongi tegevus - vajuta siia et peatada/käivitada rong
-STR_8847_SHOW_TRAIN_S_ORDERS :{BLACK}Näita rongi käske
+STR_8847_SHOW_TRAIN_S_ORDERS :{BLACK}Näita rongi sihtpunkte
STR_8848_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Vaate viimine rongi asukohale
STR_8849_SEND_TRAIN_TO_DEPOT :{BLACK}Saada rong depoosse
STR_884A_FORCE_TRAIN_TO_PROCEED :{BLACK}Sunni rongi signaale eirama
@@ -2823,10 +2835,10 @@
STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Sihtpunktide nimekiri - vajuta käsul et see valida. CTRL + klik kerib jaama juurde
STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}Jäta praegune järjestus vahele ja alusta järgmisega. CTRL + klõps jätab vahele kuni valitud järjestuseni
STR_8854_DELETE_THE_HIGHLIGHTED :{BLACK}Kustuta valitud käsk
-STR_8855_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Märgi valitud käsk ilma peatusetta peatuseks
-STR_8856_INSERT_A_NEW_ORDER_BEFORE :{BLACK}Lisa uus käsk enne valitud käsku või nimekirja lõppu
-STR_8857_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Sunni valitud käsu juures oodata täis laadingut
-STR_8858_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Sunni valitud käsu juures maha laadida.
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Muuda valitud käsk peatuseta sihtpunktiks
+STR_8856_INSERT_A_NEW_ORDER_BEFORE :{BLACK}Lisa uus käsk nimekirja lõppu, või enne valitud käsku
+STR_8857_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Käsi valitud sihtpunktis sõiduk täis laadida
+STR_8858_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Käsi valitud sihtpunktis sõiduk tühjaks laadida
STR_TIMETABLE_TOOLTIP :{BLACK}Sõiduplaan - esiletõstmiseks klõpsa sihtpunktil
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuda, kaua esile tõstetud sihtpunkti peale aega peaks kuluma
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Tühista esile tõstetud sihtpunkti ajaperiood
@@ -2850,8 +2862,8 @@
STR_8869_CAN_T_REVERSE_DIRECTION :{WHITE}Ei saa rongi ümber pöörata.
STR_886A_RENAME_TRAIN_VEHICLE_TYPE :{WHITE}Muuda rongivaguni tüübinime
STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Raudteesõiduki tüübinime ei saa muuta...
-STR_886D_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Sunni valitud käsul visata maha laadung
-STR_886F_TRANSFER :{BLACK}Transpordi
+STR_886D_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Käsi valitud sihtpunktis sõiduki laadung kõrvaldada
+STR_886F_TRANSFER :{BLACK}Laadi ümber
STR_CLEAR_TIME :{BLACK}Tühista aeg
STR_RESET_LATENESS :{BLACK}Tühista hilinemisloendur
@@ -3222,7 +3234,7 @@
STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP :{BLACK}Müü kõik lennukid angaarist
STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP :{BLACK}Võta nimekiri kõikidest rongidest selles jaamas nende käskude järgi
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP :{BLACK}Võta nimekiri kõikidest autodest selles garaažis nende käskude järgi
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP :{BLACK}Hangi kõikidest autodest nimekiri, kus käskude all on nende praegune depoo
STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP :{BLACK}Võta nimekiri kõikidest laevadest selles sadamas nende käskude järgi
STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP :{BLACK}Võta nimekiri kõikidest lennukitest suvalistest angaaridest selles lennujaamas nende käskude järgi
@@ -3308,12 +3320,12 @@
########### String for New Landscape Generator
-STR_GENERATE :{WHITE}Genereeri
-STR_RANDOM :{BLACK}Muuda juhuslikuks
-STR_RANDOM_HELP :{BLACK}Muuda maastikuloomisel kasutatavat suvalist seemet
+STR_GENERATE :{WHITE}Tekita
+STR_RANDOM :{BLACK}Muuda suvaliseks
+STR_RANDOM_HELP :{BLACK}Muuda maastiku loomisel kasutatavat suvalist seemet
STR_WORLD_GENERATION_CAPTION :{WHITE}Maailma genereerimine
-STR_RANDOM_SEED :{BLACK}Suvaline seeme:
-STR_RANDOM_SEED_HELP :{BLACK}Klõpsa, et sisestada juhuslik seeme
+STR_RANDOM_SEED :{BLACK}Juhuarv:
+STR_RANDOM_SEED_HELP :{BLACK}Klõpsa juhuarvu sisestamiseks
STR_LAND_GENERATOR :{BLACK}Maa generaator:
STR_TREE_PLACER :{BLACK}Puu algoritm:
STR_HEIGHTMAP_ROTATION :{BLACK}Kõrgustekaardi pööre:
--- a/src/lang/finnish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/finnish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,24 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Vieritä karttaa
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Pois
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Rullan nopeus: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Oikean painikkeen emulointi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Pois
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Uusi peli alkaa pysäytettynä: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Edistynyt ajoneuvolista: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Pois
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Oma yhtiö
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Kaikki yhtiöt
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Lastausindikaattorit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Pois
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Oma yhtiö
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Kaikki yhtiöt
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Aikataulut ajoneuvoille: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Näytä aikataulu tickseissä päivien sijaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Raidetyyppi oletuksena: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Tavallinen raide
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Sähköraide
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :Yksiraiteinen
@@ -1375,10 +1390,13 @@
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :Lähiverkko/Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (mainosta)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} asiakas{P "" ta}
STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Pelaajien enimmäismäärä:
STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Pelaajien enimmäismäärä. Pelissä voi olla myös vähemmän pelaajia.
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} yritys{P "" tä}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Yhtiöiden enimmäismäärä:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Rajoita yhtiöiden määrää palvelimella
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} katsoja{P "" a}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Katsojien enimmäismäärä:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Rajoita katsojien määrää palvelimella
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Puhuttu kieli:
@@ -1611,9 +1629,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Rautatie tavallisin opastimin
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Rautatie esiopastimin
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Rautatie poistumisopastimin
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Rautatie yhdistelmäopastein
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Rautatie esisignaaleilla
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Rautatie poistumis-signaaleilla
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Rautatie normaali- ja yhdistelmäopastein
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Rautatie esi- ja poistumissignaaleilla
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Rautatie esi- ja yhdistelmäopastein
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Rautatie poistumis- ja yhdistelmäopastein
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Poista asema ensin
@@ -1994,7 +2016,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Tunneli pitää tuhota ensin.
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Silta pitää tuhota ensin.
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ei voi aloittaa ja lopettaa samasta paikkasta.
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Sillan alla pitää olla tasaista maata tai vettä.
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Alku- ja päätepisteen pitää olla linjassa.
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Tontti on sopimaton tunnelinsuulle.
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/french.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/french.txt Sat Oct 06 21:16:00 2007 +0000
@@ -377,7 +377,7 @@
STR_SORT_BY_DROPDOWN_NAME :Nom
STR_SORT_BY_DATE :{BLACK}Date
STR_SORT_BY_NUMBER :Numéro
-STR_SORT_BY_PROFIT_LAST_YEAR :Profit l'an dernier
+STR_SORT_BY_PROFIT_LAST_YEAR :Profit année précédente
STR_SORT_BY_PROFIT_THIS_YEAR :Profit cette année
STR_SORT_BY_AGE :Âge
STR_SORT_BY_RELIABILITY :Fiabilité
@@ -473,7 +473,7 @@
STR_0195_SHOW_VEGETATION_ON_MAP :{BLACK}Afficher la végétation sur la carte
STR_0196_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Afficher les propriétaires sur la carte
STR_0197_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Afficher le nom des villes sur la carte
-STR_0198_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Profit cette année: {CURRENCY} (l'an dernier: {CURRENCY})
+STR_0198_PROFIT_THIS_YEAR_LAST_YEAR :{TINYFONT}{BLACK}Profit cette année: {CURRENCY} (année précédente: {CURRENCY})
############ range for service numbers starts
STR_AGE :{COMMA} an{P "" nées} ({COMMA})
@@ -1021,6 +1021,7 @@
STR_CONFIG_PATCHES_ON :Activé
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Afficher vitesse du véhicule dans la barre d'état: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Construction côtière et sur pentes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Repaysagement sous les bâtiments, voies, ... (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Autoriser des zones de désserte plus réalistes : {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permettre le retrait de plus d'éléments possédés par une ville: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Permettre les trains plus longs: {ORANGE}{STRING}
@@ -1104,9 +1105,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Défilement de la carte
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Désactivé
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Vitesse de défilement avec molette: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulation du clic droit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Commande-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl-clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Désactivé
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Pause automatique en début de nouvelle partie: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Utiliser la liste de véhicules avancée: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Désactivé
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Propre compagnie
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Toutes les compagnies
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Utiliser les indicateurs de chargement: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Désactivé
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Propre compagnie
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Toutes les compagnies
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Activer les horaires pour les véhicules: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Afficher l'horaire en ticks plutôt qu'en jours: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Type de rail par défaut (après nouvelle partie/chargement): {ORANGE}{STRING}
@@ -2005,7 +2018,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Vous devez d'abord démolir le tunnel
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Vous devez d'abord démolir le pont
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Impossible de commencer et de terminer au même endroit
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Crevasse ou eau requise sous le pont
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Le début et la fin doivent être alignés
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Le site pour l'entrée du tunnel ne convient pas
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2790,7 +2802,7 @@
STR_900C_DETAILS :{WHITE}{VEHICLE} (Détails)
STR_900D_AGE_RUNNING_COST_YR :{BLACK}Âge: {LTBLUE}{STRING}{BLACK} Coût d'entretien: {LTBLUE}{CURRENCY}/an
STR_900E_MAX_SPEED :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit de cette année: {LTBLUE}{CURRENCY} (année dernière: {CURRENCY})
+STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit cette année: {LTBLUE}{CURRENCY} (année précédente: {CURRENCY})
STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilité: {LTBLUE}{COMMA}% {BLACK}Pannes depuis le dernier entretien: {LTBLUE}{COMMA}
STR_9011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Construit en: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
STR_9012_CAPACITY :{BLACK}Capacité: {LTBLUE}{CARGO}
@@ -2866,7 +2878,7 @@
STR_9811_DETAILS :{WHITE}{VEHICLE} (Détails)
STR_9812_AGE_RUNNING_COST_YR :{BLACK}Âge: {LTBLUE}{STRING}{BLACK} Coût d'entretien: {LTBLUE}{CURRENCY}/an
STR_9813_MAX_SPEED :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_9814_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit cette année: {LTBLUE}{CURRENCY} (l'an dernier: {CURRENCY})
+STR_9814_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit cette année: {LTBLUE}{CURRENCY} (année précédente: {CURRENCY})
STR_9815_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilité: {LTBLUE}{COMMA}% {BLACK}Pannes depuis le dernier entretien: {LTBLUE}{COMMA}
STR_9816_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Construit: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
STR_9817_CAPACITY :{BLACK}Capacité: {LTBLUE}{CARGO}
@@ -2934,7 +2946,7 @@
STR_A00C_DETAILS :{WHITE}{VEHICLE} (Détails)
STR_A00D_AGE_RUNNING_COST_YR :{BLACK}Âge: {LTBLUE}{STRING}{BLACK} Coût d'entretien: {LTBLUE}{CURRENCY}/an
STR_A00E_MAX_SPEED :{BLACK}Vitesse max.: {LTBLUE}{VELOCITY}
-STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profits cette année: {LTBLUE}{CURRENCY} (l'an dernier: {CURRENCY})
+STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Profit cette année: {LTBLUE}{CURRENCY} (année précédente: {CURRENCY})
STR_A010_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilité: {LTBLUE}{COMMA}% {BLACK}Pannes depuis le dernier service: {LTBLUE}{COMMA}
STR_A011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Construit: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
STR_A012_CAN_T_SEND_AIRCRAFT_TO :{WHITE}Impossible d'envoyer l'aéronef au hangar...
--- a/src/lang/galician.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/galician.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1856,7 +1856,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Debes demole-lo túnel primeiro
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Debes demole-la ponte primeiro
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Non pode empezar e rematar na mesma posición
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}NecesÃtase terreo nivelado ou auga baixo a ponte
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}O inicio e o final deben estar aliñados
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Emprazamento inadecuado para a entrada do túnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/german.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/german.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Hauptansicht verschieben
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Aus
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Mausradgeschwindigkeit auf dem Spielfeld: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Rechtsklick-Emulation: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando-Klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Strg-Klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Aus
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatische Pause bei Spielstart: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Erweiterte Fahrzeugliste benutzen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Aus
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eigene Firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alle Firmen
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Ladestandanzeiger verwenden: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Aus
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eigene Firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Alle Firmen
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Fahrpläne für Fahrzeuge aktivieren: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Zeitpläne in Ticks anstatt in Tagen anzeigen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Standard-Gleistyp (bei Spielbeginn/geladenem Spiel): {ORANGE}{STRING}
@@ -2005,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Der Tunnel muss zuerst abgerissen werden
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Die Brücke muss erst abgerissen werden
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Anfang und Ende können nicht im selben Feld liegen
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Unter der Brücke ist ebenes Land oder Wasser erforderlich
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Anfang und Ende müssen auf einer Ebene liegen
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Platz ist nicht für einen Tunnel geeignet
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/hungarian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/hungarian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1086,6 +1086,7 @@
STR_CONFIG_PATCHES_ON :Be
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Járművek sebességének kijelzése: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}LejtÅ‘re es partokra épÃtés: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Épületek, sinek alatti tereprendezés engedélyezése (autoslope): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Élethűbben méretezett befogadókörzetek bekapcsolása: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Engedélyezi az ipari létesÃtmények és utak rombolását, stb: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Óriásvonatok engedélyezése: {ORANGE}{STRING}
@@ -1169,9 +1170,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Térkép mozgatás
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Ki
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Scrollgomb sebessége a térképen: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Jobb-klikk emuláció: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control+klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Kikapcsolva
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatikus pause-mode új játék esetén: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Továbbfejlesztett járműlista használata: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Kikapcsolva
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Saját vállalat
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Minden vállalat
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Betöltésjelző használata: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Kikapcsolva
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Saját vállalat
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Minden vállalat
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Időalapú menetrend engedélyezése: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Menetrendi idő-alapegység tick a nap helyett: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Alapértelmezett sÃntipus (játéktöltés/új játék után): {ORANGE}{STRING}
@@ -2107,7 +2120,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Előbb le kell rombolnod az alagutat
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Előbb le kell rombolnod a hidat
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Nem kezdődhet és végződhet ugyanott
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Sima talaj vagy vÃz kell, hogy legyen a hÃd alatt
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}A kezdetének és a végének egy vonalban kell lennie
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Nem alkalmas a hely alagút bejáratának
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/icelandic.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/icelandic.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1877,7 +1877,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Verður að eyða göngum fyrst
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Verður að eyða brú fyrst
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Getur ekki byrjað og endað á sama stað
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Sléttlendi eða vatn nauðsynlegt undir brú
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Verður að byrja og enda à sömu lÃnu
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Óhentug staðsetning fyrir enda gangnanna
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/italian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/italian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -795,8 +795,8 @@
STR_02D5_LAND_BLOCK_INFO :Informazioni sull'area di terreno
STR_02D6 :
STR_CONSOLE_SETTING :Apri/chiudi console
-STR_02D7_SCREENSHOT_CTRL_S :Screenshot (Ctrl-S)
-STR_02D8_GIANT_SCREENSHOT_CTRL_G :Screenshot Gigante (Ctrl-G)
+STR_02D7_SCREENSHOT_CTRL_S :Screenshot (CTRL+S)
+STR_02D8_GIANT_SCREENSHOT_CTRL_G :Screenshot Gigante (CTRL+G)
STR_02D9_ABOUT_OPENTTD :Informazioni su 'OpenTTD'
############ range ends here
@@ -1022,6 +1022,7 @@
STR_CONFIG_PATCHES_ON :Si
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Mostra velocità veicoli sulla barra di stato: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Consenti la costruzione sui pendii e coste: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Consenti rimodellazione terreno sotto a edifici, rotaie, etc.: {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Consenti aree di copertura più realistiche: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Consenti la rimozione di strade, ponti, etc. delle città : {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Consenti la costruzione di treni molto lunghi: {ORANGE}{STRING}
@@ -1105,9 +1106,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scorri la mappa
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Off
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Velocità rotellina mappa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulazione clic destro: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :COMANDO+clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :CTRL+clic
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Off
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Metti in pausa all'inizio di una nuova partita: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Utilizza la lista veicoli avanzata: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Off
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Propria compagnia
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Tutte le compagnie
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Utilizza gli indicatori di caricamento: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Off
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Propria compagnia
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Tutte le compagnie
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Abilita la definizione di tabelle orarie per i veicoli: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Mostra le tabelle orarie in tick piuttosto che in giorni: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Ferrovia predefinita (a inizio/ripresa partita): {ORANGE}{STRING}
@@ -2006,7 +2019,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Bisogna demolire il tunnel prima
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Bisogna demolire il ponte prima
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Impossibile partire e finire nello stesso punto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Sotto un ponte è richiesto terreno livellato o acqua
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Inizio e fine devono essere allineati
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Sito inadatto per l'entrata del tunnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/japanese.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/japanese.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :地図をスクãƒãƒ¼ãƒ«
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :切
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}地図ã®ã‚¹ã‚¯ãƒãƒ¼ãƒ«é€Ÿåº¦ï¼š{ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}å³ãƒœã‚¿ãƒ³ã®ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :コマンド+クリック
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :コントãƒãƒ¼ãƒ«ï¼‹ã‚¯ãƒªãƒƒã‚¯
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :切
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}æ–°è¦ã‚²ãƒ¼ãƒ を開始ã—ãŸã¨ãã«è‡ªå‹•çš„ã«ãƒãƒ¼ã‚ºï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}詳細ã®è»Šä¸¡ãƒªã‚¹ãƒˆã‚’使用:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :切
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :自分
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :ã™ã¹ã¦
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}ç©ã¿é™ã‚ã—を表示:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :切
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :自分
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :ã™ã¹ã¦
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}車両ã®æ™‚刻表を使用:{ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}æ—¥ã®ä»£ã‚ã‚Šã«æ™‚刻表をティックã§è¡¨ç¤ºï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}デフォルトã®é‰„é“ã®ç¨®é¡žï¼ˆæ–°è¦ã‚²ãƒ¼ãƒ 後ï¼ã‚²ãƒ¼ãƒ ã®èªã¿è¾¼ã¿å¾Œï¼‰ï¼š{ORANGE}{STRING}
@@ -2004,7 +2016,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}å…ˆã«ãƒˆãƒ³ãƒãƒ«ã‚’ç ´å£Šã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}å…ˆã«æ©‹ã‚’ç ´å£Šã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
STR_5008_CANNOT_START_AND_END_ON :{WHITE}開始点ã¨çµ‚了点ãŒåŒã˜ä½ç½®ã«å»ºè¨ã§ãã¾ã›ã‚“
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}橋下ã«å¹³åœ°ã‚‚ã—ãã¯æ°´ãŒãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}一直線ã®æ©‹ã—ã‹å»ºè¨ã§ãã¾ã›ã‚“
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}ã“ã®åœŸåœ°ã¯ãƒˆãƒ³ãƒãƒ«ã®å…¥ã‚Šå£ã«ä¸é©å½“ã§ã™
STR_500D :{GOLD}{STRING}ã€{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/korean.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/korean.txt Sat Oct 06 21:16:00 2007 +0000
@@ -413,18 +413,18 @@
STR_SEND_FOR_SERVICING :ì 검하러 보냄
############ range for months starts
-STR_0162_JAN :1ì›”
-STR_0163_FEB :2ì›”
-STR_0164_MAR :3ì›”
-STR_0165_APR :4ì›”
-STR_0166_MAY :5ì›”
-STR_0167_JUN :6ì›”
-STR_0168_JUL :7ì›”
-STR_0169_AUG :8ì›”
-STR_016A_SEP :9ì›”
-STR_016B_OCT :10ì›”
-STR_016C_NOV :11ì›”
-STR_016D_DEC :12ì›”
+STR_0162_JAN :1
+STR_0163_FEB :2
+STR_0164_MAR :3
+STR_0165_APR :4
+STR_0166_MAY :5
+STR_0167_JUN :6
+STR_0168_JUL :7
+STR_0169_AUG :8
+STR_016A_SEP :9
+STR_016B_OCT :10
+STR_016C_NOV :11
+STR_016D_DEC :12
############ range for months ends
STR_016E :{TINYFONT}{STRING}{} {STRING}
@@ -488,9 +488,9 @@
STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA}ì˜ ìˆ˜ëª…ì´ ë‹¤ë˜ì–´ 갑니다.
STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA}ì˜ ìˆ˜ëª…ì´ ë‹¤ë˜ì–´ 긴급 êµì²´ê°€ 필요합니다.
STR_01A3_LAND_AREA_INFORMATION :{WHITE}ì´ ì§€ì—ì˜ ì§€í˜• ì •ë³´
-STR_01A4_COST_TO_CLEAR_N_A :{BLACK}초기화 가격: {LTBLUE}N/A
+STR_01A4_COST_TO_CLEAR_N_A :{BLACK}초기화 가격: {LTBLUE}ì—†ìŒ
STR_01A5_COST_TO_CLEAR :{BLACK}초기화 가격: {LTBLUE}{CURRENCY}
-STR_01A6_N_A :N/A
+STR_01A6_N_A :ì—†ìŒ
STR_01A7_OWNER :{BLACK}ì†Œìœ ìž: {LTBLUE}{STRING}
STR_01A8_LOCAL_AUTHORITY :{BLACK}ì§€ì— ë‹¹êµ: {LTBLUE}{STRING}
STR_01A9_NONE :ì—†ìŒ
@@ -1104,11 +1104,17 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :맵 스í¬ë¡¤
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :ë„기
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}맵 스í¬ë¡¤ ì†ë„: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}오른쪽 í´ë¦ 매í¬ë¡œ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :커맨드 + í´ë¦
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :컨트롤 + í´ë¦
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :ë„기
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}새로운 게임 ì‹œìž‘í• ë•Œ ìžë™ìœ¼ë¡œ ì¼ì‹œì •ì§€: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}ì§„ë³´ëœ ì°¨ëŸ‰ ëª©ë¡ ì‚¬ìš©: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}ì 재 ì •ë„ í‘œì‹œ: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}ì°¨ëŸ‰ì— ì‹œê°„í‘œ 사용: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}시간표를 ë‚ ë³´ë‹¤ 틱로 표시: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}시간표를 ì¼(æ—¥)ì´ ì•„ë‹Œ 틱으로 표시: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}기본 ì² ë„ ì¢…ë¥˜ (새 게임/불러오기 후): {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :보통 ì² ë„
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :ì „ê°œ ì² ë„
@@ -1263,6 +1269,7 @@
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_CONVERT_RAIL :{WHITE}ì´ê³³ì˜ ì² ë„ íƒ€ìž…ì„ ë°”ê¿€ 수 없습니다...
@@ -1373,18 +1380,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}ìžìœ 로운 ì ‘ê·¼ì„ ë§‰ê³ ì‹¶ì„ ë•Œ 게임 ì ‘ê·¼ì‹œ 암호를 ì„¤ì •í• ìˆ˜ 있습니다
STR_NETWORK_SELECT_MAP :{BLACK}맵 ì„ íƒ:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}í”Œë ˆì´í• ë§µì„ ì„ íƒí•©ë‹ˆë‹¤.
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}최대 ì ‘ì†ìž 수:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}최대 ì ‘ì†ìžìˆ˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤. ëª¨ë“ ìŠ¬ë¡¯ì´ ì°¨ìžˆì„ í•„ìš”ëŠ” 없습니다.
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :ì¸í„°ë„·
STR_NETWORK_LAN_INTERNET :LAN / ì¸í„°ë„·
STR_NETWORK_INTERNET_ADVERTISE :ì¸í„°ë„· (ê´‘ê³ í—ˆìš©)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM}명 ì ‘ì†ì¤‘
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}최대 ì ‘ì†ìž 수:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}최대 ì ‘ì†ìžìˆ˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤. ëª¨ë“ ìŠ¬ë¡¯ì´ ì°¨ìžˆì„ í•„ìš”ëŠ” 없습니다.
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}ê°œì˜ íšŒì‚¬
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}최대 회사수:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}ì„œë²„ì˜ íšŒì‚¬ì˜ ìˆ˜ë¥¼ ì œí•œí•©ë‹ˆë‹¤
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM}명 참관중
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}최대 ê´€ì „ìžìˆ˜:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}ê²Œìž„ì„ ê´€ì „í•˜ëŠ” ì ‘ì†ìžì˜ 수를 ì œí•œí•©ë‹ˆë‹¤
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}대화 언어:
STR_NETWORK_LANGUAGE_TIP :{BLACK}서버ì—ì„œ 주로 사용하는 언어를 ê³ ë¥´ì‹ì‹œì˜¤.
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}서버 열기
STR_NETWORK_START_GAME_TIP :{BLACK}무작위 맵ì´ë‚˜ 시나리오로 새로운 ë„¤íŠ¸ì›Œí¬ ê²Œìž„ì„ ì‹œìž‘í•©ë‹ˆë‹¤.
STR_NETWORK_LOAD_GAME :{BLACK}맵 불러오기
@@ -1612,9 +1624,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :ì¼ë°˜ ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
STR_RAILROAD_TRACK_WITH_PRESIGNALS :PRE ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :출구 ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :ì¼ë°˜ ì‹ í˜¸ë“±ê³¼ PREì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :ì¼ë°˜ ì‹ í˜¸ë“±ê³¼ ì¶œêµ¬ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :ì¼ë°˜, 콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :PRE ì‹ í˜¸ë“±ê³¼ ì¶œêµ¬ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :프리, 콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :출구, 콤보-ì‹ í˜¸ë“±ì„ ê°€ì§„ ì² ë¡œ
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}ë¨¼ì € 기차 ì •ê±°ìž¥ì„ ì œê±°í•´ì•¼ 합니다
@@ -1714,8 +1730,8 @@
STR_202B_SERVICES_ALREADY_SUBSIDISED :{BLACK}ì´ë¯¸ ì§€ê¸‰ëœ ë³´ì¡°ê¸ˆ:
STR_202C_FROM_TO :{ORANGE}{1:STATION}ì—ì„œ {2:STATION}까지 {0:STRING} 수송{YELLOW} ({3:COMPANY}
STR_202D_UNTIL :{YELLOW}, {DATE_SHORT}까지)
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED :{BLACK}{BIGFONT}보조금 ì œê³µ 계약 파기:{}{}{0:STRING}ì—ì„œ {1:STRING}ê¹Œì§€ì˜ {2:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE :{BLACK}{BIGFONT}보조금 ì œê³µ ì² íšŒ:{}{}{1:STATION}ì—ì„œ {2:STATION}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED :{BLACK}{BIGFONT}보조금 ì œê³µ 계약 파기:{}{}{1:STRING}ì—ì„œ {2:STRING}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì€ ë”ì´ìƒ ë³´ì¡°ê¸ˆì„ ì§€ê¸‰í•˜ì§€ 않습니다.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE :{BLACK}{BIGFONT}보조금 ì œê³µ ì² íšŒ:{}{}ì§€ì— ë‹¹êµì€ {1:STATION}ì—ì„œ {2:STATION}ê¹Œì§€ì˜ {0:STRING} ìˆ˜ì†¡ì— ëŒ€í•œ ë³´ì¡°ê¸ˆì„ ì² íšŒí•˜ì˜€ìŠµë‹ˆë‹¤.
STR_2030_SERVICE_SUBSIDY_OFFERED :{BLACK}{BIGFONT}보조금 ì œê³µ 안내:{}{}처ìŒìœ¼ë¡œ {1:STRING}ì—ì„œ {2:STRING}ê¹Œì§€ì˜ {0:STRING}ì„/를 수송하는 회사는 ì§€ì— ë‹¹êµìœ¼ë¡œë¶€í„° ë³´ì¡°ê¸ˆì„ ë°›ê²Œ ë 것입니다!
STR_2031_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}{0:COMPANY}ì—게 보조금 지급!{}{}{2:STATION}ì—ì„œ {3:STATION}ê¹Œì§€ì˜ {1:STRING} ìˆ˜ì†¡ì— ëŒ€í•´ 50%ì˜ ì¶”ê°€ ë³´ì¡°ê¸ˆì„ ë‚´ë…„ê¹Œì§€ 받게 ë©ë‹ˆë‹¤!
STR_2032_SERVICE_SUBSIDY_AWARDED :{BLACK}{BIGFONT}{0:COMPANY}ì—게 보조금 지급!{}{}{2:STATION}ì—ì„œ {3:STATION}ê¹Œì§€ì˜ {1:STRING} ìˆ˜ì†¡ì— ëŒ€í•´ 2ë°°ì˜ ì¶”ê°€ ë³´ì¡°ê¸ˆì„ ë‚´ë…„ê¹Œì§€ 받게 ë©ë‹ˆë‹¤!
@@ -1995,7 +2011,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}í„°ë„ì„ ë¨¼ì € ì œê±°í•˜ì‹ì‹œì˜¤
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}다리를 ë¨¼ì € ì œê±°í•˜ì‹ì‹œì˜¤
STR_5008_CANNOT_START_AND_END_ON :{WHITE}ê°™ì€ ìœ„ì¹˜ì—ì„œ ì‹œìž‘í•˜ê³ ë낼 수 없습니다
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}다리 아래ì—는 í‰í‰í•œ ë•…ì´ë‚˜ ë¬¼ì´ ìžˆì–´ì•¼ 합니다!
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}시작과 ëì€ í•œ 줄 ìœ„ì— ìžˆì–´ì•¼ 합니다
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}í„°ë„ ìž…êµ¬ì— ì•Œë§žì§€ ì•Šì€ ìž¥ì†Œìž…ë‹ˆë‹¤
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2060,7 +2075,7 @@
STR_SV_STNAME_WOODS :{STRING} 숲
STR_SV_STNAME_LAKESIDE :{STRING} 호숫가
STR_SV_STNAME_EXCHANGE :{STRING} êµí™˜
-STR_SV_STNAME_AIRPORT :{STRING}ê³µí•
+STR_SV_STNAME_AIRPORT :{STRING}
STR_SV_STNAME_OILFIELD :{STRING} ìœ ì „
STR_SV_STNAME_MINES :{STRING} ê´‘ì‚°
STR_SV_STNAME_DOCKS :{STRING}í•
@@ -2794,7 +2809,7 @@
STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL :{LTBLUE}{TOWN} ì°¨ê³ ë¡œ ì 검하러 가는중 ({VELOCITY})
STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT :{WHITE}ì°¨ëŸ‰ì„ ì°¨ê³ ë¡œ 보낼 수 없습니다...
STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}ì¸ì ‘í•œ ì°¨ê³ ë¥¼ ì°¾ì„ ìˆ˜ 없습니다
-STR_901A_ROAD_VEHICLES_CLICK_ON :{BLACK}ìžë™ì°¨ - click on vehicle for information
+STR_901A_ROAD_VEHICLES_CLICK_ON :{BLACK}ìžë™ì°¨ - ìžì„¸ížˆ ë³´ë ¤ë©´ í´ë¦
STR_901B_BUILD_NEW_ROAD_VEHICLES :{BLACK}새 ìžë™ì°¨ 만들기 (ì°¨ê³ í•„ìš”)
STR_901C_CURRENT_VEHICLE_ACTION :{BLACK}현재 차량 í–‰ë™ - ìš´í–‰/ì •ì§€ì‹œí‚¤ë ¤ë©´ í´ë¦í•˜ì„¸ìš”
STR_901D_SHOW_VEHICLE_S_ORDERS :{BLACK}차량 경로 ë³´ì´ê¸°
@@ -3278,9 +3293,9 @@
STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}ë„“ì´: {NUM} x {NUM}{}ê³ ë„ì°¨: {NUM} m
############ Date formatting
-STR_DATE_TINY :{STRING}-{STRING}-{NUM}
-STR_DATE_SHORT :{STRING} {NUM}
-STR_DATE_LONG :{STRING} {STRING} {NUM}
+STR_DATE_TINY :{2:NUM}.{1:STRING}.{0:STRING}
+STR_DATE_SHORT :{1:NUM}ë…„ {0:STRING}ì›”
+STR_DATE_LONG :{2:NUM}ë…„ {1:STRING}ì›” {0:STRING}ì¼
########
@@ -3340,7 +3355,6 @@
STR_GROUP_RENAME_TIP :{BLACK}ì„ íƒí•œ 그룹 ì´ë¦„ 바꾸기
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}ì „ì²´ ìžë™ êµì²´ë¡œë¶€í„° ì´ ê·¸ë£¹ 보호
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/lithuanian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/lithuanian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1907,7 +1907,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Pirmiau reikia pasalinti tuneli
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Pirmiau reikia pasalinti tilta
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Negalima pradeti ir baigti tuo paciu metu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Po tiltu turi buti lygi zeme arba vanduo
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Pradzia ir pabaiga turi buti vienoje linijoje
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Vieta netinkama įvaziavimui į tunelį
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/norwegian_bokmal.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1931,7 +1931,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Må rive tunnel først
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Må rive bro først
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan ikke starte og slutte på samme felt
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Flatt land eller vann trengs under broen
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start og slutt må være på linje
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Feltet er upassende for tunnelinngang
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/norwegian_nynorsk.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/norwegian_nynorsk.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1104,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll kart
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :av
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Fart på rullehjul: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Høgreklikk emulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Kommando klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontroll klikk
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Av
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automatisk pause når ein startar nytt spel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Bruk avansert køyretøyliste: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Av
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eige firma
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alle firma
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Bruk lasteindikatorar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Av
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eige firma
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Alle firma
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Bruk rutetabellar for køyretøy: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Vis rutetabell i klikk i staden for dagar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Standard Jernbane / etter nytt spel / lasta spel: {ORANGE}{STRING}
@@ -1263,6 +1275,7 @@
STR_BUOY_IS_IN_USE :{WHITE}...bøye er i bruk!
+STR_LANDINFO_COORDS :{BLACK}Koordinatar: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Kan ikkje fjerne del av stasjonen...
STR_CANT_CONVERT_RAIL :{WHITE}Kan ikkje konvertere jernbanetype her...
@@ -1373,18 +1386,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Beskytt spelet ditt med passord så ikkje kven som helst kan verte med på det
STR_NETWORK_SELECT_MAP :{BLACK}Vel eit kart:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Kva kart vil du spele?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maksimalt antal tillatne klientar
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Vel maksimalt antal klientar. Alle plassane treng ikkje å verte tekne
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internett
STR_NETWORK_LAN_INTERNET :LAN / Internett
STR_NETWORK_INTERNET_ADVERTISE :Internett (annonser)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Maksimalt antal tillatne klientar
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Vel maksimalt antal klientar. Alle plassane treng ikkje å verte tekne
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} firma
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Maks. antal firma:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Begrens tenaren til eit visst antal firma
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} tilskodar{P "" ar}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Maks antal tilskodarar
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Begrens tenaren til eit visst antal tilskodarar
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Språk som vert tala på tenaren:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Andre spelarar skal vete kva språk ein talar på denne tenaren
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Start spel
STR_NETWORK_START_GAME_TIP :{BLACK}Start eit nytt nettverksspel frå ein tilfeldig bane, eller eit scenario
STR_NETWORK_LOAD_GAME :{BLACK}Last spel
@@ -1612,9 +1630,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Jernbanespor med normale signal
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Jernbanespor med for-signal
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Jernbanespor med ut-signal
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Jernbane med kombinasjonssignal
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Jernbanespor med normale- og pre-signal
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbanespor med normale- og exit-spor
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbane med vanlege og kombinasjonssignal
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Jernbanespor med pre- og exit-signal
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Jernbane med pre- og kombinasjonssignal
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbane med utgangs- og kombinasjonssignal
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Må fjerne togstasjon først
@@ -1995,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Må rive tunnel først
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Må rive bru først
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan ikkje starte og slutte på same felt
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Flatt land eller vatn trengst under brua
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start og slutt må vere på linje
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Feltet er uhøveleg for tunnelinngang
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3340,7 +3361,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Gje den valde gruppa nytt namn
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Klikk for å beskytte denne gruppa frå å global automatisk erstatning
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/piglatin.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/piglatin.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Ollscray apmay
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Offway
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Apmay ollwheelscray eedspay: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Ightray-ickclay emulationway: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Ommandcay-ickclay
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Ontrolcay-ickclay
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Offway
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automaticallyway ausepay enwhay artingstay away ewnay amegay: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Useway ethay advancedway ehiclevay istlay: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Offway
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Ownway ompanycay
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Allway ompaniescay
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Useway oadinglay indicatorsway:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Offway
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Ownway ompanycay
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Allway ompaniescay
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Enableway imetablingtay orfay ehiclesvay: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Owshay imetabletay inway ickstay atherray anthay aysday: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Efaultday ailray ypetay (afterway ewnay amegay/amegay oadlay): {ORANGE}{STRING}
@@ -1262,6 +1274,7 @@
STR_BUOY_IS_IN_USE :{WHITE}...uoybay isway inway useway!
+STR_LANDINFO_COORDS :{BLACK}Oordinatescay: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}An'tcay emoveray artpay ofway ationstay...
STR_CANT_CONVERT_RAIL :{WHITE}An'tcay onvertcay ailtyperay erehay...
@@ -1372,18 +1385,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Otectpray ouryay amegay ithway away asswordpay ifway ouyay on'tday antway itway otay ebay ubliclypay accessibleway
STR_NETWORK_SELECT_MAP :{BLACK}Electsay away apmay:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Ichwhay apmay oday ouyay antway otay ayplay?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Axmay ientsclay:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Oosechay ethay aximummay umbernay ofway ientsclay. Otnay allway otsslay eednay otay ebay illedfay
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LANay
STR_NETWORK_INTERNET :Internetway
STR_NETWORK_LAN_INTERNET :LANay / Internetway
STR_NETWORK_INTERNET_ADVERTISE :Internetway (advertiseway)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} ient{P "" s}clay
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Axmay ientsclay:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Oosechay ethay aximummay umbernay ofway ientsclay. Otnay allway otsslay eednay otay ebay illedfay
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} ompan{P y ies}cay
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Axmay ompaniescay:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Imitlay ethay erversay otay away ertaincay amountway ofway ompaniescay
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} ectator{P "" s}spay
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Axmay ectatorsspay:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Imitlay ethay erversay otay away ertaincay amountway ofway ectatorsspay
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Anguagelay okenspay:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Otherway ayersplay illway owknay ichwhay anguagelay isway okenspay onway ethay erversay
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Artstay Amegay
STR_NETWORK_START_GAME_TIP :{BLACK}Artstay away ewnay etworknay amegay omfray away andomray apmay, orway enarioscay
STR_NETWORK_LOAD_GAME :{BLACK}Oadlay Amegay
@@ -1611,9 +1629,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Ailwayray acktray ithway ormalnay ignalssay
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Ailwayray acktray ithway epray-ignalssay
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Ailwayray acktray ithway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Ailwayray acktray ithway ombocay-ignalssay
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Ailwayray acktray ithway ormalnay andway epray-ignalssay
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Ailwayray acktray ithway ormalnay andway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Ailwayray acktray ithway ormalnay andway ombocay-ignalssay
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Ailwayray acktray ithway epray- andway exitway-ignalssay
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Ailwayray acktray ithway epray- andway ombocay-ignalssay
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Ailwayray acktray ithway exitway- andway ombocay-ignalssay
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Ustmay emoveray ailwayray ationstay irstfay
@@ -1994,7 +2016,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Ustmay emolishday unneltay irstfay
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Ustmay emolishday idgebray irstfay
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Annotcay artstay andway endway inway ethay amesay otspay
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Evellay andlay orway aterway equiredray underway idgebray
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Artstay andway endway ustmay ebay inway inelay
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Itesay unsuitableway orfay unneltay entranceway
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3360,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Enameray ethay electedsay oupgray
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Ickclay otay otectpray isthay oupgray omfray obalglay autoreplaceway
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/polish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/polish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -2127,7 +2127,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Należy najpierw usunąć tunel
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Należy najpierw usunąć most
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Nie można zaczynać i kończyć w tym samym miejscu
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Wymagany równy ląd lub woda pod mostem
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Początek i koniec muszą być w jednej linii
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Nieodpowiednie miejsce na wejście tunelu
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/portuguese.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/portuguese.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1999,7 +1999,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Deverá demolir o túnel primeiro
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Deverá demolir a ponte primeiro
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Não é posÃvel iniciar e finalizar no mesmo ponto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Debaixo da ponte é necessário terreno plano ou água
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Inicio e fim devem estar alinhados
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}O sÃtio não é adequado para a entrada do túnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/romanian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/romanian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :activ
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Afiseazã viteza vehiculelor in bara de jos: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Permite construirea pe coastã si in pantã: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permite terra-formarea sub cladiri, sine, etc. (auto-pante): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Permite arii de cuprindere mai realistice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permite demolarea unui nr. mai mare constructii: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Permite constructia de trenuri foarte lungi: {ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Ruleaza harta
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :inactiva
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Viteza harta la rotita mouse: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulatie click-dreapta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Comanda-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-click
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Oprit
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}La pornirea unui joc nou, pune-l pe pauza: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Foloseste lista avanata de vehicule: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Oprit
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Propria companie
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Toate companiile
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Foloseste indicatorii de incarcare: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Oprit
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Propria companie
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Toate companiile
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Foloseste orarul pentru vehicule: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Arata orarul per programari, nu per zile: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Tipul implicit de sina (dupa joc nou/incarcare joc): {ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
STR_BUOY_IS_IN_USE :{WHITE}... baliza in uz!
+STR_LANDINFO_COORDS :{BLACK}Coordonate: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Nu pot demola o parte din statie...
STR_CANT_CONVERT_RAIL :{WHITE}Nu pot converti linia aici...
@@ -1372,18 +1386,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Protejeazã-ti jocul cu o parolã dacã nu vrei sã intre jucãtori neautorizati
STR_NETWORK_SELECT_MAP :{BLACK}Alege o hartã:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Ce hartã doresti sa joci?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Numar maxim de clienti
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Alege un numar maxim de clienti. Nu trebuie ocupate toate locurile.
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :LAN / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (fă reclamă)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} client{P "" i}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Numar maxim de clienti
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Alege un numar maxim de clienti. Nu trebuie ocupate toate locurile.
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} compan{P ie ii}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Maximum companii:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Limiteazã serverle la un anumit numãr companii
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} spectator{P "" i}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Maxim spectatori:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Limiteazã serverul la un anumit numãr de spectatori
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Limba vorbită:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Ceilalţi jucători vor şti în ce limbă se discută pe server.
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}ÃŽncepe jocul
STR_NETWORK_START_GAME_TIP :{BLACK}Incepe un joc nou in retea cu o harta aleatoare sau intr-un scenariu
STR_NETWORK_LOAD_GAME :{BLACK}Incarca joc
@@ -1611,9 +1630,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Cale ferată cu semafoare normale
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Cale ferată cu pre-semafoare
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Cale ferată cu semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Cale ferata cu semnale combinate
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Cale ferată cu semafoare normale şi pre-semafoare
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Cale ferată cu semafoare normale şi semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Cale ferata cu semnale normale si combinate
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Cale ferată cu pre-semafoare şi semafoare de ieşire
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Cale ferata cu pre-semnalizate si cu semnale combinate
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Cale ferata cu post-semnalizate si cu semnale combinate
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Trebuie mai intai sa demolati gara
@@ -1994,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Mai întâi trebuie demolat tunelul
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Mai întâi trebuie demolat podul
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Cele două capete nu se pot situa în acelaşi loc
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Sub pod trebuie să existe teren plat sau apă
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Cele două capete trebuie să se situeze în linie
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Loc nepotrivit pentru intrarea într-un tunel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Redenumeste grupul selectat
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Click aici pentru a proteja acest grup de la inlocuirile automate globale
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/russian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/russian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1105,9 +1105,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Ð´Ð»Ñ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :не иÑпользовать
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}СкороÑÑ‚ÑŒ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° прокруткой колеÑа мыши: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}ÐмулÑÑ†Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð³Ð¾ клика мыши: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Команд.
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Контрол.
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Выкл.
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Ðвтопауза в начале игры: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}ИÑпользовать раÑширенный ÑпиÑок транÑпорта: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Выкл.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :СобÑтв.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Ð’Ñе комп.
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}ИÑпользовать индикатор загрузки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Выкл.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :СобÑтв.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Ð’Ñе комп.
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}ИÑпользовать раÑпиÑание Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Показывать раÑпиÑание в 'тиках', а не днÑÑ…: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Тип Ñ€ÐµÐ»ÑŒÑ Ð¿Ð¾ умолчанию (поÑле Ñтарта/загрузки игры): {ORANGE}{STRING}
@@ -1264,6 +1276,7 @@
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_CONVERT_RAIL :{WHITE}Ðевозможно преобразовать тип рельÑа здеÑÑŒ...
@@ -1374,18 +1387,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Защитите вашу игру паролем, еÑли вы не хотите, чтобы к ней могли подключитьÑÑ Ð²Ñе желающие
STR_NETWORK_SELECT_MAP :{BLACK}Выбор карты:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Какую карту вы хотите играть?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}МакÑ. клиентов:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Выбор макÑимального чиÑла клиентов. Ðе вÑе меÑта должны быть занÑÑ‚Ñ‹
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть
STR_NETWORK_INTERNET :Интернет
STR_NETWORK_LAN_INTERNET :Лок. Ñеть/Интернет
STR_NETWORK_INTERNET_ADVERTISE :Интернет (объÑвл.)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} клиент{P "" а ов}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}МакÑ. клиентов:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Выбор макÑимального чиÑла клиентов. Ðе вÑе меÑта должны быть занÑÑ‚Ñ‹
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} компан{P Ð¸Ñ Ð¸Ð¸ ий}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}МакÑ. компаний:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Ограничить макÑимальное чиÑло компаний на Ñервере
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} наблюдател{P ÑŒ Ñ ÐµÐ¹}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}МакÑ. наблюдателей:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Ограничить макÑимальное количеÑтво наблюдателей на Ñервере
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Язык общениÑ:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Другие игроки будут знать, на каком Ñзыке говорÑÑ‚ на Ñервере
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}ЗапуÑк игры
STR_NETWORK_START_GAME_TIP :{BLACK}ЗапуÑк новой Ñетевой игры Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ð¾Ð¹ карты или ÑценариÑ
STR_NETWORK_LOAD_GAME :{BLACK}Загрузка игры
@@ -1613,9 +1631,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Ж/Д путь Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ Ñигналом
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Ж/Д путь Ñ Ð¿Ñ€ÐµÑигналами
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Ж/Д путь Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ Ñигналами
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Ж/д путь Ñ ÐºÐ¾Ð¼Ð±Ð¾-Ñигналами
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :РельÑÑ‹ и нормальными и пре-Ñигналами
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :РельÑÑ‹ и нормальными и выходными Ñигналами
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Ж/д путь Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ и комбо-Ñигналами
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :РельÑÑ‹ Ñ Ð¿Ñ€Ðµ- и выходными Ñигналами
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Ж/д путь Ñ Ð¿Ñ€Ðµ- и комбо-Ñигналами
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Ж/д путь Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ и комбо-Ñигналами
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Сначала удалите ЖД Ñтанцию
@@ -1996,7 +2018,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Сначала удалите туннель
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Сначала удалите моÑÑ‚
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ðе может начинатьÑÑ Ð¸ заканчиватьÑÑ Ð² той же точке
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Более низкий уровень земли или воды должен быть под моÑтом
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Ðачало и конец должны быть на одной линии
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}ÐеподходÑщее меÑто Ð´Ð»Ñ ÑтроительÑтва туннелÑ
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/simplified_chinese.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/simplified_chinese.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1900,7 +1900,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}必须先拆除隧é“
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}必须先拆除桥æ¢
STR_5008_CANNOT_START_AND_END_ON :{WHITE}èµ·æ¢ç‚¹ä¸èƒ½ç›¸åŒ
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}桥下必须有ä¸å¹³æ•´çš„地é¢æˆ–æ°´é¢
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}èµ·æ¢ä¸¤ç«¯å¿…须在一æ¡çº¿ä¸Š
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}æ¤å¤„ä¸é€‚åˆä½œä¸ºéš§é“å…¥å£
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/slovak.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/slovak.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1084,6 +1084,7 @@
STR_CONFIG_PATCHES_ON :Zap.
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Zobrazit rychlost vozidla v stavovej liste: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Umoznit vystavbu na svahoch a na pobrezi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Povolit úpravy terénu pod budovami, kolajami, ... : {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Povolit realistickejsiu velkost oblasti pokrytia: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Umoznit odstranenie viacerych mestskych ciest, mostov, ... : {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Umoznit stavbu dlhych vlakov: {ORANGE}{STRING}
@@ -1167,9 +1168,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Posúvat mapu
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Vypnuté
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Rychlost posúvania pohladu: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Funkcia pravého tlacidla myši: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :PrÃkaz - klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control - klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Ziadna
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automaticka pauza pri Å¡tarte novej hry: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Použit vylepšený zoznam vozidiel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Vypnutý
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Vlastná spolocnost
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :VÅ¡etky spolocnosti
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Zobrazovat ukazovatele nakladania a vykladania: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Vypnuté
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Vlastná spolocnost
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :VÅ¡etky spolocnosti
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Povolit cestovné poriadky pre vozidlá: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Zobrazovat cestovné poriadky v tikoch namiesto dnÃ: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Predvolený typ kolajà (v novej/nahranej hre): {ORANGE}{STRING}
@@ -2068,7 +2081,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Tunel musi byt najskor zburany
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Most musi byt najskor zburany
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Nemozno zacat a skoncit na tom istom mieste
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Pod mostom je potrebná voda alebo údolie
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Zaciatok a koniec musi byt v rovine
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}To miesto je nepouzitelne ako vstup do tunela
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/slovenian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/slovenian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1062,6 +1062,7 @@
STR_CONFIG_PATCHES_ON :Vklopi
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Prikaz hitrosti vozil v vrstici stanja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Dovoli gradnjo hiš na nagibih ali obali: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Dovoli oblikovanje terena pod objekti (tiri, hiše) (samonaklon): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Dovoli bolj resniÄni obmoÄni zajem postaj: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Dovoli odstanitev mestnih cest, mostov, itd.: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}OmogoÄi gradnjo zelo dolgih vlakov: {ORANGE}{STRING}
@@ -1145,9 +1146,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Premikaj zemljevid
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Izklopljeno
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Hitrost premika s kolescem miške: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulacija desnega gumba miške: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Ukaz-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrola-klik
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Izklop
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Avtomatsko pavziraj ob zagonu nove igre: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Uporabi napreden seznam vozil: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Izklop
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Lastno podjetje
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Vsa podjetja
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Uporabi pregledno polnenje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Izklop
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Lastno podjetje
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Vsa podjetja
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}OmogoÄi Äasovne tabele vozil: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Prikaz Äasovnih tabel v pikah namesto dneh: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Privzeta vrsta železnice (ob zagonu nove igre): {ORANGE}{STRING}
@@ -2084,7 +2097,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Najprej moraš porušiti predor
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Najprej moraš porušiti most
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Ni mogoÄe zaÄeti in konÄati v isti toÄki
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Raven teren ali vodovje zahtevano pod mostom
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}ZaÄetek in konec morata biti na isti viÅ¡ini
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Lokacija neprimerna za vhod v predor
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/spanish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/spanish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1021,6 +1021,7 @@
STR_CONFIG_PATCHES_ON :SÃ
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Mostrar velocidad del vehÃculo en la barra de estado: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Permitir la construcción en cuestas y orillas: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permitir pendientes bajo construcciones, carreteras, etc. (autopendiente): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Permitir tamaño del área de captación más realista: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permitir demoler más propiedades de poblaciones: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Permitir la construcción de trenes muy largos: {ORANGE}{STRING}
@@ -1104,9 +1105,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll sobre el mapa
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Nada
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Velocidad del scroll sobre el mapa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Emulación del botón derecho: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Tecla Command
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Tecla Control
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Desactivado
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Automaticamente hace pausa cuando empieza un juego nuevo: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Usar la lista avanza de vehÃculos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Apagado
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Propia empresa
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Todas las empresas
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Usar indicadores de carga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Apagado
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Propia empresa
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Todas las empresas
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Activar horarios para vehÃculos: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Mostrar horario en ticks en vez de en dias: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Rail por defecto (juego nuevo/cargar juego): {ORANGE}{STRING}
@@ -1325,7 +1338,7 @@
STR_NETWORK_MULTIPLAYER :{WHITE}Multijugador
-STR_NETWORK_PLAYER_NAME :{BLACK}Nombre Jugad.:
+STR_NETWORK_PLAYER_NAME :{BLACK}Nombre del Jugador:
STR_NETWORK_ENTER_NAME_TIP :{BLACK}Este es el nombre con el que otros jugadores le identificarán
STR_NETWORK_CONNECTION :{BLACK}Conexión:
STR_NETWORK_CONNECTION_TIP :{BLACK}Seleccione entre un juego en Internet o en una Red de Ãrea Local
@@ -2005,7 +2018,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Primero debe demolerse el túnel
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Primero debe demolerse el puente
STR_5008_CANNOT_START_AND_END_ON :{WHITE}No se puede comenzar y acabar en la misma posición
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Se requiere tierra a nivel o agua bajo el puente
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Comienzo y final deben estar en lÃnea
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Lugar inapropiado para entrada de túnel
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/swedish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/swedish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1103,9 +1103,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scrolla kartan
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Avstängd
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Mushjulshastighet: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Högerklicksemulering: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Command-klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Control-klick
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Av
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Pausa automatiskt vid start av nytt spel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Använd den avancerade fordonslistan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Av
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eget företag
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alla företag
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Använd lastningsindikatörer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Av
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eget företag
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Alla företag
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Aktivera Tidtabeller för fordon: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Visa tidtabeller räknat i ticks istället för dagar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Standard järnvägsräls (efter nytt/laddat spel): {ORANGE}{STRING}
@@ -1262,6 +1274,7 @@
STR_BUOY_IS_IN_USE :{WHITE}... bojen används!
+STR_LANDINFO_COORDS :{BLACK}Koordinater: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Kan ej ta bort del av station...
STR_CANT_CONVERT_RAIL :{WHITE}Kan inte konvertera spårtyp här...
@@ -1372,18 +1385,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Skydda spelet med ett lösenord så att inte andra än dom som har lösenordet kan gå med i spelet
STR_NETWORK_SELECT_MAP :{BLACK}Välj karta:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Vilken karta vill du spela?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Max antal tillåtna klienter:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Välj max antal tillåtna klienter. Alla platser måste inte fyllas.
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :LAN / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (publik)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} klient{P "" s}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Max antal tillåtna klienter:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Välj max antal tillåtna klienter. Alla platser måste inte fyllas.
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} företag{P y ies}
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Max företag:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Begränsa antalet företag på servern
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} åskådare{P "" s}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Max observatörer:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Begränsa antalet observatörer på servern
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Språk som talas:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Andra spelare kommer vara medvetna vilket språk som talas på servern.
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Starta spelet
STR_NETWORK_START_GAME_TIP :{BLACK}Starta ett nytt spel med en slumpmässig karta eller från ett scenario
STR_NETWORK_LOAD_GAME :{BLACK}Ladda spel
@@ -1611,9 +1629,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Järnväg med vanliga signaler
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Järnväg med för-signaler
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Järnväg med utgående signaler
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Tågspår med kombinationsignaler
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Järnväg med normala signaler och för-signaler
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Järnväg med normala signaler och utfarts-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Tågspår med normal- och kombinationsignaler
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Järnväg med för- och utfarts-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Tågspår med för- och kombinationsignaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Tågspår med utgångs- och kombinationsignaler
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Måste ta bort tågstationen först
@@ -1994,7 +2016,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Måste riva tunnel först
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Måste riva bro först
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan inte börja och sluta på samma plats
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Platt land eller vatten krävs under bro
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Start- och slutpunkt måste ligga i linje
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Platsen passar inte för tunnelentré
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3311,6 +3332,10 @@
STR_GROUP_ALL_ROADS :Alla vägfordon
STR_GROUP_ALL_SHIPS :Alla skepp
STR_GROUP_ALL_AIRCRAFTS :Alla flygplan
+STR_GROUP_DEFAULT_TRAINS :Ogrupperade tåg
+STR_GROUP_DEFAULT_ROADS :Ogrupperade vägfordon
+STR_GROUP_DEFAULT_SHIPS :Ogrupperade skepp
+STR_GROUP_DEFAULT_AIRCRAFTS :Ogrupperade flygmaskiner
STR_GROUP_TINY_NUM :{TINYFONT}{COMMA}
STR_GROUP_ADD_SHARED_VEHICLE :Lägg till delade fordon
STR_GROUP_REMOVE_ALL_VEHICLES :Ta bort alla fordon
@@ -3335,7 +3360,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Döp om den valda gruppen
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Klicka för att skydda denna grupp från globalt autoutbyte
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/traditional_chinese.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/traditional_chinese.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :é–‹
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}於狀態列顯示速度:{ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}於斜å¡å’Œå²¸é‚Šèˆˆå»ºï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}å…許在建物或是軌é“底下改變地形斜度 (autoslope):{ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}真實大å°çš„收集範åœï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}å¯ç§»é™¤æ›´åŸŽéŽ®æ“有的é“路,橋樑ç‰ï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}æ高列車長度é™åˆ¶ï¼š{ORANGE}{STRING}
@@ -1103,9 +1104,21 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :æ²å‹•åœ°åœ–
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :關閉
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}滾輪地圖æ²å‹•é€Ÿåº¦ï¼š {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}å³éµæ¨¡æ“¬ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :命令éµ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :控制éµ
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :ç„¡
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}自動在開始新éŠæˆ²æ™‚æš«åœï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}使用進階載具å單: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :ç„¡
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :自家公å¸
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :所有公å¸
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}使用載入指示:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :ç„¡
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :自家公å¸
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :所有公å¸
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}啟用é‹å…·æ™‚刻表功能:{ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}顯示時刻表時以 Tick 為單ä½è€Œä¸æ˜¯æ—¥ï¼š{ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}é è¨çš„路軌類型 (將在新éŠæˆ²æˆ–載入éŠæˆ²æ™‚生效):{ORANGE}{STRING}
@@ -1262,6 +1275,7 @@
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_CONVERT_RAIL :{WHITE}無法轉æ›è»Œé“種類...
@@ -1372,18 +1386,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}如果您ä¸æƒ³è®“大眾連線的話,å¯ä»¥ç”¨å¯†ç¢¼ä¿è·éŠæˆ²
STR_NETWORK_SELECT_MAP :{BLACK}é¸æ“‡åœ°åœ–:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}您想玩哪個地圖?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}客戶端上é™ï¼š
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}é¸æ“‡é€£ç·šäººæ•¸ä¸Šé™ã€‚未必æ¯å€‹åé¡éƒ½éœ€é€£ç·š
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :局域網絡(LAN)
STR_NETWORK_INTERNET :互è¯ç¶²
STR_NETWORK_LAN_INTERNET :局域網/互è¯ç¶²
STR_NETWORK_INTERNET_ADVERTISE :Internet (廣告)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} 玩家
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}客戶端上é™ï¼š
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}é¸æ“‡é€£ç·šäººæ•¸ä¸Šé™ã€‚未必æ¯å€‹åé¡éƒ½éœ€é€£ç·š
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} å…¬å¸
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}å…¬å¸ä¸Šé™ï¼š
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}é™åˆ¶ä¼ºæœå™¨å¯ä»¥å»ºç«‹çš„å…¬å¸æ•¸
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} 觀戰
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}觀看者上é™ï¼š
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}é™åˆ¶å¯åŠ 入的觀察者數é‡
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}所用的語言:
STR_NETWORK_LANGUAGE_TIP :{BLACK}讓其他人知é“這個伺æœå™¨ä½¿ç”¨çš„交談語言
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}開始éŠæˆ²
STR_NETWORK_START_GAME_TIP :{BLACK}以隨機地圖或劇本開始新的網路éŠæˆ²
STR_NETWORK_LOAD_GAME :{BLACK}載入éŠæˆ²
@@ -1611,9 +1630,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :有一般號誌的éµè»Œ
STR_RAILROAD_TRACK_WITH_PRESIGNALS :有入å£è™ŸèªŒçš„éµè»Œ
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :有出å£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :有組åˆè™ŸèªŒçš„éµè»Œ
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :有一般號誌åŠå…¥å£è™ŸèªŒçš„éµè»Œ
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :有一般號誌åŠå‡ºå£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :有一般號誌åŠçµ„åˆè™ŸèªŒçš„éµè»Œ
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :有入å£è™ŸèªŒåŠå‡ºå£è™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :有入å£è™ŸèªŒåŠçµ„åˆè™ŸèªŒçš„éµè»Œ
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :有出å£è™ŸèªŒåŠçµ„åˆè™ŸèªŒçš„éµè»Œ
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}å¿…é ˆå…ˆç§»é™¤ç«è»Šç«™
@@ -1994,7 +2017,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}å¿…é ˆå…ˆæ‘§æ¯€éš§é“
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}å¿…é ˆå…ˆæ‘§æ¯€æ©‹æ¨‘
STR_5008_CANNOT_START_AND_END_ON :{WHITE}ä¸èƒ½çµæŸåœ¨é–‹å§‹åœ°é»ž
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}橋樑下需è¦å¹³åœ°æˆ–æ°´é¢
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}開始與çµæŸåœ°é»žå¿…é ˆä½åœ¨åŒä¸€ç›´ç·š
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}隧é“å…¥å£åœ°é»žä¸é©åˆ
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -3339,7 +3361,6 @@
STR_GROUP_RENAME_TIP :{BLACK}為群組é‡æ–°å‘½å
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}點æ¤å¯é¿å…æ¤ç¾¤çµ„內的è¨å‚™è¢«ä¾†è‡ªå…¨åŸŸçš„è¨å®šæ›¿æ›
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
--- a/src/lang/turkish.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/turkish.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1020,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :Açık
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Durum çubuğunda arabanın hızını göster: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Sahile ve eÄŸimli araziye inÅŸaat: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Binaların, yolların, vb. altında kazıya izin ver (otomatik betonlama): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Daha gerçekçi kapsama alanı: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Şehrin yollarını, köprülerini yıkma izinli: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Çok uzun trenlere izin ver: {ORANGE}{STRING}
@@ -1033,6 +1034,9 @@
STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Sadece istek varsa kargo kabul edilsin: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGBRIDGES :{LTBLUE}Çok uzun köprülere izin ver: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GOTODEPOT :{LTBLUE}Garaja git talimati etkin: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Üretim fabrikalarının yapım yöntemi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :hiçbiri
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :diÄŸer fabrikalar gibi
STR_CONFIG_PATCHES_MULTIPINDTOWN :{LTBLUE}Bir şehirde birden fazla aynı fabrika olması izinli: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SAMEINDCLOSE :{LTBLUE}Aynı tür fabrikalar yan yana yapılabilir: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Durum çubuğunda uzun tarih göster: {ORANGE}{STRING}
@@ -1099,9 +1103,20 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Haritayı kaydır
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Kapalı
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Tekerlek hızı: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Sağ tıklama öykünümü: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND :Komut-tıklama
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL :Kontrol-tıklama
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Kapalı
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Yeni bir oyun başlatırken zamanı duraklat: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Gelişmiş araç listesini kullan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Kendi ÅŸirketim
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Tüm şirketler
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Araç yükleme bilgisini göster: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Kapalı
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Kendi ÅŸirketim
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Tüm şirketler
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Araç zaman çizelgesi açık: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Normal Ray
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Elektrikli Ray
@@ -1111,6 +1126,7 @@
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST :En yenisi
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED :En çok kullanılan
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE :{LTBLUE}Hiç uygun araç olmasa da inşa araçlarını göster: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Her oyuncu için en fazla tren: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Her oyuncu için en fazla araba: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_AIRCRAFT :{LTBLUE}Her oyuncu için en fazla uçak: {ORANGE}{STRING}
@@ -1145,6 +1161,7 @@
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Bu tarihten önce ışık yerine semafor kullan: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Senaryo düzenleyicisinde "yolsuz" şehir seçeneği kullanılamaz
+STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Şehir yol yerleşimini seç: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS :yolsuz
STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :varsayılan
STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS :daha iyi yollar
@@ -1164,6 +1181,7 @@
STR_CONFIG_PATCHES_TOWN_GROWTH_FAST :Hızlı
STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST :Çok Hızlı
STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Kasabaların şehir olması için gerekli nüfus: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Şehir olacak kasabaların oranı: {ORANGE}Hiçbiri
STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}Birincil şehir büyüklüğü çarpanı: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GUI :{BLACK}Arayüz
@@ -1253,6 +1271,7 @@
STR_BUOY_IS_IN_USE :{WHITE}...samandıra kullanımda!
+STR_LANDINFO_COORDS :{BLACK}Koordinatlar: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}İstasyonun parçasi kaldırılamaz...
STR_CANT_CONVERT_RAIL :{WHITE}Ray türü değiştirilemiyor...
@@ -1363,18 +1382,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Erişimi kısıtlamak için oyuna parola koy
STR_NETWORK_SELECT_MAP :{BLACK}Harita seç:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Hangi haritada oynamak istiyorsun?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Ä°zin verilen en fazla oyuncu:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}İzin verilen en fazla oyuncu sayısını seç. Her yerin dolması gerekmez
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Ä°nternet
STR_NETWORK_LAN_INTERNET :LAN / internet
STR_NETWORK_INTERNET_ADVERTISE :Ä°nternet (reklam vererek)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} istemci
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Ä°zin verilen en fazla oyuncu:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}İzin verilen en fazla oyuncu sayısını seç. Her yerin dolması gerekmez
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} ÅŸirket
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}En fazla ÅŸirket:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Sunucudaki şirket sayısını sınırla
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} seyirci
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}En fazla izleyici:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Sunucudaki izleyici sayısını sınırla
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}KonuÅŸulan dil:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Diğer oyuncular sunucuda hangi dilin konuşulacağını bilecek
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Oyunu BaÅŸlat
STR_NETWORK_START_GAME_TIP :{BLACK}Rastgele harita ya da senaryoda network oyunu aç
STR_NETWORK_LOAD_GAME :{BLACK}Oyun Yükle
@@ -1385,22 +1409,28 @@
STR_NETWORK_LANG_ENGLISH :Ä°ngilizce
STR_NETWORK_LANG_GERMAN :Almanca
STR_NETWORK_LANG_FRENCH :Fransızca
+STR_NETWORK_LANG_BRAZILIAN :Brezilyaca
STR_NETWORK_LANG_BULGARIAN :Bulgarca
STR_NETWORK_LANG_CHINESE :Çince
STR_NETWORK_LANG_CZECH :Çekce
+STR_NETWORK_LANG_DANISH :Danimarkaca
+STR_NETWORK_LANG_DUTCH :Hollandaca
STR_NETWORK_LANG_FINNISH :Fince
STR_NETWORK_LANG_HUNGARIAN :Bulgarca
+STR_NETWORK_LANG_ICELANDIC :Ä°zlandaca
STR_NETWORK_LANG_ITALIAN :Ä°talyanca
STR_NETWORK_LANG_JAPANESE :Japonca
STR_NETWORK_LANG_KOREAN :Korece
STR_NETWORK_LANG_LITHUANIAN :Litvanyaca
STR_NETWORK_LANG_NORWEGIAN :Norveççe
+STR_NETWORK_LANG_POLISH :Lehçe
STR_NETWORK_LANG_PORTUGUESE :Portekizce
STR_NETWORK_LANG_ROMANIAN :Romanca
STR_NETWORK_LANG_RUSSIAN :Rusça
STR_NETWORK_LANG_SLOVAK :Slovakça
STR_NETWORK_LANG_SLOVENIAN :Slovence
STR_NETWORK_LANG_SPANISH :Ä°spanyolca
+STR_NETWORK_LANG_SWEDISH :İsveççe
STR_NETWORK_LANG_TURKISH :Türkçe
STR_NETWORK_LANG_UKRAINIAN :Ukraynaca
############ End of leave-in-this-order
@@ -1595,9 +1625,13 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Normal sinyalli ray
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Ön-sinayalli ray
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Çıkış-sinyalli ray
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :BirleÅŸik sinyalli ray
STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Normal ve ön sinyalli ray
STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Normal ve çıkış sinyalli ray
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Normal ve birleÅŸik sinyalli ray
STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Ön ve Çıkış sinyalli ray
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Ön ve birleşik sinyalli ray
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Çıkış ve birleşik sinyalli ray
STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Önce tren istasyonu kaldırılmalı
@@ -1942,6 +1976,12 @@
STR_4829_REQUIRES :{BLACK}Ä°stenenler: {YELLOW}{STRING}, {STRING}, {STRING}
############ range for requires ends
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Ä°ÅŸlenmeyi bekleyen kargo:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
+STR_4827_PRODUCES :{BLACK}Ãœretir: {YELLOW}{STRING}
+STR_4828_PRODUCES :{BLACK}Ãœretir: {YELLOW}{STRING}, {STRING}
+############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Geçen ayki üretim:
STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} (%{COMMA} tasindi)
@@ -1972,7 +2012,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Önce tünel yıkılmalı
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Önce köprü yıkılmalı
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Aynı noktada başlayıp bitemez
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Köprü altınin düz olması gerekiyor
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Başlangıç ve bitiş aynı çizgi üzerinde olmalı
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Yer tünel girişi için uygun değil
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -2704,7 +2743,7 @@
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_S} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Mak. hız: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Ağırlık: {LTBLUE}{WEIGHT_S} {BLACK}Güç: {LTBLUE}{POWER}{BLACK} Mak. hız: {LTBLUE}{VELOCITY} {BLACK}Max. Ç.G.: {LTBLUE}{FORCE}
STR_885F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Bu seneki kâr: {LTBLUE}{CURRENCY} (geçen sene: {CURRENCY})
-STR_8860_RELIABILITY_BREAKDOWNS :{BLACK}güvenilirlik: {LTBLUE}%{COMMA} {BLACK}Son servisteki bozulmalar: {LTBLUE}{COMMA}
+STR_8860_RELIABILITY_BREAKDOWNS :{BLACK}Güvenilirlik: {LTBLUE}%{COMMA} {BLACK}Son servisteki bozulmalar: {LTBLUE}{COMMA}
STR_8861_STOPPED :{RED}Durdu
STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Tehlikedeki tren sinyali geçemez...
STR_8863_CRASHED :{RED}Çarptı!
@@ -2756,7 +2795,7 @@
STR_900D_AGE_RUNNING_COST_YR :{BLACK}Yaş: {LTBLUE}{STRING}{BLACK} Bakım: {LTBLUE}{CURRENCY}/sene
STR_900E_MAX_SPEED :{BLACK}Mak. hız: {LTBLUE}{VELOCITY}
STR_900F_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Bu seneki kâr: {LTBLUE}{CURRENCY} (geçen sene: {CURRENCY})
-STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}güvenilirlik: {LTBLUE}%{COMMA} {BLACK}Breakdowns since last service: {LTBLUE}{COMMA}
+STR_9010_RELIABILITY_BREAKDOWNS :{BLACK}Güvenilirlik: {LTBLUE}%{COMMA} {BLACK}Breakdowns since last service: {LTBLUE}{COMMA}
STR_9011_BUILT_VALUE :{LTBLUE}{ENGINE}{BLACK} Yapım yılı: {LTBLUE}{NUM}{BLACK} Değeri: {LTBLUE}{CURRENCY}
STR_9012_CAPACITY :{BLACK}Kapasite: {LTBLUE}{CARGO}
STR_9013_MUST_BE_STOPPED_INSIDE :{WHITE}...bir araba garajında duruyor olmalı
@@ -3284,6 +3323,10 @@
STR_GROUP_ALL_ROADS :Bütün arabalar
STR_GROUP_ALL_SHIPS :Bütün Gemiler
STR_GROUP_ALL_AIRCRAFTS :Bütün uçaklar
+STR_GROUP_DEFAULT_TRAINS :Gruplanmamış trenler
+STR_GROUP_DEFAULT_ROADS :Gruplanmamış arabalar
+STR_GROUP_DEFAULT_SHIPS :Gruplanmamış gemiler
+STR_GROUP_DEFAULT_AIRCRAFTS :Gruplanmamış uçaklar
STR_GROUP_TINY_NUM :{TINYFONT}{COMMA}
STR_GROUP_ADD_SHARED_VEHICLE :Bütün paylaşılan araçlar
STR_GROUP_REMOVE_ALL_VEHICLES :Bütün araçları çıkar
@@ -3308,7 +3351,6 @@
STR_GROUP_RENAME_TIP :{BLACK}Seçili grubun ismini değiştir
STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Bu grubu otomatik yenilemeden ayrı tutmak için tıklayın
-
STR_COMPANY_NAME :{COMPANY}
STR_ENGINE_NAME :{ENGINE}
STR_GROUP_NAME :{GROUP}
@@ -3323,3 +3365,7 @@
STR_PREVIOUS_SIGN_TOOLTIP :{BLACK}Önceki tabelaya git
########
+
+STR_FUND_NEW_INDUSTRY :{BLACK}Parayla Yap
+STR_BUILD_NEW_INDUSTRY :{BLACK}Ä°nÅŸa et
+STR_INDUSTRY_SELECTION_HINT :{BLACK}Bu listeden uygun fabrikayı seçin
--- a/src/lang/ukrainian.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/ukrainian.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1146,6 +1146,7 @@
STR_CONFIG_PATCHES_ON :Так
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Показувати швидкіÑÑ‚ÑŒ у Ñ€Ñдку Ñтану: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Будувати на Ñхилах та узбережжÑÑ…: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}МінÑти Ñхили під будівлÑми, дорогами тощо (автоÑхил): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Великий район обÑлуговуваннÑ: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Переміщувати дороги, моÑти та іншу влаÑніÑÑ‚ÑŒ міÑта: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Будувати дуже довгі поїзди: {ORANGE}{STRING}
@@ -1229,9 +1230,19 @@
STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Прокрутка карти
STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Відкл.
STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}ШвидкіÑÑ‚ÑŒ прокрутки колеÑом миші: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU :{LTBLUE}ЕмулÑÑ†Ñ–Ñ Ð·Ð° правим клацом миші: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Відкл.
+
STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Ðвтоматично Ñтавити паузу при Ñтарті нової гри: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}ВикориÑтовувати покращений ÑпиÑок транÑпорту: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :відкл.
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :ВлаÑна компаніÑ
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :УÑÑ– компанії
STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}ВикориÑтовувати індикатори завантаженнÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :відкл.
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :ВлаÑна компаніÑ
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :УÑÑ– компанії
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Дозволити розклад руху Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорту: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Показувати розклад в одиницÑÑ…, а не в днÑÑ…: {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Тип колії за замовчаннÑм (при новій грі/завантаженні): {ORANGE}{STRING}
@@ -2167,7 +2178,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Спочатку зруйнуйте тунель
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Спочатку зруйнуйте міÑÑ‚
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Початок та кінець не можуть бути в одному міÑці
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Рівна Ð·ÐµÐ¼Ð»Ñ Ñ‡Ð¸ вода має бути під моÑтом
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Початок та кінець мають бути на одній лінії
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Ðевідповідне міÑце Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ тунелÑ
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/lang/unfinished/afrikaans.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/unfinished/afrikaans.txt Sat Oct 06 21:16:00 2007 +0000
@@ -3,6 +3,8 @@
##isocode af_ZA
##plural 0
+#
+
##id 0x0000
STR_NULL :
STR_0001_OFF_EDGE_OF_MAP :{WHITE}Oor kant van kaart
@@ -10,10 +12,10 @@
STR_0003_NOT_ENOUGH_CASH_REQUIRES :{WHITE}Nie genoeg kontant nie - vereis {CURRENCY}
STR_0004 :{WHITE}{CURRENCY}
STR_EMPTY :
-STR_0007_FLAT_LAND_REQUIRED :{WHITE}Platte land vereis
+STR_0007_FLAT_LAND_REQUIRED :{WHITE}Vereis platte land
STR_0008_WAITING :{BLACK}Wagtend: {WHITE}{STRING}
STR_0009 :{WHITE}{CARGO}
-STR_000A_EN_ROUTE_FROM :{WHITE}{CARGO}{YELLOW} (onderweg van
+STR_000A_EN_ROUTE_FROM :{WHITE}{CARGO}{YELLOW} (op pad van
STR_000B :{YELLOW}{STATION})
STR_000C_ACCEPTS :{BLACK}Aanvaar: {WHITE}
STR_000D_ACCEPTS :{BLACK}Aanvaar: {GOLD}
@@ -219,7 +221,7 @@
STR_00FC_FOREST :{BLACK}{TINYFONT}Woud
STR_00FD_SAWMILL :{BLACK}{TINYFONT}Saagmeul
STR_00FE_OIL_REFINERY :{BLACK}{TINYFONT}Olie Raffineerdery
-STR_00FF_FARM :{BLACK}{TINYFONT}Plaas
+STR_00FF_FARM :{BLACK}{TINYFONT}Boerdery
STR_0100_FACTORY :{BLACK}{TINYFONT}Fabriek
STR_0101_PRINTING_WORKS :{BLACK}{TINYFONT}Drukwerke
STR_0102_OIL_WELLS :{BLACK}{TINYFONT}Olie Bron
@@ -268,7 +270,7 @@
STR_012D :{WHITE}{STRING}
STR_012E_CANCEL :{BLACK}Kanselleer
STR_012F_OK :{BLACK}OK
-STR_0130_RENAME :{BLACK}Hernaam
+STR_0130_RENAME :{BLACK}Hernoem
STR_0131_TOO_MANY_NAMES_DEFINED :{WHITE}Te veel naame bepaal
STR_0132_CHOSEN_NAME_IN_USE_ALREADY :{WHITE}Verkieste naam reeds in gebruik
@@ -307,7 +309,7 @@
STR_0148_GAME_OPTIONS :{BLACK}Spel Opsies
STR_0150_SOMEONE :iemand{SKIP}{SKIP}
-STR_0151_MAP_OF_WORLD :Kaart van die wereld
+STR_0151_MAP_OF_WORLD :Kaart van die wêreld
STR_0152_TOWN_DIRECTORY :Stad index
STR_0153_SUBSIDIES :Subsidiëe
@@ -391,6 +393,10 @@
STR_ENGINE_SORT_RUNNING_COST :Loopkoste
STR_ENGINE_SORT_CARGO_CAPACITY :Vrag Kapasiteit
STR_NO_WAITING_CARGO :{BLACK}Geen vrag van enige tipe is op wag
+STR_AVAILABLE_TRAINS :{BLACK}Beskikbaar Treine
+STR_AVAILABLE_ROAD_VEHICLES :{BLACK}Beskikbaar Voertuie
+STR_AVAILABLE_SHIPS :{BLACK}Beskikbaar Skepe
+STR_AVAILABLE_AIRCRAFT :{BLACK}Beskikbaar Vliegtuie
STR_AVAILABLE_ENGINES_TIP :{BLACK}Wys 'n lys van beskikbaare enjin tipes vir die voertiug tipe.
STR_MANAGE_LIST :{BLACK}Bestuur lys
STR_MANAGE_LIST_TIP :{BLACK}Stuur instruksies na alle voertuie in die lys
@@ -420,7 +426,7 @@
STR_016F :{TINYFONT}{STRING}{} {STRING}{}{NUM}
STR_0170 :{TINYFONT}{STRING}-
STR_0171_PAUSE_GAME :{BLACK}Pouseer spel
-STR_0172_SAVE_GAME_ABANDON_GAME :{BLACK}Bewaar spel. verlaat spel, verlaat
+STR_0172_SAVE_GAME_ABANDON_GAME :{BLACK}Bewaar spel. verlaat spel, uitgang
STR_0173_DISPLAY_LIST_OF_COMPANY :{BLACK}Vertoon lys van maatskappy se stasies
STR_0174_DISPLAY_MAP :{BLACK}Vertoon kaart
STR_0175_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Vertoon kaart, stad index
@@ -473,7 +479,7 @@
STR_019D_AIRCRAFT :Vliegtuig
STR_019E_SHIP :Skip
STR_019F_TRAIN :Trein
-STR_01A0_IS_GETTING_OLD :{WHITE}{STRING} {COMMA} is besig om out te word
+STR_01A0_IS_GETTING_OLD :{WHITE}{STRING} {COMMA} raak nou oud
STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} is besig om baie oud te word
STR_01A2_IS_GETTING_VERY_OLD_AND :{WHITE}{STRING} {COMMA} is besig om baie oud te word en moet dringend vervang word
STR_01A3_LAND_AREA_INFORMATION :{WHITE}Land Area Inligting
@@ -561,11 +567,11 @@
STR_01F3_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Kies 'alle liedjies' musiek lys
STR_01F4_SELECT_OLD_STYLE_MUSIC :{BLACK}Kies 'ou styl musiek' musiek lys
STR_01F5_SELECT_NEW_STYLE_MUSIC :{BLACK}Kies 'nuwe styl musiek' musiek lys
-STR_01F6_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Kies 'Gewoonte 1' musiek lys
-STR_01F7_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Kies 'Gewoonte 2' musiek lys
-STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Reinig huidige musiek keuse (slegs Gewoonte 1 of Gewoonte 2)
+STR_01F6_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Kies 'Gewoonte 1' (gebruiker-gestel) musiek lys
+STR_01F7_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Kies 'Gewoonte 2' (gebruiker-gestel) musiek lys
+STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Reinig huidige musiek keuse (slegs Gewoonte1 of Gewoonte2)
STR_01F9_SAVE_MUSIC_SETTINGS :{BLACK}Bewaar musiek stellings
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO :{BLACK}Kliek op musiek liedjie om by huidige musiek lys in te sit (slegs Gewoonte 1 of Gewoonte 2)
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO :{BLACK}Kliek op musiek liedjie om by huidige musiek lys in te sit (slegs Gewoonte1 of Gewoonte2)
STR_CLICK_ON_TRACK_TO_REMOVE :{BLACK}Kliek op musiek lied om te verwyder van huidige program (Slegs Gewoonte1 of Gewoonte2)
STR_01FB_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Skakel musiek lys skuifel aan/af
STR_01FC_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Vertoon musiek liedjie keuse venster
@@ -661,7 +667,7 @@
STR_0256_COPPER_ORE_MINE :{BLACK}Koper Erts Myn
STR_0257_COTTON_CANDY_FOREST :{BLACK}Spookasem Woud
STR_0258_CANDY_FACTORY :{BLACK}Lekker Fabriek
-STR_0259_BATTERY_FARM :{BLACK}Battery Plaas
+STR_0259_BATTERY_FARM :{BLACK}Battery Boerdery
STR_025A_COLA_WELLS :{BLACK}Cola Bron
STR_025B_TOY_SHOP :{BLACK}Speelgoed Winkel
STR_025C_TOY_FACTORY :{BLACK}Speelgoed Fabriek
@@ -678,7 +684,7 @@
STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY :{BLACK}Bou Olieboor (Kan slegs naby aan kante van kaart gebou word)
STR_0268_CONSTRUCT_FACTORY :{BLACK}Bou Fabriek
STR_0269_CONSTRUCT_STEEL_MILL :{BLACK}Bou Staalmeul
-STR_026A_CONSTRUCT_FARM :{BLACK}Bou Plaas
+STR_026A_CONSTRUCT_FARM :{BLACK}Bou Boerdery
STR_026B_CONSTRUCT_IRON_ORE_MINE :{BLACK}Bou Yster Erts Myn
STR_026C_CONSTRUCT_OIL_WELLS :{BLACK}Bou Olie Bron
STR_026D_CONSTRUCT_BANK_CAN_ONLY :{BLACK}Bou Bank (kan slegs in stede met 'n populasie grooter as 1200 gebou word)
@@ -696,7 +702,7 @@
STR_0279_CONSTRUCT_COPPER_ORE_MINE :{BLACK}Bou Koper Erts Myn
STR_027A_PLANT_COTTON_CANDY_FOREST :{BLACK}Beplant Spookasem Woud
STR_027B_CONSTRUCT_CANDY_FACTORY :{BLACK}Bou Lekker Fabriek
-STR_027C_CONSTRUCT_BATTERY_FARM :{BLACK}Bou Battery Plaas
+STR_027C_CONSTRUCT_BATTERY_FARM :{BLACK}Bou Battery Boerdery
STR_027D_CONSTRUCT_COLA_WELLS :{BLACK}Bou Cola Bron
STR_027E_CONSTRUCT_TOY_SHOP :{BLACK}Bou Speelgoed Winkel
STR_027F_CONSTRUCT_TOY_FACTORY :{BLACK}Bou Speelgoed Fabriek
@@ -988,6 +994,7 @@
STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Was skerm as muis by die kant is: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Toelaat die omkooping van plaaslike gesag: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Ongelyk stasies: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Toelaat gebou van teenstandige stasies: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Klein lughawe is altyd toegelaat: {ORANGE}{STRING}
@@ -1032,6 +1039,12 @@
STR_CONFIG_PATCHES_LIVERIES_ALL :Alle maatskappye
STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Verkies span gesels met <ENTER>: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Gebruik die voorloopende voertuiglys: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Af
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eie maatskappy
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Alle maatskappye
+
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Max treine per speler: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Max pad voertuie per speler: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_AIRCRAFT :{LTBLUE}Max vliegtuie per speler: {ORANGE}{STRING}
@@ -1064,6 +1077,8 @@
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Toelaat deele aankoop van ander maatskappye
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Wanneer sleeping, plaas seine elke: {ORANGE}{STRING} teel(e)
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Outomaties bou semaphores voor: {ORANGE}{STRING}
+
+
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posisie van hoof werktuigbaan: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Links
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Senter
@@ -1089,7 +1104,7 @@
STR_CHEATS :{WHITE}Bedriege
-STR_CHEATS_TIP :{BLACK}tikblokkies aanwys as jy die bedreig vroe� gebruik het
+STR_CHEATS_TIP :{BLACK}Tikblokkies aanwys as jy die bedreig vroe� gebruik het
STR_CHEATS_WARNING :{BLACK}Waarskuwing! Jy gaan omtrent jou genoote mededingers verrai. Hou in gemoed dat so 'n skande sal vir ewig onhout word.
STR_CHEAT_MONEY :{LTBLUE}Vermeerder geld by {CURRENCY}
STR_CHEAT_CHANGE_PLAYER :{LTBLUE}Speel as speler: {ORANGE}{COMMA}
@@ -1133,6 +1148,7 @@
STR_CANT_BUILD_CANALS :{WHITE}Kan nie kanaale hier bou nie...
+STR_BUILD_CANALS_TIP :{BLACK}Bou kanaale.
STR_LANDINFO_CANAL :Kanaal
STR_CANT_BUILD_LOCKS :{WHITE}Kan nie sluite hier bou nie...
@@ -1239,12 +1255,12 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Beskerm jou spel met 'n wagwoord as jy wil dit nie publieke toepassing laat wees nie
STR_NETWORK_SELECT_MAP :{BLACK}Kies 'n kaart
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Watter kaart wil jy speel?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Max kliente:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Kies die maksimum nommer van kielnte. Alle gleufe hoef nie om vol te wees nie
STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :LAN / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (adverteer)
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Max kliente:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Kies die maksimum nommer van kielnte. Alle gleufe hoef nie om vol te wees nie
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Max maatskappye:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Beperk die bedinder na 'n sekere bedrag van maatskappye
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Max aanskouers:
@@ -1452,22 +1468,37 @@
STR_1805_CAN_T_REMOVE_ROAD_FROM :{WHITE}Kan nie pad van hier verwyder nie...
STR_1806_ROAD_DEPOT_ORIENTATION :{WHITE}Pad Depot Ori�tering
STR_1807_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Kan nie pad voertuig depot hier bou nie...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE :{WHITE}Kan nie trem voertuig depot hier bou nie...
STR_1808_CAN_T_BUILD_BUS_STATION :{WHITE}Kan nie bus stasie hier bou nie...
STR_1809_CAN_T_BUILD_TRUCK_STATION :{WHITE}Kan nie vraagmotor stasie bou nie...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Kan nie vrag trem stasie hier bou nie...
STR_180A_ROAD_CONSTRUCTION :Pad konstruksie
+STR_180A_TRAMWAY_CONSTRUCTION :Tremweg konstruksie
STR_180B_BUILD_ROAD_SECTION :{BLACK}Bou pad afdeling
+STR_180B_BUILD_TRAMWAY_SECTION :{BLACK}Bou tremweg gedeelte
STR_180C_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bou pad voertuig depot (vir bou en versiening van voertuie)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Bou trem voertuig depot (vir bou en diens van voertuie)
STR_180D_BUILD_BUS_STATION :{BLACK}Bou bus stasie
STR_180E_BUILD_TRUCK_LOADING_BAY :{BLACK}Bou vraagmotor laai area
+STR_180D_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bou passasier trem stasie
+STR_180E_BUILD_CARGO_TRAM_STATION :{BLACK}Bou vrag trem stasie
STR_180F_BUILD_ROAD_BRIDGE :{BLACK}Bou pad brug
+STR_180F_BUILD_TRAMWAY_BRIDGE :{BLACK}Bou tremweg brug
STR_1810_BUILD_ROAD_TUNNEL :{BLACK}Bou pad tonnel
+STR_1810_BUILD_TRAMWAY_TUNNEL :{BLACK}Bou tremweg tonnel
STR_1811_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Skakel bou/verwyder vir pad bou
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Skakel bou/verwyder vir tremweg konstruksie
STR_1813_SELECT_ROAD_VEHICLE_DEPOT :{BLACK}Kies pad voertuig depot ori�tering
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT :{BLACK}Kies trem voertuig depot ori�tering
STR_1814_ROAD :Pad
STR_1815_ROAD_WITH_STREETLIGHTS :Pad met straatligte
STR_1816_TREE_LINED_ROAD :Boom-belynde pad
STR_1817_ROAD_VEHICLE_DEPOT :Pad voertuig depot
-STR_1818_ROAD_RAIL_LEVEL_CROSSING :Pad/spoor oorgang
+STR_1818_ROAD_RAIL_LEVEL_CROSSING :Pad/spoor gelyk oorgang
+STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Kan nie bus stasie verwyder nie...
+STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Kan nie vraagmotor stasie verwyder stasie...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Kan nie passasier stasie verwyder nie...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Kan nie vrag stasie verwyder nie...
##id 0x2000
STR_2000_TOWNS :{WHITE}Stede
@@ -1475,8 +1506,8 @@
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Gebou moet eers afgebreek word
STR_2005 :{WHITE}{TOWN}
STR_2006_POPULATION :{BLACK}Populasie: {ORANGE}{COMMA}{BLACK} Huise: {ORANGE}{COMMA}
-STR_2007_RENAME_TOWN :Hernaam Stad
-STR_2008_CAN_T_RENAME_TOWN :{WHITE}Kan nie stad hernaam nie...
+STR_2007_RENAME_TOWN :Hernoem Stad
+STR_2008_CAN_T_RENAME_TOWN :{WHITE}Kan nie stad hernoem nie...
STR_2009_LOCAL_AUTHORITY_REFUSES :{WHITE}{TOWN} plaaslike raad weier om dit te toelaat
STR_200A_TOWN_NAMES_CLICK_ON_NAME :{BLACK}Stad naame - kliek naam om skerm op stad te senter
STR_200B_CENTER_THE_MAIN_VIEW_ON :{BLACK}Senter skerm op stad
@@ -1600,8 +1631,8 @@
STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Te naby aan 'n ander lughawe
STR_300E_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Moet eers lughawe afbreek
-STR_3030_RENAME_STATION_LOADING :Hernaam stasie/laai area
-STR_3031_CAN_T_RENAME_STATION :{WHITE}Stasie kan nie hernaam word nie...
+STR_3030_RENAME_STATION_LOADING :Hernoem stasie/laai area
+STR_3031_CAN_T_RENAME_STATION :{WHITE}Stasie kan nie hernoem word nie...
STR_3032_RATINGS :{BLACK}Graderings
STR_3033_ACCEPTS :{BLACK}Aanvaar
STR_3034_LOCAL_RATING_OF_TRANSPORT :{BLACK}Plaaslike gradering van vervoer diens
@@ -1623,9 +1654,13 @@
STR_3040_NOW_ACCEPTS :{WHITE}{STATION} aanvaar nou {STRING}
STR_3041_NOW_ACCEPTS_AND :{WHITE}{STATION} aanvaar nou {STRING} en {STRING}
STR_3042_BUS_STATION_ORIENTATION :{WHITE}Bus Stasie Ori�tering
-STR_3043_TRUCK_STATION_ORIENT :{WHITE}Vraagmotor Stasie Ori�t.
+STR_3043_TRUCK_STATION_ORIENT :{WHITE}Vraagmotor Stasie Ori�tering
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION :{WHITE}Passasier Trem Ori�tering
+STR_3043_CARGO_TRAM_STATION_ORIENT :{WHITE}Vrag Trem Ori�tering
STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Moet eers bus stasie afbreek
STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Moet eers vraagmotor stasie afbreek
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Moet eers passasier trem stasie afbreek
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Moet eers vrag trem stasie afbreek
STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} Stasie{P "" s}
STR_3049_0 :{YELLOW}{STATION} {STATIONFEATURES}
STR_304A_NONE :{YELLOW}- Geen -
@@ -1637,6 +1672,8 @@
STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Kies lengte van spoorweg stasie
STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Kies bus stasie ori�tering
STR_3052_SELECT_TRUCK_LOADING_BAY :{BLACK}Kies vraagmotor laai area ori�tering
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION :{BLACK}Kies passasier trem stasie ori�tering
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION :{BLACK}Kies vrag trem stasie ori�tering
STR_3053_CENTER_MAIN_VIEW_ON_STATION :{BLACK}Senter skerm op stasie
STR_3054_SHOW_STATION_RATINGS :{BLACK}Wys stasie graderings
STR_3055_CHANGE_NAME_OF_STATION :{BLACK}Verander naam van stasie
@@ -1702,7 +1739,7 @@
STR_4808_FACTORY :Fabriek
STR_4809_PRINTING_WORKS :Drukwerke
STR_480A_STEEL_MILL :Staalmeul
-STR_480B_FARM :Plaas
+STR_480B_FARM :Boerdery
STR_480C_COPPER_ORE_MINE :Koper Erts Myn
STR_480D_OIL_WELLS :Olie Bron
STR_480E_BANK :Bank
@@ -1717,11 +1754,11 @@
STR_4817_WATER_SUPPLY :Water Lewering
STR_4818_WATER_TOWER :Water Toring
STR_4819_FACTORY :Fabriek
-STR_481A_FARM :Plaas
+STR_481A_FARM :Boerdery
STR_481B_LUMBER_MILL :Timmerhoutmeul
STR_481C_COTTON_CANDY_FOREST :Spookasem Woud
STR_481D_CANDY_FACTORY :Lekker Fabriek
-STR_481E_BATTERY_FARM :Battery Plaas
+STR_481E_BATTERY_FARM :Battery Boerdery
STR_481F_COLA_WELLS :Cola Bron
STR_4820_TOY_SHOP :Speelgoed Winkel
STR_4821_TOY_FACTORY :Speelgoed Fabriek
@@ -1737,6 +1774,11 @@
STR_4829_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}, {STRING}
############ range for requires ends
+############ range for produces starts
+STR_4827_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}
+STR_4828_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}, {STRING}
+############ range for produces ends
+
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produksie verlede maand:
STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% uitgevoer)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Senter skerm op nywerheid
@@ -1762,11 +1804,10 @@
STR_5000_TRAIN_IN_TUNNEL :{WHITE}Trein in tonnel
STR_5001_ROAD_VEHICLE_IN_TUNNEL :{WHITE}Pad voetuig in tonnel
STR_5003_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Ander tonnel in die pad
-STR_5005_UNABLE_TO_EXCAVATE_LAND :{WHITE}Onbekwaam om land vir ander einde van tonnel te uitgrawe
+STR_5005_UNABLE_TO_EXCAVATE_LAND :{WHITE}Kan nie land vir ander einde van tonnel te uitgrawe nie
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Moet eers tonnel afbreek
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Moet eers brug afbreek
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Kan nie in die selfde plek begin en eindig nie
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Platte land of water nooding onder brug
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Begin en einde moet in lyn wees
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Plek ongeskik vir tonnel ingang
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -1804,7 +1845,7 @@
STR_5803_COMPANY_HEADQUARTERS :Maatskappy Hoofkwartiers
STR_5804_COMPANY_HEADQUARTERS_IN :{WHITE}...maatskappy hoofkwartiers in die pad
STR_5805_COMPANY_OWNED_LAND :Maatskappy-besitte land
-STR_5806_CAN_T_PURCHASE_THIS_LAND :{WHITE}Land area kan nie aangekoop word nie...
+STR_5806_CAN_T_PURCHASE_THIS_LAND :{WHITE}Die land area kan nie aangekoop word nie...
STR_5807_YOU_ALREADY_OWN_IT :{WHITE}...jy besit dit alreeds!
@@ -1844,7 +1885,7 @@
############ end of savegame specific region!
##id 0x6800
-STR_6800_DIFFICULTY_LEVEL :{WHITE}Moeilikheids Vlakte
+STR_6800_DIFFICULTY_LEVEL :{WHITE}Moeilikheid Vlak
STR_OPTIONS_SAVE_CHANGES :{BLACK}Bewaar
############ range for difficulty levels starts
@@ -1960,9 +2001,9 @@
STR_7028 :{BLACK}{CURRENCY}
STR_7029_BORROW :{BLACK}Leen {SKIP}{SKIP}{CURRENCY}
STR_702A_REPAY :{BLACK}Terugbetaal {SKIP}{SKIP}{CURRENCY}
-STR_702B_MAXIMUM_PERMITTED_LOAN :{WHITE}...maksimum vergun lening groote is {CURRENCY}
+STR_702B_MAXIMUM_PERMITTED_LOAN :{WHITE}...maksimum toegelaat lening groote is {CURRENCY}
STR_702C_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Kan nie meer geld leen nie...
-STR_702D_LOAN_ALREADY_REPAYED :{WHITE}...geen lening om terugbetaal te word
+STR_702D_LOAN_ALREADY_REPAYED :{WHITE}...geen lening om terug te betaal
STR_702E_REQUIRED :{WHITE}...{CURRENCY} vereis
STR_702F_CAN_T_REPAY_LOAN :{WHITE}Kan nie lening terugbetaal nie...
STR_INSUFFICIENT_FUNDS :{WHITE}Kan nie geld wat van die bank geleen is weggee nie...
@@ -2024,6 +2065,7 @@
STR_706B_CHIEF_EXECUTIVE :Hoofbestuursleier
STR_706C_CHAIRMAN :Voorsitter
STR_706D_PRESIDENT :President
+STR_706E_TYCOON :Tycoon
STR_706F_BUILD_HQ :{BLACK}Bou HK
STR_7070_BUILD_COMPANY_HEADQUARTERS :{BLACK}Bou maatskappy hoofkwartiers / wys maatskappy hoofkwartiers
STR_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Herbou maatskappy hoofkwartiers elders vir 1% koste van maatskappy waarde
@@ -2033,7 +2075,7 @@
STR_COMPANY_PASSWORD :{BLACK}Wagwoord
STR_COMPANY_PASSWORD_TOOLTIP :{BLACK}Wagwoord-beskerm jou maatskappy om onmagtig gebruikers te belet van verbinding
STR_SET_COMPANY_PASSWORD :Stel maatskappy wagwoord
-STR_7073_WORLD_RECESSION_FINANCIAL :{BIGFONT}{BLACK}W�eld Insinking!{}{}Finansieel eksperte vrees ergste as ekconomie inmekaar sak!
+STR_7073_WORLD_RECESSION_FINANCIAL :{BIGFONT}{BLACK}W�eld Insinking!{}{}Finansieel eksperte vrees ergste as ekonomie inmekaar sak!
STR_7074_RECESSION_OVER_UPTURN_IN :{BIGFONT}{BLACK}Insinking Oor!{}{}Oplewing in sake gee vertroue na nywerheide as ekonomie versterk!
STR_7075_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Skakel groot/klein venster groote
STR_7076_COMPANY_VALUE :{GOLD}Maatskappy waarde: {WHITE}{CURRENCY}
@@ -2045,7 +2087,7 @@
STR_707C_CAN_T_SELL_25_SHARE_IN :{WHITE}Kan nie 25% aandeel in die maatskappy verkoop nie...
STR_707D_OWNED_BY :{WHITE}({COMMA}% besit by {COMPANY})
STR_707E_OWNED_BY_OWNED_BY :{WHITE}({COMMA}% besit by {COMPANY}{} {COMMA}% besit by {COMPANY})
-STR_707F_HAS_BEEN_TAKEN_OVER_BY :{BLACK}{BIGFONT}{COMPANY} is deur {COMPANY}! oorgevat!
+STR_707F_HAS_BEEN_TAKEN_OVER_BY :{BLACK}{BIGFONT}{COMPANY} is deur {COMPANY} oorgevat!
STR_7080_PROTECTED :{WHITE}Die maatskappy is nie oud genoeg om aandeele te handel nie...
STR_LIVERY_DEFAULT :Standaard Lewery
@@ -2274,7 +2316,7 @@
STR_80C1_POWERNAUGHT_BATTERY_TRUCK :Powernaught Battery Trok
STR_80C2_WIZZOWOW_BATTERY_TRUCK :Wizzowow Battery Trok
STR_80C3_MIGHTYMOVER_FIZZY_DRINK :MightyMover Koeldrank Trok
-STR_80C4_POWERNAUGHT_FIZZY_DRINK :Powernaught KoeldrankTrok
+STR_80C4_POWERNAUGHT_FIZZY_DRINK :Powernaught Koeldrank Trok
STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK :Wizzowow Fizzy Koeldrank Trok
STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK :MightyMover Plastiek Trok
STR_80C7_POWERNAUGHT_PLASTIC_TRUCK :Powernaught Plastiek Trok
@@ -2367,6 +2409,7 @@
STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT :Gaan deurgaande na {TOWN} Trein Depot
STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT :Diens deurgaande by {TOWN} Trein Depot
+
STR_HEADING_FOR_TRAIN_DEPOT :{ORANGE}Op pad na {TOWN} Trein Depot
STR_HEADING_FOR_TRAIN_DEPOT_VEL :{ORANGE}Op pad na {TOWN} Trein Depot, {VELOCITY}
STR_HEADING_FOR_TRAIN_DEPOT_SERVICE :{LTBLUE}Diens by {TOWN} Trein Depot
@@ -2398,7 +2441,7 @@
STR_CLONE_TRAIN :{BLACK}Kloon Trein
STR_CLONE_TRAIN_INFO :{BLACK}Dit sa 'n afskrywing van die trein bou insluitend alle trokke. Control-kliek sal die opdrae deel
STR_CLONE_TRAIN_DEPOT_INFO :{BLACK}Dit sal 'n afskrywing van 'n trein bou insluitend alle trokke. Kliek die knoppie en dan op 'n trein binne of buite die depot. Control-kliek sal die opdrae deel
-STR_8820_RENAME :{BLACK}Hername
+STR_8820_RENAME :{BLACK}Hernoem
STR_8823_SKIP :{BLACK}Sprong
STR_8824_DELETE :{BLACK}Uitwis
STR_8825_NON_STOP :{BLACK}Deurgaande
@@ -2422,8 +2465,11 @@
STR_8831_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Geen spasie vir nog opdrae
STR_8832_TOO_MANY_ORDERS :{WHITE}Te veel opdrae
STR_8833_CAN_T_INSERT_NEW_ORDER :{WHITE}Kan nie nuwe opdrag invoeg nie...
-STR_8834_CAN_T_DELETE_THIS_ORDER :{WHITE}Die opdrag kan nie uitwis word nie...
+STR_8834_CAN_T_DELETE_THIS_ORDER :{WHITE}Kan nie die opdrag verwyder nie...
STR_8835_CAN_T_MODIFY_THIS_ORDER :{WHITE}Die opdrag kan nie verander word nie...
+STR_CAN_T_MOVE_THIS_ORDER :{WHITE}Kan nie opdrag beweeg nie...
+STR_CAN_T_SKIP_ORDER :{WHITE}Kan nie huidige opdrag sprong nie...
+STR_CAN_T_SKIP_TO_ORDER :{WHITE}Kan nie verkieste opdrag sprong nie...
STR_8837_CAN_T_MOVE_VEHICLE :{WHITE}Voertuig kan nie beweeg nie...
STR_8838_N_A :N/A{SKIP}
STR_8839_CAN_T_SELL_RAILROAD_VEHICLE :{WHITE}Kan nie spoorweg voertuig verkoop nie...
@@ -2439,7 +2485,7 @@
STR_8842_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Senter skerm op trein depot
STR_8843_TRAIN_VEHICLE_SELECTION :{BLACK}Trein voertuig keuse lys - kliek op voertuig vir inligting
STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN :{BLACK}Bou die beklemtoonde trein voertuig
-STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Hernaam trein voertuig tipe
+STR_8845_RENAME_TRAIN_VEHICLE_TYPE :{BLACK}Hernoem trein voertuig tipe
STR_8846_CURRENT_TRAIN_ACTION_CLICK :{BLACK}Huidige trein aksie - kliek hier om trein te stop/aanvang trein
STR_8847_SHOW_TRAIN_S_ORDERS :{BLACK}Wys trein se opdrae
STR_8848_CENTER_MAIN_VIEW_ON_TRAIN :{BLACK}Senter skerm op trein
@@ -2454,6 +2500,7 @@
STR_8851_SHOW_CAPACITIES_OF_EACH :{BLACK}Wys kapasiteite van elke voertuig
STR_8852_SHOW_TOTAL_CARGO :{BLACK}Wys totaale kapasitiet van trein, verdeel by vrag tipe
STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Opdraglys - kliek op 'n opdrag om dit te beklemtoon. CTRL + kliek senter op stasie
+STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}Sprong die huidige opdraag, en begin die volgende. CTRL + kliek sprong na verkieste opdrag
STR_8854_DELETE_THE_HIGHLIGHTED :{BLACK}Uitwis die beklemtoonde opdrag
STR_8855_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Maak die beklemtoonde opdrag deurgaande
STR_8856_INSERT_A_NEW_ORDER_BEFORE :{BLACK}Invoeg 'n nuwe opdrag voor die beklemtoonde opdrag, of byvoeg na einde van lys
@@ -2476,16 +2523,20 @@
STR_8867_NAME_TRAIN :{BLACK}Benaam trein
STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Trein Botsing!{}{COMMA} sterf in vuurbol na botsing
STR_8869_CAN_T_REVERSE_DIRECTION :{WHITE}Kan nie rigting van trein omkeer nie...
-STR_886A_RENAME_TRAIN_VEHICLE_TYPE :{WHITE}Hernaam trein voertuig tipe
-STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Trein voertuig tipe kan nie hernaam word nie...
+STR_886A_RENAME_TRAIN_VEHICLE_TYPE :{WHITE}Hernoem trein voertuig tipe
+STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Trein voertuig tipe kan nie hernoem word nie...
STR_886D_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Maak die beklemtoonde opdrag dwing die voertuig om sy vrag te stort
STR_886F_TRANSFER :{BLACK}Oordrag
+STR_CLEAR_TIME :{BLACK}Reinig Tyd
STR_TRAIN_STOPPING :{RED}Ophou
STR_TRAIN_STOPPING_VEL :{RED}Ophou, {VELOCITY}
STR_INCOMPATIBLE_RAIL_TYPES :Onbestaaanbaar spoor tipes
STR_TRAIN_NO_POWER :{RED}Geen Krag
+
+STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Kan nie voertuig tydtafel nie...
+
##id 0x9000
STR_9000_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Pad voertuig in die pad
STR_9001_ROAD_VEHICLES :{WHITE}{COMPANY} - {COMMA} Pad voertuig{P "" s}
@@ -2518,7 +2569,7 @@
STR_901D_SHOW_VEHICLE_S_ORDERS :{BLACK}Wys voertuig se opdrae
STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE :{BLACK}Senter skerm op voertuig
STR_901F_SEND_VEHICLE_TO_DEPOT :{BLACK}Stuur voertuig na depot. CTRL+kliek sal net diens
-STR_9020_FORCE_VEHICLE_TO_TURN_AROUND :{BLACK}Dwing voertuig om om te draai
+STR_9020_FORCE_VEHICLE_TO_TURN_AROUND :{BLACK}Dwing voertuig om te draai om
STR_9021_SHOW_ROAD_VEHICLE_DETAILS :{BLACK}Wys pad voertuig aanwyse
STR_9022_VEHICLES_CLICK_ON_VEHICLE :{BLACK}Voertuie - kliek op voertuig vir inligting
STR_9023_BUILD_NEW_ROAD_VEHICLE :{BLACK}Bou nuwe pad voertuig
@@ -2526,21 +2577,25 @@
STR_9025_CENTER_MAIN_VIEW_ON_ROAD :{BLACK}Senter skerm op pad voertuig depot
STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Pad voertuig keuse lys - kliek op voertuig vir inligting
STR_9027_BUILD_THE_HIGHLIGHTED_ROAD :{BLACK}Bou die beklemtoonde pad voertuig
-STR_902A_COST_SPEED_RUNNING_COST :{BLACK}Koste: {CURRENCY}{}Spoed: {VELOCITY}{}Loopkoste: {CURRENCY}/yr{}Kapasitiet: {CARGO}
+STR_902A_COST_SPEED_RUNNING_COST :{BLACK}Koste: {CURRENCY}{}Spoed: {VELOCITY}{}Loopkoste: {CURRENCY}/jr{}Kapasitiet: {CARGO}
+STR_ARTICULATED_RV_CAPACITY :{BLACK}Kapasiteit: {LTBLUE}
+STR_BARE_CARGO :{CARGO}
STR_902C_NAME_ROAD_VEHICLE :{WHITE}Benaam pad voertuig
STR_902D_CAN_T_NAME_ROAD_VEHICLE :{WHITE}Pad voertuig kan nie benaam word nie...
STR_902E_NAME_ROAD_VEHICLE :{BLACK}Benaam pad voertuig
STR_902F_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste bus arriveer by {STATION}!
STR_9030_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste trok arriveer by {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste passasier trein arriveer by {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste vrag trein arriveer by {STATION}!
STR_9031_ROAD_VEHICLE_CRASH_DRIVER :{BLACK}{BIGFONT}Pad Voertuig Botsing!{}Bestuurder sterf in vuurbol na botsing met trein
STR_9032_ROAD_VEHICLE_CRASH_DIE :{BLACK}{BIGFONT}Pad voertuig Botsing!{}{COMMA} sterf in vuurbol na botsing met trein
STR_9033_CAN_T_MAKE_VEHICLE_TURN :{WHITE}Kan nie voertuig dwing om te omdraai nie
STR_ONLY_TURN_SINGLE_UNIT :{WHITE}Kan nie voertuie van veel deele draai nie
-STR_9034_RENAME :{BLACK}Hernaam
-STR_9035_RENAME_ROAD_VEHICLE_TYPE :{BLACK}Hernaam pad voertuig tipe
-STR_9036_RENAME_ROAD_VEHICLE_TYPE :{WHITE}Hernaam pad voertuig tipe
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Pad voertuig tipe kan nie hernaam word nie...
+STR_9034_RENAME :{BLACK}Hernoem
+STR_9035_RENAME_ROAD_VEHICLE_TYPE :{BLACK}Hernoem pad voertuig tipe
+STR_9036_RENAME_ROAD_VEHICLE_TYPE :{WHITE}Hernoem pad voertuig tipe
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE :{WHITE}Pad voertuig tipe kan nie hernoem word nie...
STR_9038_GO_TO_ROADVEH_DEPOT :Gaan na {TOWN} Pad Voertuig Depot
STR_SERVICE_AT_ROADVEH_DEPOT :Versien by {TOWN} Pad Voertuig Depot
@@ -2603,10 +2658,10 @@
STR_9833_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste skip arriveer by {STATION}!
STR_9834_POSITION_BUOY_WHICH_CAN :{BLACK}Plaas baken wat kan as 'n wegpunt gebruik word
STR_9835_CAN_T_POSITION_BUOY_HERE :{WHITE}Kan nie baken hier plaas nie...
-STR_9836_RENAME :{BLACK}Hernaam
-STR_9837_RENAME_SHIP_TYPE :{BLACK}Hernaam skip tipe
-STR_9838_RENAME_SHIP_TYPE :{WHITE}Hernaam skip tipe
-STR_9839_CAN_T_RENAME_SHIP_TYPE :{WHITE}Kan nie skip tipe hernaam nie...
+STR_9836_RENAME :{BLACK}Hernoem
+STR_9837_RENAME_SHIP_TYPE :{BLACK}Hernoem skip tipe
+STR_9838_RENAME_SHIP_TYPE :{WHITE}Hernoem skip tipe
+STR_9839_CAN_T_RENAME_SHIP_TYPE :{WHITE}Kan nie skip tipe hernoem nie...
STR_983A_REFIT_CARGO_SHIP_TO_CARRY :{BLACK}Herstel vrag skip om 'n ander vrag tipe te ontvoer
STR_983B_REFIT :{WHITE}{VEHICLE} (Herstel)
STR_983C_REFIT_SHIP :{BLACK}Herstel skip
@@ -2675,10 +2730,10 @@
STR_A033_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste vliegtuig arriveer by {STATION}!
STR_A034_PLANE_CRASH_DIE_IN_FIREBALL :{BLACK}{BIGFONT}Vliegtuig Botsing!{}{COMMA} stef in die vuurbol by {STATION}
STR_A036 :{TINYFONT}{BLACK}{STATION}
-STR_A037_RENAME :{BLACK}Hernaam
-STR_A038_RENAME_AIRCRAFT_TYPE :{BLACK}Hernaam vliegtuig tipe
-STR_A039_RENAME_AIRCRAFT_TYPE :{WHITE}Hernaam vliegtuig tipe
-STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Kan nie vliegtuig tipe hernaam nie...
+STR_A037_RENAME :{BLACK}Hernoem
+STR_A038_RENAME_AIRCRAFT_TYPE :{BLACK}Hernoem vliegtuig tipe
+STR_A039_RENAME_AIRCRAFT_TYPE :{WHITE}Hernoem vliegtuig tipe
+STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Kan nie vliegtuig tipe hernoem nie...
STR_A03B_REFIT_AIRCRAFT_TO_CARRY :{BLACK}Hestel vliegtuig om 'n ander vrag tipe te ontvoer
STR_A03C_REFIT :{WHITE}{VEHICLE} (Herstel)
STR_A03D_REFIT_AIRCRAFT :{BLACK}Herstel vliegtuig
@@ -2690,6 +2745,7 @@
STR_GO_TO_AIRPORT_HANGAR :Gaan na {STATION} Hangar
SERVICE_AT_AIRPORT_HANGAR :Versiening by {STATION} Hangar
+
##id 0xB000
STR_B000_ZEPPELIN_DISASTER_AT :{BLACK}{BIGFONT}Zeppelin ramp by {STATION}!
STR_B001_ROAD_VEHICLE_DESTROYED :{BLACK}{BIGFONT}Pad voertuig vernietig in 'VVV' botsing!
@@ -2776,6 +2832,7 @@
STR_NOT_REPLACING :{BLACK}Word nie vervang nie
STR_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Geen voertuig gekies
+STR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Vliegtuig is nie beskikbaar nie
STR_ENGINES :Enjine
@@ -2853,3 +2910,20 @@
############ Date formatting
########
+
+
+
+
+##### Mass Order
+
+
+
+
+STR_COMPANY_NAME :{COMPANY}
+
+
+#### Improved sign GUI
+
+########
+
+STR_BUILD_NEW_INDUSTRY :{BLACK}Bou
--- a/src/lang/unfinished/greek.txt Thu Sep 06 19:42:48 2007 +0000
+++ b/src/lang/unfinished/greek.txt Sat Oct 06 21:16:00 2007 +0000
@@ -1640,7 +1640,6 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Î ÏÎπει Ï€Ïώτα να καταστÏαφεί το τοÏνελ
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Î ÏÎπει Ï€Ïώτα να καταστÏαφεί η γÎφυÏα
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Δεν γίνεται να ξεκινάει και να τελειώνει στο ίδιο σημείο
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Απαιτείται επίπεδο Îδαφος ή νεÏÏŒ κάτω από τη γÎφυÏα
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Η αÏχή και το Ï„Îλος Ï€ÏÎπει να είναι σε ευθεία
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Ακατάλληλη τοποθεσία για είσοδο τοÏνελ
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
--- a/src/macros.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/macros.h Sat Oct 06 21:16:00 2007 +0000
@@ -341,6 +341,15 @@
#define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START)
#define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner]))
+/**
+ * Whether a sprite comes from the original graphics files or a new grf file
+ * (either supplied by OpenTTD or supplied by the user).
+ *
+ * @param sprite The sprite to check
+ * @return True if it is a new sprite, or false if it is original.
+ */
+#define IS_CUSTOM_SPRITE(sprite) ((sprite) >= SPR_SIGNALS_BASE)
+
extern const byte _ffb_64[128];
/**
--- a/src/main_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/main_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -59,11 +59,13 @@
extern void GenerateIndustries();
extern bool GenerateTowns();
+bool _draw_bounding_boxes = false;
+
void CcGiveMoney(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
#ifdef ENABLE_NETWORK
- if (!success) return;
+ if (!success || !_patches.give_money) return;
char msg[20];
/* Inform the player of this action */
@@ -1086,7 +1088,7 @@
StringID msg =
mode ? STR_0808_CAN_T_RAISE_LAND_HERE : STR_0809_CAN_T_LOWER_LAND_HERE;
- DoCommandP(tile, SLOPE_N, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(msg));
+ DoCommandP(tile, SLOPE_N, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_MSG(msg));
} else {
SndPlayTileFx(SND_1F_SPLAT, tile);
@@ -1113,7 +1115,7 @@
BEGIN_TILE_LOOP(tile2, sizex, sizey, tile) {
if (TileHeight(tile2) == h) {
- DoCommandP(tile2, SLOPE_N, (uint32)mode, NULL, CMD_TERRAFORM_LAND | CMD_AUTO);
+ DoCommandP(tile2, SLOPE_N, (uint32)mode, NULL, CMD_TERRAFORM_LAND);
}
} END_TILE_LOOP(tile2, sizex, sizey, tile)
}
@@ -2208,6 +2210,13 @@
break;
}
+ if (e->we.keypress.keycode == ('B' | WKC_CTRL)) {
+ e->we.keypress.cont = false;
+ _draw_bounding_boxes = !_draw_bounding_boxes;
+ MarkWholeScreenDirty();
+ break;
+ }
+
if (_game_mode == GM_MENU) break;
switch (e->we.keypress.keycode) {
--- a/src/map.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/map.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -26,7 +26,7 @@
TileExtended *_me = NULL; ///< Extended Tiles of the map
-/**
+/*!
* (Re)allocates a map with the given dimension
* @param size_x the width of the map along the NE/SW edge
* @param size_y the 'height' of the map along the SE/NW edge
@@ -97,9 +97,9 @@
}
#endif
-/**
+/*!
* Scales the given value by the map size, where the given value is
- * for a 256 by 256 map
+ * for a 256 by 256 map.
* @param n the value to scale
* @return the scaled size
*/
@@ -112,7 +112,7 @@
}
-/**
+/*!
* Scales the given value by the maps circumference, where the given
* value is for a 256 by 256 map
* @param n the value to scale
@@ -128,13 +128,14 @@
}
-/**
+/*!
* This function checks if we add addx/addy to tile, if we
- * do wrap around the edges. For example, tile = (10,2) and
- * addx = +3 and addy = -4. This function will now return
- * INVALID_TILE, because the y is wrapped. This is needed in
- * for example, farmland. When the tile is not wrapped,
- * the result will be tile + TileDiffXY(addx, addy)
+ * do wrap around the edges. For example, tile = (10,2) and
+ * addx = +3 and addy = -4. This function will now return
+ * INVALID_TILE, because the y is wrapped. This is needed in
+ * for example, farmland. When the tile is not wrapped,
+ * the result will be tile + TileDiffXY(addx, addy)
+ *
* @param tile the 'starting' point of the adding
* @param addx the amount of tiles in the X direction to add
* @param addy the amount of tiles in the Y direction to add
@@ -172,7 +173,7 @@
{ 0, -1} ///< DIR_NW
};
-/**
+/*!
* Gets the Manhattan distance between the two given tiles.
* The Manhattan distance is the sum of the delta of both the
* X and Y component.
@@ -189,7 +190,7 @@
}
-/**
+/*!
* Gets the 'Square' distance between the two given tiles.
* The 'Square' distance is the square of the shortest (straight line)
* distance between the two tiles.
@@ -206,7 +207,7 @@
}
-/**
+/*!
* Gets the biggest distance component (x or y) between the two given tiles.
* Also known as L-Infinity-Norm.
* @param t0 the start tile
@@ -221,7 +222,7 @@
}
-/**
+/*!
* Gets the biggest distance component (x or y) between the two given tiles
* plus the Manhattan distance, i.e. two times the biggest distance component
* and once the smallest component.
@@ -236,7 +237,7 @@
return dx > dy ? 2 * dx + dy : 2 * dy + dx;
}
-/**
+/*!
* Param the minimum distance to an edge
* @param tile the tile to get the distance from
* @return the distance from the edge in tiles
@@ -252,7 +253,7 @@
return minl < minh ? minl : minh;
}
-/**
+/*!
* Function performing a search around a center tile and going outward, thus in circle.
* Although it really is a square search...
* Every tile will be tested by means of the callback function proc,
--- a/src/map.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/map.h Sat Oct 06 21:16:00 2007 +0000
@@ -45,9 +45,25 @@
byte m7; ///< Primarily used for newgrf support
};
+/**
+ * Pointer to the tile-array.
+ *
+ * This variable points to the tile-array which contains the tiles of
+ * the map.
+ */
extern Tile *_m;
+
+/**
+ * Pointer to the extended tile-array.
+ *
+ * This variable points to the extended tile-array which contains the tiles
+ * of the map.
+ */
extern TileExtended *_me;
+/**
+ * Allocate a new map with the given size.
+ */
void AllocateMap(uint size_x, uint size_y);
/**
@@ -109,18 +125,56 @@
return MapSizeY() - 1;
}
-/* Scale a number relative to the map size */
-uint ScaleByMapSize(uint); // Scale relative to the number of tiles
-uint ScaleByMapSize1D(uint); // Scale relative to the circumference of the map
+/**
+ * Scales relative to the number of tiles.
+ */
+uint ScaleByMapSize(uint);
+/**
+ * Scale relative to the circumference of the map.
+ */
+uint ScaleByMapSize1D(uint);
+
+/**
+ * The index/ID of a Tile.
+ */
typedef uint32 TileIndex;
+
+/**
+ * An offset value between to tiles.
+ *
+ * This value is used fro the difference between
+ * to tiles. It can be added to a tileindex to get
+ * the resulting tileindex of the start tile applied
+ * with this saved difference.
+ *
+ * @see TileDiffXY(int, int)
+ */
typedef int32 TileIndexDiff;
+/**
+ * Returns the TileIndex of a coordinate.
+ *
+ * @param x The x coordinate of the tile
+ * @param y The y coordinate of the tile
+ * @return The TileIndex calculated by the coordinate
+ */
static inline TileIndex TileXY(uint x, uint y)
{
return (y * MapSizeX()) + x;
}
+/**
+ * Calculates an offset for the given coordinate(-offset).
+ *
+ * This function calculate an offset value which can be added to an
+ * #TileIndex. The coordinates can be negative.
+ *
+ * @param x The offset in x direction
+ * @param y The offset in y direction
+ * @return The resulting offset value of the given coordinate
+ * @see ToTileIndexDiff(TileIndexDiffC)
+ */
static inline TileIndexDiff TileDiffXY(int x, int y)
{
/* Multiplication gives much better optimization on MSVC than shifting.
@@ -167,12 +221,27 @@
return tile >> MapLogX();
}
-
+/**
+ * A pair-construct of a TileIndexDiff.
+ *
+ * This can be used to save the difference between to
+ * tiles as a pair of x and y value.
+ */
struct TileIndexDiffC {
- int16 x;
- int16 y;
+ int16 x; ///< The x value of the coordinate
+ int16 y; ///< The y value of the coordinate
};
+/**
+ * Return the offset between to tiles from a TileIndexDiffC struct.
+ *
+ * This function works like #TileDiffXY(int, int) and returns the
+ * difference between two tiles.
+ *
+ * @param tidc The coordinate of the offset as TileIndexDiffC
+ * @return The difference between two tiles.
+ * @see TileDiffXY(int, int)
+ */
static inline TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
{
return (tidc.y << MapLogX()) + tidc.x;
@@ -180,6 +249,13 @@
#ifndef _DEBUG
+ /**
+ * Adds to tiles together.
+ *
+ * @param x One tile
+ * @param y An other tile to add
+ * @return The resulting tile(index)
+ */
#define TILE_ADD(x,y) ((x) + (y))
#else
extern TileIndex TileAdd(TileIndex tile, TileIndexDiff add,
@@ -187,10 +263,26 @@
#define TILE_ADD(x, y) (TileAdd((x), (y), #x " + " #y, __FILE__, __LINE__))
#endif
+/**
+ * Adds a given offset to a tile.
+ *
+ * @param tile The tile to add an offset on it
+ * @param x The x offset to add to the tile
+ * @param y The y offset to add to the tile
+ */
#define TILE_ADDXY(tile, x, y) TILE_ADD(tile, TileDiffXY(x, y))
+/**
+ * Adds an offset to a tile and check if we are still on the map.
+ */
uint TileAddWrap(TileIndex tile, int addx, int addy);
+/**
+ * Returns the TileIndexDiffC offset from a DiagDirection.
+ *
+ * @param dir The given direction
+ * @return The offset as TileIndexDiffC value
+ */
static inline TileIndexDiffC TileIndexDiffCByDiagDir(DiagDirection dir)
{
extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END];
@@ -198,9 +290,15 @@
assert(IsValidDiagDirection(dir));
return _tileoffs_by_diagdir[dir];
}
-
-/* Returns tile + the diff given in diff. If the result tile would end up
+/**
+ * Add a TileIndexDiffC to a TileIndex and returns the new one.
+ *
+ * Returns tile + the diff given in diff. If the result tile would end up
* outside of the map, INVALID_TILE is returned instead.
+ *
+ * @param tile The base tile to add the offset on
+ * @param diff The offset to add on the tile
+ * @return The resulting TileIndex
*/
static inline TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff)
{
@@ -236,7 +334,16 @@
uint DistanceMaxPlusManhattan(TileIndex, TileIndex); ///< Max + Manhattan
uint DistanceFromEdge(TileIndex); ///< shortest distance from any edge of the map
-
+/**
+ * Starts a loop which iterates to a square of tiles
+ *
+ * This macro starts 2 nested loops which iterates over a square of tiles.
+ *
+ * @param var The name of the variable which contains the current tile
+ * @param w The width (x-width) of the square
+ * @param h The heigth (y-width) of the square
+ * @param tile The start tile of the square
+ */
#define BEGIN_TILE_LOOP(var, w, h, tile) \
{ \
int h_cur = h; \
@@ -244,12 +351,22 @@
do { \
int w_cur = w; \
do {
-
+/**
+ * Ends the square-loop used before
+ *
+ * @see BEGIN_TILE_LOOP
+ */
#define END_TILE_LOOP(var, w, h, tile) \
} while (++var, --w_cur != 0); \
} while (var += TileDiffXY(0, 1) - (w), --h_cur != 0); \
}
-
+/**
+ * Convert a DiagDirection to a TileIndexDiff
+ *
+ * @param dir The DiagDirection
+ * @return The resulting TileIndexDiff
+ * @see TileIndexDiffCByDiagDir
+ */
static inline TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
{
extern const TileIndexDiffC _tileoffs_by_diagdir[DIAGDIR_END];
@@ -258,6 +375,12 @@
return ToTileIndexDiff(_tileoffs_by_diagdir[dir]);
}
+/**
+ * Convert a Direction to a TileIndexDiff.
+ *
+ * @param dir The direction to convert from
+ * @return The resulting TileIndexDiff
+ */
static inline TileIndexDiff TileOffsByDir(Direction dir)
{
extern const TileIndexDiffC _tileoffs_by_dir[DIR_END];
@@ -266,11 +389,36 @@
return ToTileIndexDiff(_tileoffs_by_dir[dir]);
}
+/**
+ * Adds a DiagDir to a tile.
+ *
+ * @param tile The current tile
+ * @param dir The direction in which we want to step
+ * @return the moved tile
+ */
+static inline TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
+{
+ return TILE_ADD(tile, TileOffsByDiagDir(dir));
+}
+
+/**
+ * A callback function type for searching tiles.
+ *
+ * @param tile The tile to test
+ * @param 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);
+
+/**
+ * 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);
-/* Approximation of the length of a straight track, relative to a diagonal
- * track (ie the size of a tile side). #defined instead of const so it can
+/** Approximation of the length of a straight track, relative to a diagonal
+ * track (ie the size of a tile side).
+ *
+ * #defined instead of const so it can
* stay integer. (no runtime float operations) Is this needed?
* Watch out! There are _no_ brackets around here, to prevent intermediate
* rounding! Be careful when using this!
--- a/src/misc.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -41,7 +41,7 @@
#ifdef RANDOM_DEBUG
if (_networking && (DEREF_CLIENT(0)->status != STATUS_INACTIVE || !_network_server))
- printf("Random [%d/%d] %s:%d\n",_frame_counter, _current_player, file, line);
+ printf("Random [%d/%d] %s:%d\n",_frame_counter, (byte)_current_player, file, line);
#endif
s = _random_seeds[0][0];
--- a/src/misc_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -341,6 +341,8 @@
*/
CommandCost CmdGiveMoney(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
+ if (!_patches.give_money) return CMD_ERROR;
+
const Player *p = GetPlayer(_current_player);
CommandCost amount(min((Money)p1, (Money)20000000LL));
--- a/src/misc_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/misc_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -396,7 +396,7 @@
case WE_PLACE_MOUSEUP:
if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
- CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
+ CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
}
break;
--- a/src/music/win32_m.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/music/win32_m.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -142,7 +142,11 @@
}
if (NULL == (_midi.wait_obj = CreateEvent(NULL, FALSE, FALSE, NULL))) return "Failed to create event";
- if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, NULL))) return "Failed to create thread";
+
+ /* The lpThreadId parameter of CreateThread (the last parameter)
+ * may NOT be NULL on Windows 95, 98 and ME. */
+ DWORD threadId;
+ if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId))) return "Failed to create thread";
return NULL;
}
--- a/src/network/network.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -3,15 +3,7 @@
#include "../stdafx.h"
#include "network_data.h"
-#if defined(WITH_REV)
- extern const char _openttd_revision[];
-#elif defined(WITH_REV_HACK)
- #define WITH_REV
- extern const char _openttd_revision[] = WITH_REV_HACK;
-#else
- extern const char _openttd_revision[] = NOREV_STRING;
-#endif
-
+extern const char _openttd_revision[];
#ifdef ENABLE_NETWORK
@@ -1463,8 +1455,6 @@
/**
* Checks whether the given version string is compatible with our version.
- * It'll check the first NETWORK_REVISION_LENGTH - 1 characters (-1 for '\0')
- * against the current version and the NOREV_STRING.
* @param other the version string to compare to
*/
bool IsNetworkCompatibleVersion(const char *other)
--- a/src/network/network.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network.h Sat Oct 06 21:16:00 2007 +0000
@@ -3,8 +3,6 @@
#ifndef NETWORK_H
#define NETWORK_H
-#define NOREV_STRING "norev000"
-
#ifdef ENABLE_NETWORK
#include "../player.h"
--- a/src/network/network_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/network/network_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1264,8 +1264,8 @@
_clientlist_proc[i++] = &ClientList_SpeakToAll;
if (_network_own_client_index != ci->client_index) {
- /* We are no spectator and the player we want to give money to is no spectator */
- if (IsValidPlayer(_network_playas) && IsValidPlayer(ci->client_playas)) {
+ /* We are no spectator and the player we want to give money to is no spectator and money gifts are allowed */
+ if (IsValidPlayer(_network_playas) && IsValidPlayer(ci->client_playas) && _patches.give_money) {
GetString(_clientlist_action[i], STR_NETWORK_CLIENTLIST_GIVE_MONEY, lastof(_clientlist_action[i]));
_clientlist_proc[i++] = &ClientList_GiveMoney;
}
--- a/src/newgrf.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -247,7 +247,7 @@
* @param str StringID that we want to have the equivalent in OoenTTD
* @return the properly adjusted StringID
*/
-static StringID MapGRFStringID(uint32 grfid, StringID str)
+StringID MapGRFStringID(uint32 grfid, StringID str)
{
/* 0xD0 and 0xDC stand for all the TextIDs in the range
* of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
@@ -256,17 +256,26 @@
if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
return GetGRFStringID(grfid, str);
}
-
+#define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
/* We have some changes in our cargo strings, resulting in some missing. */
- if (str >= 0x006E && str <= 0x008D) return str - 0x20;
- if (str >= 0x008E && str <= 0x00AD) return str - 0x20;
+ TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
+ TEXID_TO_STRINGID(0x002E, 0x004D, STR_002E);
+ TEXID_TO_STRINGID(0x004E, 0x006D, STR_QUANTITY_NOTHING);
+ TEXID_TO_STRINGID(0x006E, 0x008D, STR_QUANTITY_NOTHING);
+ TEXID_TO_STRINGID(0x008E, 0x00AD, STR_ABBREV_NOTHING);
/* Map building names according to our lang file changes
* 0x200F = Tall Office Block, first house name in the original data, the one that TTDPatch stil uses
* 0x201F = Old houses is the last house name.
* OpenTTD does not have exactly the same order aymore, so, the code below allows
* to compensate for the difference */
- if (str >= 0x200F && str <= 0x201F) return str + (STR_200F_TALL_OFFICE_BLOCK - 0x200F);
+ TEXID_TO_STRINGID(0x200F, 0x201F, STR_200F_TALL_OFFICE_BLOCK);
+
+ /* Same thing for industries, since the introduction of 4 new strings above STR_482A_PRODUCTION_LAST_MONTH */
+ TEXID_TO_STRINGID(0x482A, 0x483B, STR_482A_PRODUCTION_LAST_MONTH);
+#undef TEXTID_TO_STRINGID
+
+ if (str == STR_NULL) return STR_EMPTY;
return str;
}
@@ -1205,9 +1214,6 @@
/* Allocate house specs if they haven't been allocated already. */
if (_cur_grffile->housespec == NULL) {
_cur_grffile->housespec = CallocT<HouseSpec*>(HOUSE_MAX);
-
- /* Reset any overrides that have been set. */
- _house_mngr.ResetOverride();
}
for (int i = 0; i < numinfo; i++) {
@@ -1701,8 +1707,6 @@
static bool IndustrytilesChangeInfo(uint indtid, int numinfo, int prop, byte **bufp, int len)
{
- if (!HASBIT(_ttdpatch_flags[3], 0x07)) return true;
-
byte *buf = *bufp;
bool ret = false;
@@ -1714,9 +1718,6 @@
/* Allocate industry tile specs if they haven't been allocated already. */
if (_cur_grffile->indtspec == NULL) {
_cur_grffile->indtspec = CallocT<IndustryTileSpec*>(NUM_INDUSTRYTILES);
-
- /* Reset any overrides that have been set. */
- _industile_mngr.ResetOverride();
}
for (int i = 0; i < numinfo; i++) {
@@ -1771,7 +1772,7 @@
case 0x0C: {
uint16 acctp = grf_load_word(&buf);
tsp->accepts_cargo[prop - 0x0A] = GetCargoTranslation(GB(acctp, 0, 8), _cur_grffile);
- tsp->acceptance[prop - 0x0A] = GetCargoTranslation(GB(acctp, 8, 8), _cur_grffile);
+ tsp->acceptance[prop - 0x0A] = GB(acctp, 8, 8);
} break;
case 0x0D: // Land shape flags
@@ -1810,8 +1811,6 @@
static bool IndustriesChangeInfo(uint indid, int numinfo, int prop, byte **bufp, int len)
{
- if (!HASBIT(_ttdpatch_flags[3], 0x07)) return true;
-
byte *buf = *bufp;
bool ret = false;
@@ -1825,9 +1824,6 @@
/* Allocate industry specs if they haven't been allocated already. */
if (_cur_grffile->industryspec == NULL) {
_cur_grffile->industryspec = CallocT<IndustrySpec*>(NUM_INDUSTRYTYPES);
-
- /* Reset any overrides that have been set. */
- _industry_mngr.ResetOverride();
}
for (int i = 0; i < numinfo; i++) {
@@ -1937,6 +1933,9 @@
size = k + 1;
copy_from = itt;
}
+ } else if (itt[k].gfx == 0xFF) {
+ itt[k].ti.x = (int8)GB(itt[k].ti.x, 0, 8);
+ itt[k].ti.y = (int8)GB(itt[k].ti.y, 0, 8);
}
}
tile_table[j] = CallocT<IndustryTileTable>(size);
@@ -2004,11 +2003,11 @@
break;
case 0x17: // Probability in random game
- indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
+ indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
break;
case 0x18: // Probability during gameplay
- indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
+ indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
break;
case 0x19: // Map color
@@ -3279,8 +3278,6 @@
static void IndustryMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
{
- if (!HASBIT(_ttdpatch_flags[3], 0x07)) return;
-
byte *bp = &buf[4 + idcount + cidcount * 3];
uint16 groupid = grf_load_word(&bp);
@@ -3305,8 +3302,6 @@
static void IndustrytileMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
{
- if (!HASBIT(_ttdpatch_flags[3], 0x07)) return;
-
byte *bp = &buf[4 + idcount + cidcount * 3];
uint16 groupid = grf_load_word(&bp);
@@ -3439,8 +3434,8 @@
grfmsg(6, "FeatureMapSpriteGroup: Feature %d, %d ids, %d cids, wagon override %d",
feature, idcount, cidcount, wagover);
- if (_cur_grffile->spriteset_start == 0 || _cur_grffile->spritegroups == 0) {
- grfmsg(1, "FeatureMapSpriteGroup: No sprite set to work on! Skipping");
+ if (_cur_grffile->spritegroups == 0) {
+ grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
return;
}
@@ -3806,8 +3801,8 @@
case 0x8B: { // TTDPatch version
uint major = 2;
uint minor = 6;
- uint revision = 0; // special case: 2.0.1 is 2.0.10
- uint build = 1210;
+ uint revision = 1; // special case: 2.0.1 is 2.0.10
+ uint build = 1382;
return (major << 24) | (minor << 20) | (revision << 16) | build;
}
@@ -4928,9 +4923,9 @@
break;
case 'atad': // 'data'
- se->file_size = size;
- se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1;
- se->file_offset |= _file_index << 24;
+ se->file_size = size;
+ se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1;
+ se->file_slot = _file_index;
/* Set default volume and priority */
se->volume = 0x80;
@@ -5143,7 +5138,7 @@
| (0 << 0x04) // aichoosechance
| (1 << 0x05) // resolutionwidth
| (1 << 0x06) // resolutionheight
- | (0 << 0x07) // newindustries
+ | (1 << 0x07) // newindustries
| ((_patches.improved_load ? 1 : 0) << 0x08) // fifoloading
| (0 << 0x09) // townroadbranchprob
| (0 << 0x0A) // tempsnowline
@@ -5387,7 +5382,7 @@
_loaded_newgrf_features.has_2CC = false;
_loaded_newgrf_features.has_newhouses = false;
- _loaded_newgrf_features.has_newindustries = false,
+ _loaded_newgrf_features.has_newindustries = false;
_signal_base = 0;
_coast_base = 0;
@@ -5912,7 +5907,7 @@
/* Load newgrf sprites
* in each loading stage, (try to) open each file specified in the config
* and load information from it. */
- for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
+ for (GrfLoadingStage stage = GLS_LABELSCAN; stage < GLS_ACTIVATION; stage++) {
uint slot = file_index;
_cur_stage = stage;
@@ -5925,13 +5920,17 @@
if (!FioCheckFileExists(c->filename)) error("NewGRF file is missing '%s'", c->filename);
if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
- LoadNewGRFFile(c, slot++, stage);
+ LoadNewGRFFile(c, slot, stage);
if (stage == GLS_RESERVE) {
if (c->status == GCS_ACTIVATED) c->status = GCS_INITIALISED;
- } else if (stage == GLS_ACTIVATION) {
+ _cur_stage = GLS_ACTIVATION;
+ LoadNewGRFFile(c, slot++, GLS_ACTIVATION);
+ _cur_stage = stage;
ClearTemporaryNewGRFData();
BuildCargoTranslationMap();
DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
+ } else {
+ slot++;
}
}
}
--- a/src/newgrf_callbacks.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_callbacks.h Sat Oct 06 21:16:00 2007 +0000
@@ -13,6 +13,9 @@
* bit is set in the callback flags/trigger for a vehicle, house,
* industry, etc.
* Names are formatted as CBID_<CLASS>_<CALLBACK>
+ *
+ * @note Do not forget to add 15 bits callbacks to the switch in
+ * newgrf_spritegroup.cpp (search for "15 bits callback").
*/
enum CallbackID {
/** Set when using the callback resolve system, but not to resolve a callback. */
@@ -21,6 +24,8 @@
/** Set when calling a randomizing trigger (almost undocumented). */
CBID_RANDOM_TRIGGER = 0x01,
+ /* There are no callbacks 0x02 - 0x0F. */
+
/** Powered wagons, if the result is lower as 0x40 then the wagon is powered
* @todo : interpret the rest of the result, aka "visual effects". */
CBID_TRAIN_WAGON_POWER = 0x10,
@@ -66,7 +71,7 @@
CBID_TRAIN_ALLOW_WAGON_ATTACH = 0x1D,
/** Called to determine the colour of a town building. */
- CBID_BUILDING_COLOUR = 0x1E,
+ CBID_HOUSE_COLOUR = 0x1E,
/** Called to decide how much cargo a town building can accept. */
CBID_HOUSE_CARGO_ACCEPTANCE = 0x1F,
@@ -100,7 +105,7 @@
CBID_INDUSTRY_LOCATION = 0x28,
/** Called on production changes, so it can be adjusted. */
- CBID_INDUSTRY_PRODUCTION_CHANGE = 0x29, // not implemented
+ CBID_INDUSTRY_PRODUCTION_CHANGE = 0x29,
/** Called to determine which cargoes a town building should accept. */
CBID_HOUSE_ACCEPT_CARGO = 0x2A,
@@ -138,7 +143,7 @@
CBID_VEHICLE_AUTOREPLACE_SELECTION = 0x34,
/** Called monthly on production changes, so it can be adjusted more frequently */
- CBID_INDUSTRY_MONTHLYPROD_CHANGE = 0x35, // not implemented
+ CBID_INDUSTRY_MONTHLYPROD_CHANGE = 0x35,
/** Called to modify various vehicle properties. Callback parameter 1
* specifies the property index, as used in Action 0, to change. */
@@ -160,11 +165,13 @@
CBID_INDUSTRY_SPECIAL_EFFECT = 0x3B,
/** Called to determine if industry can alter the ground below industry tile */
- CBID_INDUSTRY_AUTOSLOPE = 0x3C, // not implemented
+ CBID_INDUSTRY_AUTOSLOPE = 0x3C,
/** Called to determine if the industry can still accept or refuse more cargo arrival */
CBID_INDUSTRY_REFUSE_CARGO = 0x3D,
+ /* There are no callbacks 0x3E - 0x142. */
+
/** Called to determine whether a town building can be destroyed. */
CBID_HOUSE_DENY_DESTRUCTION = 0x143,
@@ -179,6 +186,20 @@
/** Add an offset to the default sprite numbers to show another sprite. */
CBID_CANALS_SPRITE_OFFSET = 0x147, // not implemented
+
+ /* There is no callback 0x148.*/
+
+ /** Callback done for each tile of a station to check the slope. */
+ CBID_STATION_LAND_SLOPE_CHECK = 0x149, // not implemented
+
+ /** Called to determine the color of an industry. */
+ CBID_INDUSTRY_DECIDE_COLOUR = 0x14A,
+
+ /** Customize the input cargo types of a newly build industry. */
+ CBID_INDUSTRY_INPUT_CARGO_TYPES = 0x14B,
+
+ /** Customize the output cargo types of a newly build industry. */
+ CBID_INDUSTRY_OUTPUT_CARGO_TYPES = 0x14C,
};
/**
@@ -186,64 +207,70 @@
* Some callbacks are always used and don't have a mask.
*/
enum VehicleCallbackMask {
- CBM_WAGON_POWER = 0, ///< Powered wagons (trains only)
- CBM_VEHICLE_LENGTH = 1, ///< Vehicle length (trains only)
- CBM_LOAD_AMOUNT = 2, ///< Load amount
- CBM_REFIT_CAPACITY = 3, ///< Cargo capacity after refit
- CBM_ARTIC_ENGINE = 4, ///< Add articulated engines (trains only)
- CBM_CARGO_SUFFIX = 5, ///< Show suffix after cargo name
- CBM_COLOUR_REMAP = 6, ///< Change colour mapping of vehicle
- CBM_SOUND_EFFECT = 7, ///< Vehicle uses custom sound effects
+ CBM_TRAIN_WAGON_POWER = 0, ///< Powered wagons (trains only)
+ CBM_VEHICLE_LENGTH = 1, ///< Vehicle length (trains and road vehicles)
+ CBM_VEHICLE_LOAD_AMOUNT = 2, ///< Load amount
+ CBM_VEHICLE_REFIT_CAPACITY = 3, ///< Cargo capacity after refit
+ CBM_VEHICLE_ARTIC_ENGINE = 4, ///< Add articulated engines (trains only)
+ CBM_VEHICLE_CARGO_SUFFIX = 5, ///< Show suffix after cargo name
+ CBM_VEHICLE_COLOUR_REMAP = 6, ///< Change colour mapping of vehicle
+ CBM_VEHICLE_SOUND_EFFECT = 7, ///< Vehicle uses custom sound effects
};
/**
* Callback masks for stations.
*/
enum StationCallbackMask {
- CBM_STATION_AVAIL = 0, ///< Availability of station in construction window
- CBM_CUSTOM_LAYOUT = 1, ///< Use callback to select a tile layout to use
+ CBM_STATION_AVAIL = 0, ///< Availability of station in construction window
+ CBM_STATION_SPRITE_LAYOUT = 1, ///< Use callback to select a sprite layout to use
+ CBM_STATION_ANIMATION_NEXT_FRAME = 2, ///< Use a custom next frame callback
+ CBM_STATION_ANIMATION_SPEED = 3, ///< Customize the animation speed of the station
+ CBM_STATION_SLOPE_CHECK = 4, ///< Check slope of new station tiles
};
/**
* Callback masks for houses.
*/
enum HouseCallbackMask {
- CBM_HOUSE_ALLOW_CONSTRUCTION = 0,
- CBM_ANIMATION_NEXT_FRAME = 1,
- CBM_ANIMATION_START_STOP = 2,
- CBM_CONSTRUCTION_STATE_CHANGE = 3,
- CBM_BUILDING_COLOUR = 4,
- CBM_CARGO_ACCEPTANCE = 5,
- CBM_ANIMATION_SPEED = 6,
- CBM_HOUSE_DESTRUCTION = 7,
- CBM_HOUSE_ACCEPT_CARGO = 8,
- CBM_HOUSE_PRODUCE_CARGO = 9,
- CBM_HOUSE_DENY_DESTRUCTION = 10,
+ CBM_HOUSE_ALLOW_CONSTRUCTION = 0,
+ CBM_HOUSE_ANIMATION_NEXT_FRAME = 1,
+ CBM_HOUSE_ANIMATION_START_STOP = 2,
+ CBM_HOUSE_CONSTRUCTION_STATE_CHANGE = 3,
+ CBM_HOUSE_COLOUR = 4,
+ CBM_HOUSE_CARGO_ACCEPTANCE = 5,
+ CBM_HOUSE_ANIMATION_SPEED = 6,
+ CBM_HOUSE_DESTRUCTION = 7,
+ CBM_HOUSE_ACCEPT_CARGO = 8,
+ CBM_HOUSE_PRODUCE_CARGO = 9,
+ CBM_HOUSE_DENY_DESTRUCTION = 10,
};
/**
* Callback masks for cargos.
*/
enum CargoCallbackMask {
- CBM_CARGO_PROFIT_CALC = 0,
- CBM_CARGO_STATION_RATING_CALC = 1,
+ CBM_CARGO_PROFIT_CALC = 0, ///< custom profit calculation
+ CBM_CARGO_STATION_RATING_CALC = 1, ///< custom station rating for this cargo type
};
/**
* Callback masks for Industries
*/
enum IndustryCallbackMask {
- CBM_IND_AVAILABLE = 0, ///< industry availability callback
- CBM_IND_PRODUCTION_CARGO_ARRIVAL = 1, ///< call production callback when cargo arrives at the industry
- CBM_IND_PRODUCTION_256_TICKS = 2, ///< call production callback every 256 ticks
- CBM_IND_LOCATION = 3, ///< check industry construction on given area
- CBM_IND_PRODUCTION_CHANGE = 4, ///< controls random production change
- CBM_IND_MONTHLYPROD_CHANGE = 5, ///< controls monthly random production change
- CBM_IND_CARGO_SUFFIX = 6, ///< cargo sub-type display
- CBM_IND_FUND_MORE_TEXT = 7, ///< additional text in fund window
- CBM_IND_WINDOW_MORE_TEXT = 8, ///< additional text in industry window
- CBM_IND_SPECIAL_EFFECT = 9, ///< control special effects
+ CBM_IND_AVAILABLE = 0, ///< industry availability callback
+ CBM_IND_PRODUCTION_CARGO_ARRIVAL = 1, ///< call production callback when cargo arrives at the industry
+ CBM_IND_PRODUCTION_256_TICKS = 2, ///< call production callback every 256 ticks
+ CBM_IND_LOCATION = 3, ///< check industry construction on given area
+ CBM_IND_PRODUCTION_CHANGE = 4, ///< controls random production change
+ CBM_IND_MONTHLYPROD_CHANGE = 5, ///< controls monthly random production change
+ CBM_IND_CARGO_SUFFIX = 6, ///< cargo sub-type display
+ CBM_IND_FUND_MORE_TEXT = 7, ///< additional text in fund window
+ CBM_IND_WINDOW_MORE_TEXT = 8, ///< additional text in industry window
+ CBM_IND_SPECIAL_EFFECT = 9, ///< control special effects
CBM_IND_REFUSE_CARGO = 10, ///< option out of accepting cargo
+ CBM_IND_DECIDE_COLOUR = 11, ///< give a custom colour to newly build industries
+ CBM_IND_INPUT_CARGO_TYPES = 12, ///< customize the cargos the industry requires
+ CBM_IND_OUTPUT_CARGO_TYPES = 13, ///< customize the cargos the industry produces
};
/**
--- a/src/newgrf_canal.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_canal.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -42,7 +42,7 @@
switch (variable) {
case 0x80:
- return TileHeight(tile);
+ return GetTileZ(tile) / TILE_HEIGHT;
case 0x81:
return GetTerrainType(tile);
--- a/src/newgrf_commons.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_commons.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -105,7 +105,7 @@
for (id = max_offset; id < max_new_entities; id++) {
map = &mapping_ID[id];
- if (map->entity_id == 0 && map->grfid == 0) {
+ if (CheckValidNewID(id) && map->entity_id == 0 && map->grfid == 0) {
map->entity_id = grf_local_id;
map->grfid = grfid;
map->substitute_id = substitute_id;
@@ -188,7 +188,7 @@
* checking what is available
* @param inds Industryspec that comes from the grf decoding process
*/
-void IndustryOverrideManager::SetEntitySpec(const IndustrySpec *inds)
+void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds)
{
/* First step : We need to find if this industry is already specified in the savegame data */
IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid);
@@ -206,6 +206,7 @@
* Or it is a simple substitute.
* In both case, we need to find a free available slot */
ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid, inds->grf_prop.subst_id);
+ inds->grf_prop.override = invalid_ID; // make sure it will not be detected as overriden
}
}
@@ -252,7 +253,7 @@
{
switch (_opt.landscape) {
case LT_TROPIC: return GetTropicZone(tile) == TROPICZONE_DESERT ? 1 : 2;
- case LT_ARCTIC: return GetTileZ(tile) >= GetSnowLine() ? 4 : 0;
+ case LT_ARCTIC: return GetTileZ(tile) > GetSnowLine() ? 4 : 0;
default: return 0;
}
}
--- a/src/newgrf_commons.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_commons.h Sat Oct 06 21:16:00 2007 +0000
@@ -33,6 +33,7 @@
uint16 max_new_entities; ///< what is the amount of entities, old and new summed
uint16 invalid_ID; ///< ID used to dected invalid entities;
+ virtual bool CheckValidNewID(uint16 testid) { return true; }
public:
EntityIDMapping *mapping_ID; ///< mapping of ids from grf files. Public out of convenience
@@ -70,12 +71,14 @@
OverrideManagerBase(offset, maximum, invalid) {}
virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
- void SetEntitySpec(const IndustrySpec *inds);
+ void SetEntitySpec(IndustrySpec *inds);
};
struct IndustryTileSpec;
class IndustryTileOverrideManager : public OverrideManagerBase {
+protected:
+ virtual bool CheckValidNewID(uint16 testid) { return testid != 0xFF; }
public:
IndustryTileOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) :
OverrideManagerBase(offset, maximum, invalid) {}
--- a/src/newgrf_config.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_config.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -37,20 +37,21 @@
FILE *f;
md5_state_t md5state;
md5_byte_t buffer[1024];
- size_t len;
+ size_t len, size;
/* open the file */
- f = FioFOpenFile(config->filename);
+ f = FioFOpenFile(config->filename, "rb", DATA_DIR, &size);
if (f == NULL) return false;
/* calculate md5sum */
md5_init(&md5state);
- while ((len = fread(buffer, 1, sizeof(buffer), f)) != 0) {
+ while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, f)) != 0 && size != 0) {
+ size -= len;
md5_append(&md5state, buffer, len);
}
md5_finish(&md5state, config->md5sum);
- fclose(f);
+ FioFCloseFile(f);
return true;
}
@@ -232,8 +233,8 @@
void ResetGRFConfig(bool defaults)
{
CopyGRFConfigList(&_grfconfig, _grfconfig_newgame, !defaults);
- AddGRFTToGameListByGRFid(0x4450414F); // OAPD - airportsbasic.grf
- AddGRFTToGameListByGRFid(0x5850414F); // OAPX - airportsextended.grf
+ AddGRFTToGameListByGRFid(0x4450414F); // OAPD - airportsbasic.grf
+ AddGRFTToGameListByGRFid(0x5850414F); // OAPX - airportsextended.grf
AppendStaticGRFConfigs(&_grfconfig);
}
@@ -296,12 +297,54 @@
return res;
}
+static bool ScanPathAddGrf(const char *filename)
+{
+ GRFConfig *c = CallocT<GRFConfig>(1);
+ c->filename = strdup(filename);
-extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+ bool added = true;
+ if (FillGRFDetails(c, false)) {
+ if (_all_grfs == NULL) {
+ _all_grfs = c;
+ } else {
+ /* Insert file into list at a position determined by its
+ * name, so the list is sorted as we go along */
+ GRFConfig **pd, *d;
+ bool stop = false;
+ for (pd = &_all_grfs; (d = *pd) != NULL; pd = &d->next) {
+ if (c->grfid == d->grfid && memcmp(c->md5sum, d->md5sum, sizeof(c->md5sum)) == 0) added = false;
+ /* Because there can be multiple grfs with the same name, make sure we checked all grfs with the same name,
+ * before inserting the entry. So insert a new grf at the end of all grfs with the same name, instead of
+ * just after the first with the same name. Avoids doubles in the list. */
+ if (strcasecmp(c->name, d->name) <= 0) stop = true;
+ else if (stop) break;
+ }
+ if (added) {
+ c->next = d;
+ *pd = c;
+ }
+ }
+ } else {
+ added = false;
+ }
+
+ if (!added) {
+ /* File couldn't be opened, or is either not a NewGRF or is a
+ * 'system' NewGRF or it's already known, so forget about it. */
+ free(c->filename);
+ free(c->name);
+ free(c->info);
+ free(c);
+ }
+
+ return added;
+}
/* Scan a path for NewGRFs */
static uint ScanPath(const char *path, int basepath_length)
{
+ extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
+
uint num = 0;
struct stat sb;
struct dirent *dirent;
@@ -330,40 +373,7 @@
if (ext == NULL) continue;
if (strcasecmp(ext, ".grf") != 0) continue;
- GRFConfig *c = CallocT<GRFConfig>(1);
- c->filename = strdup(filename + basepath_length);
-
- bool added = true;
- if (FillGRFDetails(c, false)) {
- if (_all_grfs == NULL) {
- _all_grfs = c;
- } else {
- /* Insert file into list at a position determined by its
- * name, so the list is sorted as we go along */
- GRFConfig **pd, *d;
- for (pd = &_all_grfs; (d = *pd) != NULL; pd = &d->next) {
- if (c->grfid == d->grfid && memcmp(c->md5sum, d->md5sum, sizeof(c->md5sum)) == 0) added = false;
- if (strcasecmp(c->name, d->name) <= 0) break;
- }
- if (added) {
- c->next = d;
- *pd = c;
- }
- }
- } else {
- added = false;
- }
-
- if (!added) {
- /* File couldn't be opened, or is either not a NewGRF or is a
- * 'system' NewGRF or it's already known, so forget about it. */
- free(c->filename);
- free(c->name);
- free(c->info);
- free(c);
- } else {
- num++;
- }
+ if (ScanPathAddGrf(filename + basepath_length)) num++;
}
}
@@ -372,12 +382,42 @@
return num;
}
+static uint ScanTar(TarFileList::iterator tar)
+{
+ uint num = 0;
+ const char *filename = (*tar).first.c_str();
+ const char *ext = strrchr(filename, '.');
+
+ /* If no extension or extension isn't .grf, skip the file */
+ if (ext == NULL) return false;
+ if (strcasecmp(ext, ".grf") != 0) return false;
+
+ if (ScanPathAddGrf(filename)) num++;
+
+ return num;
+}
+
+/**
+ * Simple sorter for GRFS
+ * @param p1 the first GRFConfig *
+ * @param p2 the second GRFConfig *
+ * @return the same strcmp would return for the name of the NewGRF.
+ */
+static int CDECL GRFSorter(const void *p1, const void *p2)
+{
+ const GRFConfig *c1 = *(const GRFConfig **)p1;
+ const GRFConfig *c2 = *(const GRFConfig **)p2;
+
+ return strcmp(c1->name != NULL ? c1->name : c1->filename,
+ c2->name != NULL ? c2->name : c2->filename);
+}
/* Scan for all NewGRFs */
void ScanNewGRFFiles()
{
Searchpath sp;
char path[MAX_PATH];
+ TarFileList::iterator tar;
uint num = 0;
ClearGRFConfigList(&_all_grfs);
@@ -387,7 +427,33 @@
FioAppendDirectory(path, MAX_PATH, sp, DATA_DIR);
num += ScanPath(path, strlen(path));
}
+ FOR_ALL_TARS(tar) {
+ num += ScanTar(tar);
+ }
+
DEBUG(grf, 1, "Scan complete, found %d files", num);
+ if (num == 0 || _all_grfs == NULL) return;
+
+ /* Sort the linked list using quicksort.
+ * For that we first have to make an array, the qsort and
+ * then remake the linked list. */
+ GRFConfig **to_sort = MallocT<GRFConfig*>(num);
+ if (to_sort == NULL) return; // No memory, then don't sort
+
+ uint i = 0;
+ for (GRFConfig *p = _all_grfs; p != NULL; p = p->next, i++) {
+ to_sort[i] = p;
+ }
+ /* Number of files is not necessarily right */
+ num = i;
+
+ qsort(to_sort, num, sizeof(GRFConfig*), GRFSorter);
+
+ for (i = 1; i < num; i++) {
+ to_sort[i - 1]->next = to_sort[i];
+ }
+ to_sort[num - 1]->next = NULL;
+ _all_grfs = to_sort[0];
}
@@ -515,7 +581,7 @@
AppendToGRFConfigList(&_grfconfig, c);
}
- if (CheckSavegameVersion(74)) {
+ if (CheckSavegameVersion(NEWGRF_AIRPORTS_SAVEGAME)) {
/* before doing tile tests, ensure mandatory newgrfs loaded */
AddGRFTToGameListByGRFid(0x4450414F); // OAPD - airportsbasic.grf
AddGRFTToGameListByGRFid(0x5850414F); // OAPX - airportsextended.grf
--- a/src/newgrf_engine.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_engine.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -499,8 +499,6 @@
switch (variable) {
case 0x40: // Get length of consist
case 0x41: // Get length of same consecutive wagons
- if (!v->HasFront()) return 1;
-
{
const Vehicle* u;
byte chain_before = 0;
@@ -540,7 +538,7 @@
cargo_classes |= GetCargo(u->cargo_type)->classes;
common_cargos[u->cargo_type]++;
- user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
+ if (v->type == VEH_TRAIN) user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
common_subtypes[u->cargo_subtype]++;
}
@@ -783,15 +781,10 @@
const Vehicle *v = object->u.vehicle.self;
uint totalsets;
uint set;
- bool in_motion;
if (v == NULL) return group->g.real.loading[0];
- if (v->type == VEH_TRAIN) {
- in_motion = v->First()->current_order.type != OT_LOADING;
- } else {
- in_motion = v->current_order.type != OT_LOADING;
- }
+ bool in_motion = v->First()->current_order.type != OT_LOADING;
totalsets = in_motion ? group->g.real.num_loaded : group->g.real.num_loading;
@@ -816,7 +809,7 @@
res->ResolveReal = &VehicleResolveReal;
res->u.vehicle.self = v;
- res->u.vehicle.parent = (v != NULL && v->HasFront()) ? v->First() : v;
+ res->u.vehicle.parent = (v != NULL) ? v->First() : v;
res->u.vehicle.self_type = engine_type;
@@ -1017,7 +1010,7 @@
* i.e.), so we give them all the NEW_CARGO triggered
* vehicle's portion of random bits. */
assert(first);
- DoTriggerVehicle((v->type == VEH_TRAIN) ? v->First() : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
+ DoTriggerVehicle(v->First(), VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
break;
case VEHICLE_TRIGGER_DEPOT:
--- a/src/newgrf_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -515,6 +515,7 @@
case WE_RESIZE:
w->vscroll.cap += e->we.sizing.diff.y / 14;
w->widget[SNGRFS_FILE_LIST].data = (w->vscroll.cap << 8) + 1;
+ SetupNewGRFWindow(w);
break;
}
}
--- a/src/newgrf_house.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_house.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -185,7 +185,9 @@
tile = GetNearbyTile(parameter, tile);
tile_type = GetTerrainType(tile) << 2 | (IsTileType(tile, MP_WATER) ? 1 : 0) << 1;
- return GetTileType(tile) << 24 | (TileHeight(tile) * 8) << 16 | tile_type << 8 | GetTileSlope(tile, NULL);
+ uint z;
+ Slope tileh = GetTileSlope(tile, &z);
+ return GetTileType(tile) << 24 | z << 16 | tile_type << 8 | tileh;
}
/**
@@ -306,19 +308,23 @@
SpriteID image = dts->ground_sprite;
SpriteID pal = dts->ground_pal;
+ if (IS_CUSTOM_SPRITE(image)) image += stage;
+
if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
foreach_draw_tile_seq(dtss, dts->seq) {
if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
- image = dtss->image + stage;
+ image = dtss->image;
pal = dtss->pal;
+ if (IS_CUSTOM_SPRITE(image)) image += stage;
+
if ((HASBIT(image, SPRITE_MODIFIER_OPAQUE) || !HASBIT(_transparent_opt, TO_HOUSES)) && HASBIT(image, PALETTE_MODIFIER_COLOR)) {
if (pal == 0) {
const HouseSpec *hs = GetHouseSpecs(house_id);
- if (HASBIT(hs->callback_mask, CBM_BUILDING_COLOUR)) {
- uint16 callback = GetHouseCallback(CBID_BUILDING_COLOUR, 0, 0, house_id, GetTownByTile(ti->tile), ti->tile);
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_COLOUR)) {
+ uint16 callback = GetHouseCallback(CBID_HOUSE_COLOUR, 0, 0, house_id, GetTownByTile(ti->tile), ti->tile);
if (callback != CALLBACK_FAILED) {
/* If bit 14 is set, we should use a 2cc colour map, else use the callback value. */
pal = HASBIT(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
@@ -340,7 +346,7 @@
HASBIT(_transparent_opt, TO_HOUSES)
);
} else {
- AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+ AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_HOUSES));
}
}
}
@@ -373,7 +379,7 @@
byte animation_speed = hs->animation_speed;
bool frame_set_by_callback = false;
- if (HASBIT(hs->callback_mask, CBM_ANIMATION_SPEED)) {
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_SPEED)) {
uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_SPEED, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
if (callback_res != CALLBACK_FAILED) animation_speed = clamp(callback_res & 0xFF, 2, 16);
}
@@ -387,7 +393,7 @@
byte frame = GetHouseAnimationFrame(tile);
byte num_frames = GB(hs->animation_frames, 0, 7);
- if (HASBIT(hs->callback_mask, CBM_ANIMATION_NEXT_FRAME)) {
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_NEXT_FRAME)) {
uint32 param = (hs->extra_flags & CALLBACK_1A_RANDOM_BITS) ? Random() : 0;
uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_NEXT_FRAME, param, 0, GetHouseType(tile), GetTownByTile(tile), tile);
@@ -466,7 +472,7 @@
{
const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
- if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_START_STOP)) {
uint32 param = (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random();
uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_START_STOP, param, 0, GetHouseType(tile), GetTownByTile(tile), tile);
@@ -489,7 +495,7 @@
* MarkTileDirtyByTile(tile);
*/
- if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_ANIMATION_START_STOP)) {
/* If this house is marked as having a synchronised callback, all the
* tiles will have the callback called at once, rather than when the
* tile loop reaches them. This should only be enabled for the northern
--- a/src/newgrf_industries.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industries.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -48,6 +48,7 @@
for (t = 0; t < MapSize(); t++) {
if (IsTileType(t, MP_WATER) == water) break;
}
+ if (t == MapSize() && !water) return 0x200;
best_dist = DistanceManhattan(tile, t);
for (; t < MapSize(); t++) {
@@ -58,12 +59,12 @@
/* When the Y distance between the current row and the 'source' tile
* is larger than the best distance, we've found the best distance */
if ((int)TileY(t) - (int)TileY(tile) > best_dist) break;
- if (TileX(tile) > TileX(t)) {
+ if ((int)TileX(t) - (int)TileX(tile) > best_dist) {
/* We can safely skip this many tiles; from here all tiles have a
* higher or equal distance than the best distance */
t |= MapMaxX();
continue;
- } else {
+ } else if (TileX(tile) < TileX(t)) {
/* We can safely skip this many tiles; up to here all tiles have a
* higher or equal distance than the best distance */
t += max(best_dist - dist, 0);
@@ -72,52 +73,49 @@
}
}
- return best_dist;
+ return min(best_dist, water ? 0x7F : 0x1FF);
}
/** Make an analysis of a tile and check for its belonging to the same
* industry, and/or the same grf file
- * @param new_tile TileIndex of the tile to query
- * @param old_tile TileIndex of the reference tile
- * @param i Industry to which old_tile belongs to
+ * @param tile TileIndex of the tile to query
+ * @param i Industry to which to compare the tile to
* @return value encoded as per NFO specs */
-uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i)
+uint32 GetIndustryIDAtOffset(TileIndex tile, const Industry *i)
{
- if (IsTileType(new_tile, MP_INDUSTRY)) { // Is this an industry tile?
-
- if (GetIndustryIndex(new_tile) == i->index) { // Does it belong to the same industry?
- IndustryGfx gfx = GetIndustryGfx(new_tile);
- const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx);
- const IndustryTileSpec *indold = GetIndustryTileSpec(GetIndustryGfx(old_tile));
+ if (!IsTileType(tile, MP_INDUSTRY) || GetIndustryIndex(tile) == i->index) {
+ /* No industry and/or the tile does not have the same industry as the one we match it with */
+ return 0xFFFF;
+ }
- if (gfx < NEW_INDUSTRYOFFSET) { // Does it belongs to an old type?
- /* It is an old tile. We have to see if it's been overriden */
- if (indtsp->grf_prop.override == INVALID_INDUSTRYTILE) { // has it been overridden?
- return 0xFF << 8 | gfx; // no. Tag FF + the gfx id of that tile
- } else { // yes. FInd out if it is from the same grf file or not
- const IndustryTileSpec *old_tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override);
+ IndustryGfx gfx = GetCleanIndustryGfx(tile);
+ const IndustryTileSpec *indtsp = GetIndustryTileSpec(gfx);
+ const IndustrySpec *indold = GetIndustrySpec(i->type);
- if (old_tile_ovr->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {
- return old_tile_ovr->grf_prop.local_id; // same grf file
- } else {
- return 0xFFFE; // not the same grf file
- }
- }
- } else {
- if (indtsp->grf_prop.spritegroup != NULL) { // tile has a spritegroup ?
- if (indtsp->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) { // same industry, same grf ?
- return indtsp->grf_prop.local_id;
- } else {
- return 0xFFFE; // Defined in another grf file
- }
- } else { // tile has no spritegroup
- return 0xFF << 8 | indtsp->grf_prop.subst_id; // so just give him the substitute
- }
- }
+ if (gfx < NEW_INDUSTRYOFFSET) { // Does it belongs to an old type?
+ /* It is an old tile. We have to see if it's been overriden */
+ if (indtsp->grf_prop.override == INVALID_INDUSTRYTILE) { // has it been overridden?
+ return 0xFF << 8 | gfx; // no. Tag FF + the gfx id of that tile
+ }
+ /* Not overriden */
+ const IndustryTileSpec *tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override);
+
+ if (tile_ovr->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) {
+ return tile_ovr->grf_prop.local_id; // same grf file
+ } else {
+ return 0xFFFE; // not the same grf file
}
}
-
- return 0xFFFF; // tile is not an industry one or does not belong to the current industry
+ /* Not an 'old type' tile */
+ if (indtsp->grf_prop.spritegroup != NULL) { // tile has a spritegroup ?
+ if (indtsp->grf_prop.grffile->grfid == indold->grf_prop.grffile->grfid) { // same industry, same grf ?
+ return indtsp->grf_prop.local_id;
+ } else {
+ return 0xFFFE; // Defined in another grf file
+ }
+ }
+ /* The tile has no spritegroup */
+ return 0xFF << 8 | indtsp->grf_prop.subst_id; // so just give him the substitute
}
static uint32 GetClosestIndustry(TileIndex tile, IndustryType type, const Industry *current)
@@ -155,8 +153,8 @@
break;
case 0xFFFFFFFF: // current grf
- ind_index = GetIndustrySpec(current->type)->grf_prop.grffile->grfid;
- /*Fall through*/
+ GrfID = GetIndustrySpec(current->type)->grf_prop.grffile->grfid;
+ /* Fall through */
default: //use the grfid specified in register 100h
ind_index = MapNewGRFIndustryType(param_setID, GrfID);
@@ -208,27 +206,47 @@
}
/* Manhattan distance of closes dry/water tile */
- case 0x43: return GetClosestWaterDistance(tile, (object->u.industry_location.spec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
+ case 0x43: return GetClosestWaterDistance(tile, (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
/* Layout number */
case 0x44: return industry->selected_layout;
+ /* player info */
+ case 0x45: {
+ byte colours;
+ bool is_ai = false;
+
+ if (IsValidPlayer(industry->founder)) {
+ const Player *p = GetPlayer(industry->founder);
+ const Livery *l = &p->livery[LS_DEFAULT];
+
+ is_ai = p->is_ai;
+ colours = l->colour1 + l->colour2 * 16;
+ } else {
+ colours = GB(Random(), 0, 8);
+ }
+
+ return industry->founder | (is_ai ? 0x10000 : 0) | (colours << 24);
+ }
+
/* Get industry ID at offset param */
- case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), tile, industry);
+ case 0x60: return GetIndustryIDAtOffset(GetNearbyTile(parameter, industry->xy), industry);
- case 0x61: return 0; // Get random tile bits at offset param
+ /* Get random tile bits at offset param */
+ case 0x61:
+ tile = GetNearbyTile(parameter, tile);
+ return (IsTileType(tile, MP_INDUSTRY) && GetIndustryByTile(tile) == industry) ? GetIndustryRandomBits(tile) : 0;
/* Land info of nearby tiles */
case 0x62: return GetNearbyIndustryTileInformation(parameter, tile, INVALID_INDUSTRY);
/* Animation stage of nearby tiles */
- case 0x63: {
+ case 0x63:
tile = GetNearbyTile(parameter, tile);
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryByTile(tile) == industry) {
return GetIndustryAnimationState(tile);
}
return 0xFFFFFFFF;
- }
/* Distance of nearest industry of given type */
case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid), industry);
@@ -242,6 +260,9 @@
case 0x67:
case 0x68: return GetCountAndDistanceOfClosestInstance(parameter, variable == 0x68 ? GB(GetRegister(0x101), 0, 8) : 0, industry);
+ /* Get a variable from the persistent storage */
+ case 0x7C: return industry->psa.Get(parameter);
+
/* Industry structure access*/
case 0x80: return industry->xy;
case 0x81: return GB(industry->xy, 8, 8);
@@ -254,7 +275,7 @@
case 0x87: return industry->height;// xy dimensions
/* */
case 0x88:
- case 0x89: return indspec->produced_cargo[variable - 0x88];
+ case 0x89: return industry->produced_cargo[variable - 0x88];
case 0x8A: return industry->produced_cargo_waiting[0];
case 0x8B: return GB(industry->produced_cargo_waiting[0], 8, 8);
case 0x8C: return industry->produced_cargo_waiting[1];
@@ -263,7 +284,7 @@
case 0x8F: return industry->production_rate[variable - 0x8E];
case 0x90:
case 0x91:
- case 0x92: return indspec->accepts_cargo[variable - 0x90];
+ case 0x92: return industry->accepts_cargo[variable - 0x90];
case 0x93: return industry->prod_level;
/* amount of cargo produced so far THIS month. */
case 0x94: return industry->this_month_production[0];
@@ -314,14 +335,31 @@
return NULL;
}
+static uint32 IndustryGetRandomBits(const ResolverObject *object)
+{
+ return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->random_bits;
+}
+
+static uint32 IndustryGetTriggers(const ResolverObject *object)
+{
+ return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->triggers;
+}
+
+static void IndustrySetTriggers(const ResolverObject *object, int triggers)
+{
+ if (object->u.industry.ind == NULL) return;
+ //object->u.industry.ind->triggers = triggers;
+}
+
static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus)
{
- res->GetRandomBits = IndustryTileGetRandomBits;
- res->GetTriggers = IndustryTileGetTriggers;
- res->SetTriggers = IndustryTileSetTriggers;
+ res->GetRandomBits = IndustryGetRandomBits;
+ res->GetTriggers = IndustryGetTriggers;
+ res->SetTriggers = IndustrySetTriggers;
res->GetVariable = IndustryGetVariable;
res->ResolveReal = IndustryResolveReal;
+ res->psa = &indus->psa;
res->u.industry.tile = tile;
res->u.industry.ind = indus;
res->u.industry.gfx = INVALID_INDUSTRYTILE;
@@ -352,55 +390,47 @@
uint32 IndustryLocationGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
{
- TileIndex tile = object->u.industry_location.tile;
+ const Industry *industry = object->u.industry.ind;
+ TileIndex tile = object->u.industry.tile;
if (object->scope == VSG_SCOPE_PARENT) {
- return TownGetVariable(variable, parameter, available, ClosestTownFromTile(tile, (uint)-1));
+ return TownGetVariable(variable, parameter, available, industry->town);
}
switch (variable) {
- /* Land info of nearby tiles */
- case 0x62: return GetNearbyIndustryTileInformation(parameter, tile, INVALID_INDUSTRY);
-
- /* Distance of nearest industry of given type */
- case 0x64: return GetClosestIndustry(tile, MapNewGRFIndustryType(parameter, object->u.industry_location.spec->grf_prop.grffile->grfid), NULL);
-
- /* Location where to build the industry */
case 0x80: return tile;
case 0x81: return GB(tile, 8, 8);
/* Pointer to the town the industry is associated with */
- case 0x82: return ClosestTownFromTile(tile, (uint)-1)->index;
+ case 0x82: return industry->town->index;
case 0x83:
case 0x84:
case 0x85: DEBUG(grf, 0, "NewGRFs shouldn't be doing pointer magic"); break; // not supported
/* Number of the layout */
- case 0x86: return object->u.industry_location.itspec_index;
+ case 0x86: return industry->selected_layout;
/* Ground type */
case 0x87: return GetTerrainType(tile);
/* Town zone */
- case 0x88: return GetTownRadiusGroup(ClosestTownFromTile(tile, (uint)-1), tile);
+ case 0x88: return GetTownRadiusGroup(industry->town, tile);
/* Manhattan distance of the closest town */
- case 0x89: return min(DistanceManhattan(ClosestTownFromTile(tile, (uint)-1)->xy, tile), 255);
+ case 0x89: return min(DistanceManhattan(industry->town->xy, tile), 255);
/* Lowest height of the tile */
case 0x8A: return GetTileZ(tile);
/* Distance to the nearest water/land tile */
- case 0x8B: return GetClosestWaterDistance(tile, (object->u.industry_location.spec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
+ case 0x8B: return GetClosestWaterDistance(tile, (GetIndustrySpec(industry->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
/* Square of Euclidian distance from town */
- case 0x8D: return min(DistanceSquare(ClosestTownFromTile(tile, (uint)-1)->xy, tile), 65535);
+ case 0x8D: return min(DistanceSquare(industry->town->xy, tile), 65535);
}
- DEBUG(grf, 1, "Unhandled location industry property 0x%X", variable);
-
- *available = false;
- return (uint32)-1;
+ /* None of the special ones, so try the general ones */
+ return IndustryGetVariable(object, variable, parameter, available);
}
bool CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uint itspec_index)
@@ -410,16 +440,23 @@
ResolverObject object;
const SpriteGroup *group;
- NewIndustryResolver(&object, tile, NULL);
+ Industry ind;
+ ind.index = INVALID_INDUSTRY;
+ ind.xy = tile;
+ ind.width = 0;
+ ind.type = type;
+ ind.selected_layout = itspec_index;
+ ind.town = ClosestTownFromTile(tile, (uint)-1);
+
+ NewIndustryResolver(&object, tile, &ind);
object.GetVariable = IndustryLocationGetVariable;
object.callback = CBID_INDUSTRY_LOCATION;
- object.u.industry_location.tile = tile;
- object.u.industry_location.spec = indspec;
- object.u.industry_location.itspec_index = itspec_index;
group = Resolve(GetIndustrySpec(type)->grf_prop.spritegroup, &object);
- if (group == NULL || group->type != SGT_CALLBACK) return false;
+ /* Unlike the "normal" cases, not having a valid result means we allow
+ * the building of the industry, as that's how it's done in TTDP. */
+ if (group == NULL || group->type != SGT_CALLBACK) return true;
switch (group->g.callback.result) {
case 0x400: return true;
@@ -457,13 +494,15 @@
*/
void IndustryProductionCallback(Industry *ind, int reason)
{
+ const IndustrySpec *spec = GetIndustrySpec(ind->type);
ResolverObject object;
NewIndustryResolver(&object, ind->xy, ind);
+ if ((spec->behaviour & INDUSTRYBEH_PRODCALLBACK_RANDOM) != 0) object.callback_param1 = Random();
object.callback_param2 = reason;
for (uint loop = 0;; loop++) {
SB(object.callback_param2, 8, 16, loop);
- const SpriteGroup *group = Resolve(GetIndustrySpec(ind->type)->grf_prop.spritegroup, &object);
+ const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
bool deref = (group->g.indprod.version == 1);
--- a/src/newgrf_industries.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industries.h Sat Oct 06 21:16:00 2007 +0000
@@ -8,10 +8,20 @@
#include "industry.h"
#include "newgrf_spritegroup.h"
+/** When should the industry(tile) be triggered for random bits? */
+enum IndustryTrigger {
+ /** Triggered each tile loop */
+ INDUSTRY_TRIGGER_TILELOOP_PROCESS = 1,
+ /** Triggered (whole industry) each 256 ticks */
+ INDUSTRY_TRIGGER_256_TICKS = 2,
+ /** Triggered on cargo delivery */
+ INDUSTRY_TRIGGER_CARGO_DELIVERY = 4,
+};
+
/* in newgrf_industry.cpp */
uint32 IndustryGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available);
uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile);
-uint32 GetIndustryIDAtOffset(TileIndex new_tile, TileIndex old_tile, const Industry *i);
+uint32 GetIndustryIDAtOffset(TileIndex new_tile, const Industry *i);
void IndustryProductionCallback(Industry *ind, int reason);
bool CheckIfCallBackAllowsCreation(TileIndex tile, IndustryType type, uint itspec_index);
bool CheckIfCallBackAllowsAvailability(IndustryType type, IndustryAvailabilityCallType creation_type);
@@ -19,10 +29,6 @@
IndustryType MapNewGRFIndustryType(IndustryType grf_type, uint32 grf_id);
/* in newgrf_industrytiles.cpp*/
-uint32 IndustryTileGetRandomBits(const ResolverObject *object);
-uint32 IndustryTileGetTriggers(const ResolverObject *object);
-void IndustryTileSetTriggers(const ResolverObject *object, int triggers);
-
uint32 GetNearbyIndustryTileInformation(byte parameter, TileIndex tile, IndustryID index);
#endif /* NEWGRF_INDUSTRIES_H */
--- a/src/newgrf_industrytiles.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industrytiles.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -39,7 +39,9 @@
is_same_industry = (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == index);
tile_type = GetTerrainType(tile) << 2 | (IsTileType(tile, MP_WATER) ? 1 : 0) << 1 | (is_same_industry ? 1 : 0);
- return GetTileType(tile) << 24 | (TileHeight(tile) * 8) << 16 | tile_type << 8 | GetTileSlope(tile, NULL);
+ uint z;
+ Slope tileh = GetTileSlope(tile, &z);
+ return GetTileType(tile) << 24 | z << 16 | tile_type << 8 | tileh;
}
/** This is the position of the tile relative to the northernmost tile of the industry.
@@ -97,7 +99,7 @@
}
/* Get industry tile ID at offset */
- case 0x62 : return GetIndustryIDAtOffset(GetNearbyTile(parameter, tile), tile, inds);
+ case 0x62 : return GetIndustryIDAtOffset(GetNearbyTile(parameter, tile), inds);
}
DEBUG(grf, 1, "Unhandled industry tile property 0x%X", variable);
@@ -112,22 +114,30 @@
return NULL;
}
-uint32 IndustryTileGetRandomBits(const ResolverObject *object)
+static uint32 IndustryTileGetRandomBits(const ResolverObject *object)
{
const TileIndex tile = object->u.industry.tile;
- return (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) ? 0 : GetIndustryRandomBits(tile);
+ if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
+ return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : 0; //GetIndustryByTile(tile)->random_bits;
}
-uint32 IndustryTileGetTriggers(const ResolverObject *object)
+static uint32 IndustryTileGetTriggers(const ResolverObject *object)
{
const TileIndex tile = object->u.industry.tile;
- return (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) ? 0 : GetIndustryTriggers(tile);
+ if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
+ return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : 0; //GetIndustryByTile(tile)->triggers;
}
-void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
+static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
{
const TileIndex tile = object->u.industry.tile;
- if (IsTileType(tile, MP_INDUSTRY)) SetIndustryTriggers(tile, triggers);
+ if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
+
+ if (object->scope != VSG_SCOPE_SELF) {
+ SetIndustryTriggers(tile, triggers);
+ } else {
+ //GetIndustryByTile(tile)->triggers = triggers;
+ }
}
static void NewIndustryTileResolver(ResolverObject *res, IndustryGfx gfx, TileIndex tile, Industry *indus)
@@ -138,6 +148,7 @@
res->GetVariable = IndustryTileGetVariable;
res->ResolveReal = IndustryTileResolveReal;
+ res->psa = &indus->psa;
res->u.industry.tile = tile;
res->u.industry.ind = indus;
res->u.industry.gfx = gfx;
@@ -158,14 +169,18 @@
SpriteID image = dts->ground_sprite;
SpriteID pal = dts->ground_pal;
+ if (IS_CUSTOM_SPRITE(image)) image += stage;
+
if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
foreach_draw_tile_seq(dtss, dts->seq) {
if (GB(dtss->image, 0, SPRITE_WIDTH) == 0) continue;
- image = dtss->image + stage;
+ image = dtss->image;
pal = dtss->pal;
+ if (IS_CUSTOM_SPRITE(image)) image += stage;
+
if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
pal = GENERAL_SPRITE_COLOR(rnd_color);
} else {
@@ -181,7 +196,7 @@
!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_INDUSTRIES)
);
} else {
- AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+ AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_INDUSTRIES));
}
}
}
@@ -232,18 +247,23 @@
}
}
-bool PerformIndustryTileSlopeCheck(TileIndex tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx)
+extern bool IsSlopeRefused(Slope current, Slope refused);
+
+bool PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind_tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx, uint itspec_index)
{
Industry ind;
- ind.xy = 0;
+ ind.index = INVALID_INDUSTRY;
+ ind.xy = ind_base_tile;
ind.width = 0;
ind.type = type;
- uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_SHAPE_CHECK, 0, 0, gfx, &ind, tile);
+ uint16 callback_res = GetIndustryTileCallback(CBID_INDTILE_SHAPE_CHECK, 0, itspec_index, gfx, &ind, ind_tile);
+ if (callback_res == CALLBACK_FAILED) {
+ return !IsSlopeRefused(GetTileSlope(ind_tile, NULL), its->slopes_refused);
+ }
if (its->grf_prop.grffile->grf_version < 7) {
return callback_res != 0;
}
- if (callback_res == CALLBACK_FAILED) return false;
switch (callback_res) {
case 0x400: return true;
@@ -347,8 +367,11 @@
uint32 random = Random();
BEGIN_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == ind->index) {
- ret &= StartStopIndustryTileAnimation(tile, iat, random);
- SB(random, 0, 16, Random());
+ if (StartStopIndustryTileAnimation(tile, iat, random)) {
+ SB(random, 0, 16, Random());
+ } else {
+ ret = false;
+ }
}
END_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
--- a/src/newgrf_industrytiles.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_industrytiles.h Sat Oct 06 21:16:00 2007 +0000
@@ -15,7 +15,7 @@
bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const IndustryTileSpec *inds);
uint16 GetIndustryTileCallback(CallbackID callback, uint32 param1, uint32 param2, IndustryGfx gfx_id, Industry *industry, TileIndex tile);
-bool PerformIndustryTileSlopeCheck(TileIndex tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx);
+bool PerformIndustryTileSlopeCheck(TileIndex ind_base_tile, TileIndex ind_tile, const IndustryTileSpec *its, IndustryType type, IndustryGfx gfx, uint itspec_index);
void AnimateNewIndustryTile(TileIndex tile);
bool StartStopIndustryTileAnimation(TileIndex tile, IndustryAnimationTrigger iat, uint32 random = Random());
--- a/src/newgrf_sound.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_sound.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -59,7 +59,7 @@
if (file == NULL) return false;
/* Check that the vehicle type uses the sound effect callback */
- if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_SOUND_EFFECT)) return false;
+ if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_SOUND_EFFECT)) return false;
callback = GetVehicleCallback(CBID_VEHICLE_SOUND_EFFECT, event, 0, v->engine_type, v);
if (callback == CALLBACK_FAILED) return false;
--- a/src/newgrf_spritegroup.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_spritegroup.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -76,7 +76,7 @@
_spritegroup_count = 0;
}
-uint32 _temp_store[0x110];
+TemporaryStorageArray<uint32, 0x110> _temp_store;
static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
@@ -98,7 +98,7 @@
case 0x1C: return object->last_value;
case 0x20: return _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
- case 0x7D: return _temp_store[parameter];
+ case 0x7D: return _temp_store.Get(parameter);
/* Not a common variable, so evalute the feature specific variables */
default: return object->GetVariable(object, variable, parameter, available);
@@ -106,10 +106,25 @@
}
+/**
+ * Rotate val rot times to the right
+ * @param val the value to rotate
+ * @param rot the amount of times to rotate
+ * @return the rotated value
+ */
+static uint32 RotateRight(uint32 val, uint32 rot)
+{
+ /* Do not rotate more than necessary */
+ rot %= 32;
+
+ return (val >> rot) | (val << (32 - rot));
+}
+
+
/* Evaluate an adjustment for a variable of the given size.
* U is the unsigned type and S is the signed type to use. */
template <typename U, typename S>
-static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, U last_value, uint32 value)
+static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ResolverObject *object, U last_value, uint32 value)
{
value >>= adjust->shift_num;
value &= adjust->and_mask;
@@ -137,10 +152,12 @@
case DSGA_OP_AND: return last_value & value;
case DSGA_OP_OR: return last_value | value;
case DSGA_OP_XOR: return last_value ^ value;
- case DSGA_OP_STO:
- if (value < lengthof(_temp_store)) _temp_store[value] = last_value;
- return last_value;
+ case DSGA_OP_STO: _temp_store.Store(value, last_value); return last_value;
case DSGA_OP_RST: return value;
+ case DSGA_OP_STOP: if (object->psa != NULL) object->psa->Store(value, last_value); return last_value;
+ case DSGA_OP_ROR: return RotateRight(last_value, value);
+ case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2);
+ case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2);
default: return value;
}
}
@@ -179,9 +196,9 @@
}
switch (group->g.determ.size) {
- case DSG_SIZE_BYTE: value = EvalAdjustT<uint8, int8>(adjust, last_value, value); break;
- case DSG_SIZE_WORD: value = EvalAdjustT<uint16, int16>(adjust, last_value, value); break;
- case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, last_value, value); break;
+ case DSG_SIZE_BYTE: value = EvalAdjustT<uint8, int8> (adjust, object, last_value, value); break;
+ case DSG_SIZE_WORD: value = EvalAdjustT<uint16, int16>(adjust, object, last_value, value); break;
+ case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, object, last_value, value); break;
default: NOT_REACHED(); break;
}
last_value = value;
@@ -192,7 +209,25 @@
if (group->g.determ.num_ranges == 0) {
/* nvar == 0 is a special case -- we turn our value into a callback result */
nvarzero.type = SGT_CALLBACK;
- nvarzero.g.callback.result = GB(value, 0, 15);
+ switch (object->callback) {
+ /* All these functions are 15 bit callbacks */
+ case CBID_VEHICLE_REFIT_CAPACITY:
+ case CBID_HOUSE_COLOUR:
+ case CBID_HOUSE_CARGO_ACCEPTANCE:
+ case CBID_INDUSTRY_LOCATION:
+ case CBID_INDTILE_CARGO_ACCEPTANCE:
+ case CBID_VEHICLE_COLOUR_MAPPING:
+ case CBID_HOUSE_PRODUCE_CARGO:
+ case CBID_VEHICLE_SOUND_EFFECT:
+ case CBID_SOUNDS_AMBIENT_EFFECT:
+ nvarzero.g.callback.result = GB(value, 0, 15);
+ break;
+
+ /* The rest is a 8 bit callback, which should be truncated properly */
+ default:
+ nvarzero.g.callback.result = GB(value, 0, 8);
+ break;
+ }
return &nvarzero;
}
--- a/src/newgrf_spritegroup.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_spritegroup.h Sat Oct 06 21:16:00 2007 +0000
@@ -7,6 +7,7 @@
#include "town.h"
#include "industry.h"
+#include "newgrf_storage.h"
/**
* Gets the value of a so-called newgrf "register".
@@ -16,9 +17,8 @@
*/
static inline uint32 GetRegister(uint i)
{
- assert(i < 0x110);
- extern uint32 _temp_store[0x110];
- return _temp_store[i];
+ extern TemporaryStorageArray<uint32, 0x110> _temp_store;
+ return _temp_store.Get(i);
}
struct SpriteGroup;
@@ -76,6 +76,10 @@
DSGA_OP_XOR, ///< a ^ b
DSGA_OP_STO, ///< store a into temporary storage, indexed by b. return a
DSGA_OP_RST, ///< return b
+ DSGA_OP_STOP, ///< store a into persistent storage, indexed by b, return a
+ DSGA_OP_ROR, ///< rotate a b positions to the right
+ DSGA_OP_SCMP, ///< (signed) comparision (a < b -> 0, a == b = 1, a > b = 2)
+ DSGA_OP_UCMP, ///< (unsigned) comparision (a < b -> 0, a == b = 1, a > b = 2)
};
@@ -199,6 +203,8 @@
bool info_view; ///< Indicates if the item is being drawn in an info window
+ BaseStorageArray *psa; ///< The persistent storage array of this resolved object.
+
union {
struct {
const struct Vehicle *self;
@@ -226,11 +232,6 @@
IndustryGfx gfx;
} industry;
struct {
- TileIndex tile;
- const IndustrySpec *spec;
- uint itspec_index;
- } industry_location;
- struct {
const struct CargoSpec *cs;
} cargo;
} u;
--- a/src/newgrf_station.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_station.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -752,7 +752,7 @@
relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE);
- if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+ if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE);
if (callback != CALLBACK_FAILED) tile = callback;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_storage.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,27 @@
+/* $Id$ */
+
+/** @file newgrf_storage.cpp Functionality related to the temporary and persistent storage arrays for NewGRFs. */
+
+#include "stdafx.h"
+#include "helpers.hpp"
+#include "newgrf_storage.h"
+#include <set>
+
+/** The changed storage arrays */
+static std::set<BaseStorageArray*> _changed_storage_arrays;
+
+void AddChangedStorage(BaseStorageArray *storage)
+{
+ _changed_storage_arrays.insert(storage);
+}
+
+void ClearStorageChanges(bool keep_changes)
+{
+ /* Loop over all changes arrays */
+ for (std::set<BaseStorageArray*>::iterator it = _changed_storage_arrays.begin(); it != _changed_storage_arrays.end(); it++) {
+ (*it)->ClearChanges(keep_changes);
+ }
+
+ /* And then clear that array */
+ _changed_storage_arrays.clear();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_storage.h Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,183 @@
+/* $Id$ */
+
+/** @file newgrf_storage.h Functionality related to the temporary and persistent storage arrays for NewGRFs. */
+
+#ifndef NEWGRF_STORAGE_H
+#define NEWGRF_STORAGE_H
+
+/**
+ * Base class for all NewGRF storage arrays. Nothing fancy, only here
+ * so we have a generalised class to use.
+ */
+struct BaseStorageArray
+{
+ /** The needed destructor */
+ virtual ~BaseStorageArray() {}
+
+ /**
+ * Clear the changes made since the last ClearChanges.
+ * This can be done in two ways:
+ * - saving the changes permanently
+ * - reverting to the previous version
+ * @param keep_changes do we save or revert the changes since the last ClearChanges?
+ */
+ virtual void ClearChanges(bool keep_changes) = 0;
+
+ /**
+ * Stores some value at a given position.
+ * @param pos the position to write at
+ * @param value the value to write
+ */
+ virtual void Store(uint pos, uint32 value) = 0;
+};
+
+/**
+ * Class for persistent storage of data.
+ * On ClearChanges that data is either reverted or saved.
+ * @param TYPE the type of variable to store.
+ * @param SIZE the size of the array.
+ */
+template <typename TYPE, uint SIZE>
+struct PersistentStorageArray : BaseStorageArray {
+ TYPE storage[SIZE]; ///< Memory to for the storage array
+ TYPE *prev_storage; ///< Memory to store "old" states so we can revert them on the performance of test cases for commands etc.
+
+ /** Simply construct the array */
+ PersistentStorageArray() : prev_storage(NULL)
+ {
+ memset(this->storage, 0, sizeof(this->storage));
+ }
+
+ /** And free all data related to it */
+ ~PersistentStorageArray()
+ {
+ free(this->prev_storage);
+ }
+
+ /**
+ * Stores some value at a given position.
+ * If there is no backup of the data that backup is made and then
+ * we write the data.
+ * @param pos the position to write at
+ * @param value the value to write
+ */
+ void Store(uint pos, uint32 value)
+ {
+ /* Out of the scope of the array */
+ if (pos >= SIZE) return;
+
+ /* The value hasn't changed, so we pretend nothing happened.
+ * Saves a few cycles and such and it's pretty easy to check. */
+ if (this->storage[pos] == value) return;
+
+ /* We do not have made a backup; lets do so */
+ if (this->prev_storage != NULL) {
+ this->prev_storage = MallocT<TYPE>(SIZE);
+ if (this->prev_storage == NULL) return;
+
+ memcpy(this->prev_storage, this->storage, sizeof(this->storage));
+
+ /* We only need to register ourselves when we made the backup
+ * as that is the only time something will have changed */
+ AddChangedStorage(this);
+ }
+
+ this->storage[pos] = value;
+ }
+
+ /**
+ * Gets the value from a given position.
+ * @param pos the position to get the data from
+ * @return the data from that position
+ */
+ TYPE Get(uint pos) const
+ {
+ /* Out of the scope of the array */
+ if (pos >= SIZE) return 0;
+
+ return this->storage[pos];
+ }
+
+ void ClearChanges(bool keep_changes)
+ {
+ assert(this->prev_storage != NULL);
+
+ if (!keep_changes) {
+ memcpy(this->storage, this->prev_storage, sizeof(this->storage));
+ }
+ free(this->prev_storage);
+ }
+};
+
+
+/**
+ * Class for temporary storage of data.
+ * On ClearChanges that data is always zero-ed.
+ * @param TYPE the type of variable to store.
+ * @param SIZE the size of the array.
+ */
+template <typename TYPE, uint SIZE>
+struct TemporaryStorageArray : BaseStorageArray {
+ TYPE storage[SIZE]; ///< Memory to for the storage array
+
+ /** Simply construct the array */
+ TemporaryStorageArray()
+ {
+ memset(this->storage, 0, sizeof(this->storage));
+ }
+
+ /**
+ * Stores some value at a given position.
+ * @param pos the position to write at
+ * @param value the value to write
+ */
+ void Store(uint pos, uint32 value)
+ {
+ /* Out of the scope of the array */
+ if (pos >= SIZE) return;
+
+ this->storage[pos] = value;
+ AddChangedStorage(this);
+ }
+
+ /**
+ * Gets the value from a given position.
+ * @param pos the position to get the data from
+ * @return the data from that position
+ */
+ TYPE Get(uint pos) const
+ {
+ /* Out of the scope of the array */
+ if (pos >= SIZE) return 0;
+
+ return this->storage[pos];
+ }
+
+ void ClearChanges(bool keep_changes)
+ {
+ memset(this->storage, 0, sizeof(this->storage));
+ }
+};
+
+/**
+ * Add the changed storage array to the list of changed arrays.
+ * This is done so we only have to revert/save the changed
+ * arrays, which saves quite a few clears, etc. after callbacks.
+ * @param storage the array that has changed
+ */
+void AddChangedStorage(BaseStorageArray *storage);
+
+
+/**
+ * Clear the changes made since the last ClearStorageChanges.
+ * This is done for *all* storages that have been registered to with
+ * AddChangedStorage since the previous ClearStorageChanges.
+ *
+ * This can be done in two ways:
+ * - saving the changes permanently
+ * - reverting to the previous version
+ * @param keep_changes do we save or revert the changes since the last ClearChanges?
+ */
+void ClearStorageChanges(bool keep_changes);
+
+#endif /* NEWGRF_STORAGE_H */
--- a/src/newgrf_text.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_text.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -21,6 +21,7 @@
#include "newgrf_text.h"
#include "table/control_codes.h"
#include "helpers.hpp"
+#include "date.h"
#define GRFTAB 28
#define TABSIZE 11
@@ -228,9 +229,9 @@
case 0x7B:
case 0x7C:
case 0x7D:
- case 0x7E: d += Utf8Encode(d, SCC_NUM); break;
- case 0x7F: d += Utf8Encode(d, SCC_CURRENCY); break;
- case 0x80: d += Utf8Encode(d, SCC_STRING); break;
+ case 0x7E:
+ case 0x7F:
+ case 0x80: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD + c - 0x7B); break;
case 0x81: {
StringID string;
string = *str++;
@@ -239,12 +240,12 @@
d += Utf8Encode(d, string);
break;
}
- case 0x82: d += Utf8Encode(d, SCC_DATE_TINY); break;
- case 0x83: d += Utf8Encode(d, SCC_DATE_SHORT); break;
- case 0x84: d += Utf8Encode(d, SCC_VELOCITY); break;
- case 0x85: d += Utf8Encode(d, SCC_SKIP); break;
- case 0x86: /* "Rotate down top 4 words on stack" */ break;
- case 0x87: d += Utf8Encode(d, SCC_VOLUME); break;
+ case 0x82:
+ case 0x83:
+ case 0x84: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_SPEED + c - 0x82); break;
+ case 0x85: d += Utf8Encode(d, SCC_NEWGRF_DISCARD_WORD); break;
+ case 0x86: d += Utf8Encode(d, SCC_NEWGRF_ROTATE_TOP_4_WORDS); break;
+ case 0x87: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_LITRES); break;
case 0x88: d += Utf8Encode(d, SCC_BLUE); break;
case 0x89: d += Utf8Encode(d, SCC_SILVER); break;
case 0x8A: d += Utf8Encode(d, SCC_GOLD); break;
@@ -262,6 +263,20 @@
case 0x96: d += Utf8Encode(d, SCC_GRAY); break;
case 0x97: d += Utf8Encode(d, SCC_DKBLUE); break;
case 0x98: d += Utf8Encode(d, SCC_BLACK); break;
+ case 0x9A:
+ switch (*str++) {
+ case 0: /* FALL THROUGH */
+ case 1: d += Utf8Encode(d, SCC_NEWGRF_PRINT_QWORD_CURRENCY); break;
+ case 3: {
+ uint16 tmp = *str++;
+ tmp |= (*str++) << 8;
+ d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD); d += Utf8Encode(d, tmp);
+ } break;
+ case 4: d += Utf8Encode(d, SCC_NEWGRF_UNPRINT); d += Utf8Encode(d, *str++); break;
+ default: grfmsg(1, "missing handler for extended format code"); break;
+ }
+ break;
+
case 0x9E: d += Utf8Encode(d, 0x20AC); break; // Euro
case 0x9F: d += Utf8Encode(d, 0x0178); break; // Y with diaeresis
case 0xA0: d += Utf8Encode(d, SCC_UPARROW); break;
@@ -481,3 +496,142 @@
_num_grf_texts = 0;
}
+
+struct TextRefStack {
+ byte stack[0x30];
+ byte position;
+ bool used;
+
+ TextRefStack() : used(false) {}
+
+ uint8 PopUnsignedByte() { assert(this->position < lengthof(this->stack)); return this->stack[this->position++]; }
+ int8 PopSignedByte() { return (int8)this->PopUnsignedByte(); }
+
+ uint16 PopUnsignedWord() { return this->PopUnsignedByte() | (((uint16)this->PopUnsignedByte()) << 8); }
+ int16 PopSignedWord() { return (int32)this->PopUnsignedWord(); }
+
+ uint32 PopUnsignedDWord() { return this->PopUnsignedWord() | (((uint32)this->PopUnsignedWord()) << 16); }
+ int32 PopSignedDWord() { return (int32)this->PopUnsignedDWord(); }
+
+ uint64 PopUnsignedQWord() { return this->PopUnsignedDWord() | (((uint64)this->PopUnsignedDWord()) << 32); }
+ int64 PopSignedQWord() { return (int64)this->PopUnsignedQWord(); }
+
+ /** Rotate the top four words down: W1, W2, W3, W4 -> W4, W1, W2, W3 */
+ void RotateTop4Words()
+ {
+ byte tmp[2];
+ for (int i = 0; i < 2; i++) tmp[i] = this->stack[this->position + i + 6];
+ for (int i = 5; i >= 0; i--) this->stack[this->position + i + 2] = this->stack[this->position + i];
+ for (int i = 0; i < 2; i++) this->stack[this->position + i] = tmp[i];
+ }
+
+ void PushWord(uint16 word)
+ {
+ if (this->position >= 2) {
+ this->position -= 2;
+ } else {
+ for (uint i = lengthof(stack) - 3; i >= this->position; i--) {
+ this->stack[this->position + 2] = this->stack[this->position];
+ }
+ }
+ this->stack[this->position] = GB(word, 0, 8);
+ this->stack[this->position + 1] = GB(word, 8, 8);
+ }
+
+ void ResetStack() { this->used = true; this->position = 0; }
+};
+
+/** The stack that is used for TTDP compatible string code parsing */
+static TextRefStack _newgrf_textrefstack;
+
+/** Prepare the TTDP compatible string code parsing */
+void PrepareTextRefStackUsage()
+{
+ extern TemporaryStorageArray<uint32, 0x110> _temp_store;
+
+ _newgrf_textrefstack.ResetStack();
+
+ byte *p = _newgrf_textrefstack.stack;
+ for (uint i = 0; i < 6; i++) {
+ for (uint j = 0; j < 32; j += 8) {
+ *p = GB(_temp_store.Get(0x100 + i), 32 - j, 8);
+ p++;
+ }
+ }
+}
+
+/** Stop using the TTDP compatible string code parsing */
+void StopTextRefStackUsage() { _newgrf_textrefstack.used = false; }
+
+/**
+ * FormatString for NewGRF specific "magic" string control codes
+ * @param scc the string control code that has been read
+ * @param stack the current "stack"
+ * @return the string control code to "execute" now
+ */
+uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv)
+{
+ if (_newgrf_textrefstack.used) {
+ switch (scc) {
+ default: NOT_REACHED();
+ case SCC_NEWGRF_PRINT_SIGNED_BYTE: *argv = _newgrf_textrefstack.PopSignedByte(); break;
+ case SCC_NEWGRF_PRINT_SIGNED_WORD: *argv = _newgrf_textrefstack.PopSignedWord(); break;
+ case SCC_NEWGRF_PRINT_QWORD_CURRENCY: *argv = _newgrf_textrefstack.PopUnsignedQWord(); break;
+
+ case SCC_NEWGRF_PRINT_DWORD_CURRENCY:
+ case SCC_NEWGRF_PRINT_DWORD: *argv = _newgrf_textrefstack.PopSignedDWord(); break;
+
+ case SCC_NEWGRF_PRINT_WORD_SPEED:
+ case SCC_NEWGRF_PRINT_WORD_LITRES:
+ case SCC_NEWGRF_PRINT_UNSIGNED_WORD: *argv = _newgrf_textrefstack.PopUnsignedWord(); break;
+
+ case SCC_NEWGRF_PRINT_DATE:
+ case SCC_NEWGRF_PRINT_MONTH_YEAR: *argv = _newgrf_textrefstack.PopSignedWord() + DAYS_TILL_ORIGINAL_BASE_YEAR; break;
+
+ case SCC_NEWGRF_DISCARD_WORD: _newgrf_textrefstack.PopUnsignedWord(); break;
+
+ case SCC_NEWGRF_ROTATE_TOP_4_WORDS: _newgrf_textrefstack.RotateTop4Words(); break;
+ case SCC_NEWGRF_PUSH_WORD: _newgrf_textrefstack.PushWord(Utf8Consume(str)); break;
+ case SCC_NEWGRF_UNPRINT: *buff -= Utf8Consume(str); break;
+
+ case SCC_NEWGRF_PRINT_STRING_ID:
+ *argv = _newgrf_textrefstack.PopUnsignedWord();
+ if (*argv == STR_NULL) *argv = STR_EMPTY;
+ break;
+ }
+ }
+
+ switch (scc) {
+ default: NOT_REACHED();
+ case SCC_NEWGRF_PRINT_DWORD:
+ case SCC_NEWGRF_PRINT_SIGNED_WORD:
+ case SCC_NEWGRF_PRINT_SIGNED_BYTE:
+ case SCC_NEWGRF_PRINT_UNSIGNED_WORD:
+ return SCC_NUM;
+
+ case SCC_NEWGRF_PRINT_DWORD_CURRENCY:
+ case SCC_NEWGRF_PRINT_QWORD_CURRENCY:
+ return SCC_CURRENCY;
+
+ case SCC_NEWGRF_PRINT_STRING_ID:
+ return SCC_STRING;
+
+ case SCC_NEWGRF_PRINT_DATE:
+ return SCC_DATE_LONG;
+
+ case SCC_NEWGRF_PRINT_MONTH_YEAR:
+ return SCC_DATE_TINY;
+
+ case SCC_NEWGRF_PRINT_WORD_SPEED:
+ return SCC_VELOCITY;
+
+ case SCC_NEWGRF_PRINT_WORD_LITRES:
+ return SCC_VOLUME;
+
+ case SCC_NEWGRF_DISCARD_WORD:
+ case SCC_NEWGRF_ROTATE_TOP_4_WORDS:
+ case SCC_NEWGRF_PUSH_WORD:
+ case SCC_NEWGRF_UNPRINT:
+ return 0;
+ }
+}
--- a/src/newgrf_text.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/newgrf_text.h Sat Oct 06 21:16:00 2007 +0000
@@ -15,4 +15,8 @@
bool CheckGrfLangID(byte lang_id, byte grf_version);
+void PrepareTextRefStackUsage();
+void StopTextRefStackUsage();
+uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 *argv);
+
#endif /* NEWGRF_TEXT_H */
--- a/src/news.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/news.h Sat Oct 06 21:16:00 2007 +0000
@@ -6,16 +6,16 @@
#define NEWS_H
struct NewsItem {
- StringID string_id;
- uint16 duration;
- Date date;
- byte flags;
- byte display_mode;
- byte type;
- byte callback;
+ StringID string_id; ///< Message text (sometimes also used for storing other info)
+ uint16 duration; ///< Remaining time for showing this news message
+ Date date; ///< Date of the news
+ byte flags; ///< NewsFlags bits @see NewsFlags
+ byte display_mode; ///< Display mode value @see NewsMode
+ byte type; ///< News category @see NewsType
+ byte callback; ///< Call-back function
- TileIndex data_a;
- TileIndex data_b;
+ TileIndex data_a; ///< Reference to tile or vehicle
+ TileIndex data_b; ///< Reference to second tile or vehicle
uint64 params[10];
};
@@ -24,7 +24,20 @@
typedef void DrawNewsCallbackProc(Window *w);
typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
+/**
+ * Macro for creating news flags.
+ * @param mode (bits 0 - 7) Display_mode, one of the NewsMode enums (NM_)
+ * @param flag (bits 8 - 15) OR-able news flags, any of the NewsFlags enums (NF_)
+ * @param type (bits 16-23) News category, one of the NewsType enums (NT_)
+ * @param cb (bits 24-31) Call-back function, one of the NewsCallback enums (DNC_) or 0 if no callback
+ * @see NewsMode
+ * @see NewsFlags
+ * @see NewsType
+ * @see NewsCallback
+ * @see AddNewsItem
+ */
#define NEWS_FLAGS(mode, flag, type, cb) ((cb) << 24 | (type) << 16 | (flag) << 8 | (mode))
+
void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
void NewsLoop();
void DrawNewsBorder(const Window *w);
@@ -32,23 +45,28 @@
VARDEF NewsItem _statusbar_news_item;
+/** Type of news. */
enum NewsType {
- NT_ARRIVAL_PLAYER,
- NT_ARRIVAL_OTHER,
- NT_ACCIDENT,
- NT_COMPANY_INFO,
- NT_OPENCLOSE,
- NT_ECONOMY,
- NT_ADVICE,
- NT_NEW_VEHICLES,
- NT_ACCEPTANCE,
- NT_SUBSIDIES,
- NT_GENERAL,
- NT_END,
+ NT_ARRIVAL_PLAYER, ///< Cargo arrived for player
+ NT_ARRIVAL_OTHER, ///< Cargo arrived for competitor
+ NT_ACCIDENT, ///< An accident or disaster has occurred
+ NT_COMPANY_INFO, ///< Company info (new companies, bankrupcy messages)
+ NT_OPENCLOSE, ///< Opening and closing of industries
+ NT_ECONOMY, ///< Economic changes (recession, industry up/dowm)
+ NT_ADVICE, ///< Bits of news about vehicles of the player
+ NT_NEW_VEHICLES, ///< New vehicle has become available
+ NT_ACCEPTANCE, ///< A type of cargo is (no longer) accepted
+ NT_SUBSIDIES, ///< News about subsidies (announcements, expirations, acceptance)
+ NT_GENERAL, ///< General news (from towns)
+ NT_END, ///< end-of-array marker
};
extern const char *_news_display_name[NT_END];
+/**
+ * News mode.
+ * @see NEWS_FLAGS
+ */
enum NewsMode {
NM_SMALL = 0, ///< Show only a small popup informing us about vehicle age for example
NM_NORMAL = 1, ///< Show a simple news message (height 170 pixels)
@@ -56,6 +74,11 @@
NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
};
+/**
+ * Various OR-able news-item flags.
+ * note: NF_INCOLOR is set automatically if needed
+ * @see NEWS_FLAGS
+ */
enum NewsFlags {
NF_VIEWPORT = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
NF_TILE = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
@@ -64,11 +87,13 @@
NF_INCOLOR = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
};
+/** Special news items */
enum NewsCallback {
DNC_VEHICLEAVAIL = 0, ///< Show new vehicle available message. StringID is EngineID
DNC_BANKRUPCY = 1, ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
};
+/** Kinds of bankrupcy */
enum NewsBankrupcy {
NB_BTROUBLE = (1 << 4), ///< Company is in trouble (warning)
NB_BMERGER = (2 << 4), ///< Company has been bought by another company
--- a/src/news_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/news_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1,6 +1,5 @@
/* $Id$ */
-/** @file news_gui.cpp */
#include "stdafx.h"
#include "openttd.h"
@@ -19,42 +18,50 @@
#include "date.h"
#include "string.h"
-/* News system
+/** @file news_gui.cpp
+ *
* News system is realized as a FIFO queue (in an array)
* The positions in the queue can't be rearranged, we only access
* the array elements through pointers to the elements. Once the
- * array is full, the oldest entry (_oldest_news) is being overwritten
- * by the newest (_latest news).
+ * array is full, the oldest entry (\a _oldest_news) is being overwritten
+ * by the newest (\a _latest_news).
*
+ * \verbatim
* oldest current lastest
* | | |
* [O------------F-------------C---------L ]
* |
* forced
+ * \endverbatim
*
* Of course by using an array we can have situations like
*
+ * \verbatim
* [----L O-----F---------C-----------------]
* This is where we have wrapped around the array and have
* (MAX_NEWS - O) + L news items
+ * \endverbatim
*/
+/** Number of news items in the FIFO queue */
#define MAX_NEWS 30
#define NB_WIDG_PER_SETTING 4
typedef byte NewsID;
#define INVALID_NEWS 255
-static NewsItem _news_items[MAX_NEWS];
-static NewsID _current_news = INVALID_NEWS; // points to news item that should be shown next
-static NewsID _oldest_news = 0; // points to first item in fifo queue
-static NewsID _latest_news = INVALID_NEWS; // points to last item in fifo queue
-/* if the message being shown was forced by the user, its index is stored in
- * _forced_news. forced_news is INVALID_NEWS otherwise.
- * (Users can force messages through history or "last message") */
+static NewsItem _news_items[MAX_NEWS]; ///< The news FIFO queue
+static NewsID _current_news = INVALID_NEWS; ///< points to news item that should be shown next
+static NewsID _oldest_news = 0; ///< points to first item in fifo queue
+static NewsID _latest_news = INVALID_NEWS; ///< points to last item in fifo queue
+
+/** Forced news item.
+ * Users can force an item by accessing the history or "last message".
+ * If the message being shown was forced by the user, its index is stored in
+ * _forced_news. Otherwise, \a _forced_news variable is INVALID_NEWS. */
static NewsID _forced_news = INVALID_NEWS;
-static byte _total_news = 0; // total news count
+static byte _total_news = 0; ///< Number of news items in FIFO queue @see _news_items
void DrawNewsNewVehicleAvail(Window *w);
void DrawNewsBankrupcy(Window *w);
@@ -64,8 +71,8 @@
StringID GetNewsStringBankrupcy(const NewsItem *ni);
static DrawNewsCallbackProc * const _draw_news_callback[] = {
- DrawNewsNewVehicleAvail, //< DNC_VEHICLEAVAIL
- DrawNewsBankrupcy, //< DNC_BANKRUPCY
+ DrawNewsNewVehicleAvail, ///< DNC_VEHICLEAVAIL
+ DrawNewsBankrupcy, ///< DNC_BANKRUPCY
};
extern GetNewsStringCallbackProc * const _get_news_string_callback[];
@@ -74,6 +81,7 @@
GetNewsStringBankrupcy, ///< DNC_BANKRUPCY
};
+/** Initialize the news-items data structures */
void InitNewsItemStructs()
{
memset(_news_items, 0, sizeof(_news_items));
@@ -219,42 +227,52 @@
}
}
-/** Return the correct index in the pseudo-fifo
- * queue and deals with overflows when increasing the index */
+/**
+ * Return the correct index in the pseudo-fifo
+ * queue and deals with overflows when increasing the index
+ */
static inline NewsID increaseIndex(NewsID i)
{
assert(i != INVALID_NEWS);
return (i + 1) % MAX_NEWS;
}
-/** Return the correct index in the pseudo-fifo
- * queue and deals with overflows when decreasing the index */
+/**
+ * Return the correct index in the pseudo-fifo
+ * queue and deals with overflows when decreasing the index
+ */
static inline NewsID decreaseIndex(NewsID i)
{
assert(i != INVALID_NEWS);
return (i + MAX_NEWS - 1) % MAX_NEWS;
}
-/** Add a new newsitem to be shown.
- * @param string String to display, can have special values based on parameter 'flags'
+/**
+ * Add a new newsitem to be shown.
+ * @param string String to display, can have special values based on parameter \a flags
* @param flags various control bits that will show various news-types. See macro NEWS_FLAGS()
* @param data_a news-specific value based on news type
* @param data_b news-specific value based on news type
* @note flags exists of 4 byte-sized extra parameters.
- * 1. 0 - 7 display_mode, any of the NewsMode enums (NM_)
- * 2. 8 - 15 news flags, any of the NewsFlags enums (NF_) NF_INCOLOR are set automatically if needed
- * 3. 16 - 23 news category, any of the NewsType enums (NT_)
- * 4. 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
- * If the display mode is NM_CALLBACK special news is shown and parameter
- * stringid has a special meaning.
- * DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL: StringID is
- * the index of the engine that is shown
- * DNC_BANKRUPCY: bytes 0-3 of StringID contains the player that is in trouble,
- * and 4-7 contains what kind of bankrupcy message is shown, NewsBankrupcy enum (NB_)
+ * -# Bits 0 - 7 display_mode, any of the NewsMode enums (NM_)
+ * -# Bits 8 - 15 news flags, any of the NewsFlags enums (NF_)
+ * -# Bits 16 - 23 news category, any of the NewsType enums (NT_)
+ * -# Bits 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
+ *
+ * If the display mode is NM_CALLBACK, special news is shown and parameter
+ * \a string has a special meaning.
+ * - For DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL messages: StringID is
+ * the index of the engine that is shown
+ *
+ * - For DNC_BANKRUPCY: bytes 0-3 of StringID contains the player that is in trouble,
+ * and 4-7 contains what kind of bankrupcy message is shown.
+ * @see NewsBankrupcy
+ *
* @see NewsMode
* @see NewsFlags
* @see NewsType
- * @see NewsCallback */
+ * @see NewsCallback
+ */
void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
{
NewsID l_news;
@@ -310,8 +328,25 @@
}
-/* Don't show item if it's older than x days, corresponds with NewsType in news.h */
-static const byte _news_items_age[] = {60, 60, 90, 60, 90, 30, 150, 30, 90, 180};
+/**
+ * Maximum age of news items.
+ * Don't show item if it's older than x days, corresponds with NewsType in news.h
+ * @see NewsType
+ */
+static const byte _news_items_age[NT_END] = {
+ 60, ///< NT_ARRIVAL_PLAYER
+ 60, ///< NT_ARRIVAL_OTHER
+ 90, ///< NT_ACCIDENT
+ 60, ///< NT_COMPANY_INFO
+ 90, ///< NT_OPENCLOSE
+ 30, ///< NT_ECONOMY
+ 150, ///< NT_ADVICE
+ 30, ///< NT_NEW_VEHICLES
+ 90, ///< NT_ACCEPTANCE
+ 180, ///< NT_SUBSIDIES
+ 60 ///< NT_GENERAL
+};
+
static const Widget _news_type13_widgets[] = {
{ WWT_PANEL, RESIZE_NONE, 15, 0, 429, 0, 169, 0x0, STR_NULL},
@@ -385,7 +420,8 @@
"general",
};
-/** Get the value of an item of the news-display settings. This is
+/**
+ * Get the value of an item of the news-display settings. This is
* a little tricky since on/off/summary must use 2 bits to store the value
* @param item the item whose value is requested
* @return return the found value which is between 0-2
@@ -396,7 +432,8 @@
return GB(_news_display_opt, item * 2, 2);
}
-/** Set the value of an item in the news-display settings. This is
+/**
+ * Set the value of an item in the news-display settings. This is
* a little tricky since on/off/summary must use 2 bits to store the value
* @param item the item whose value is being set
* @param val new value
@@ -407,7 +444,7 @@
SB(_news_display_opt, item * 2, 2, val);
}
-/* open up an own newspaper window for the news item */
+/** Open up an own newspaper window for the news item */
static void ShowNewspaper(NewsItem *ni)
{
Window *w;
@@ -457,7 +494,7 @@
w->flags4 |= WF_DISABLE_VP_SCROLL;
}
-/* show news item in the ticker */
+/** Show news item in the ticker */
static void ShowTicker(const NewsItem *ni)
{
Window *w;
@@ -470,8 +507,10 @@
}
-/** Are we ready to show another news item?
- * Only if nothing is in the newsticker and no newspaper is displayed */
+/**
+ * Are we ready to show another news item?
+ * Only if nothing is in the newsticker and no newspaper is displayed
+ */
static bool ReadyForNextItem()
{
const Window *w;
@@ -493,6 +532,7 @@
return (ni->duration == 0 || FindWindowById(WC_NEWS_WINDOW, 0) == NULL);
}
+/** Move to the next news item */
static void MoveToNextItem()
{
DeleteWindowById(WC_NEWS_WINDOW, 0);
@@ -509,26 +549,27 @@
if (_date - _news_items_age[ni->type] > ni->date) return;
switch (GetNewsDisplayValue(ni->type)) {
- case 0: { // Off - show nothing only a small reminder in the status bar
- Window *w = FindWindowById(WC_STATUS_BAR, 0);
+ default: NOT_REACHED();
+ case 0: { // Off - show nothing only a small reminder in the status bar
+ Window *w = FindWindowById(WC_STATUS_BAR, 0);
- if (w != NULL) {
- WP(w, def_d).data_2 = 91;
- SetWindowDirty(w);
- }
- break;
- }
-
- case 1: // Summary - show ticker, but if forced big, cascade to full
- if (!(ni->flags & NF_FORCE_BIG)) {
- ShowTicker(ni);
+ if (w != NULL) {
+ WP(w, def_d).data_2 = 91;
+ SetWindowDirty(w);
+ }
break;
}
- /* Fallthrough */
- case 2: // Full - show newspaper
- ShowNewspaper(ni);
- break;
+ case 1: // Summary - show ticker, but if forced big, cascade to full
+ if (!(ni->flags & NF_FORCE_BIG)) {
+ ShowTicker(ni);
+ break;
+ }
+ /* Fallthrough */
+
+ case 2: // Full - show newspaper
+ ShowNewspaper(ni);
+ break;
}
}
}
@@ -541,7 +582,7 @@
if (ReadyForNextItem()) MoveToNextItem();
}
-/* Do a forced show of a specific message */
+/** Do a forced show of a specific message */
static void ShowNewsMessage(NewsID i)
{
if (_total_news == 0) return;
@@ -561,6 +602,7 @@
}
}
+/** Show previous news item */
void ShowLastNewsMessage()
{
if (_forced_news == INVALID_NEWS) {
@@ -594,7 +636,8 @@
return i;
}
-/** Draw an unformatted news message truncated to a maximum length. If
+/**
+ * Draw an unformatted news message truncated to a maximum length. If
* length exceeds maximum length it will be postfixed by '...'
* @param x,y position of the string
* @param color the color the string will be shown in
@@ -707,6 +750,7 @@
MessageHistoryWndProc
};
+/** Display window with news messages history */
void ShowMessageHistory()
{
Window *w;
@@ -733,7 +777,8 @@
WIDGET_NEWSOPT_START_OPTION = 9, ///< First widget that is part of a group [<] .. [.]
};
-/** Setup the disabled/enabled buttons in the message window
+/**
+ * Setup the disabled/enabled buttons in the message window
* If the value is 'off' disable the [<] widget, and enable the [>] one
* Same-wise for all the others. Starting value of 4 is the first widget
* group. These are grouped as [<][>] .. [<][>], etc.
--- a/src/oldloader.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/oldloader.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1175,7 +1175,7 @@
OCL_END()
};
-static bool LoadOldVehicle(LoadgameState *ls, int num)
+bool LoadOldVehicle(LoadgameState *ls, int num)
{
uint i;
@@ -1206,7 +1206,7 @@
default: v->spritenum >>= 1; break;
}
- if (_old_next_ptr != 0xFFFF) v->SetNext(GetVehicle(_old_next_ptr));
+ if (_old_next_ptr != 0xFFFF) v->next = GetVehicle(_old_next_ptr);
v->string_id = RemapOldStringID(_old_string_id);
--- a/src/openttd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/openttd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -61,6 +61,7 @@
#include "newgrf_config.h"
#include "newgrf_house.h"
#include "newgrf_commons.h"
+#include "newgrf_storage.h"
#include "player_face.h"
#include "group.h"
#include "blitter/factory.hpp"
@@ -90,8 +91,6 @@
extern void ShowOSErrorBox(const char *buf);
extern void SetDefaultRailGui();
-const char *_default_blitter = "8bpp-optimized";
-
/* TODO: usrerror() for errors which are not of an internal nature but
* caused by the user, i.e. missing files or fatal configuration errors.
* Post-0.4.0 since Celestar doesn't want this in SVN before. --pasky */
@@ -472,7 +471,7 @@
if (!StrEmpty(musicdriver)) ttd_strlcpy(_ini_musicdriver, musicdriver, sizeof(_ini_musicdriver));
if (!StrEmpty(sounddriver)) ttd_strlcpy(_ini_sounddriver, sounddriver, sizeof(_ini_sounddriver));
if (!StrEmpty(videodriver)) ttd_strlcpy(_ini_videodriver, videodriver, sizeof(_ini_videodriver));
- if (StrEmpty(blitter)) ttd_strlcpy(blitter, _default_blitter, sizeof(blitter));
+ if (!StrEmpty(blitter)) ttd_strlcpy(_ini_blitter, blitter, sizeof(_ini_blitter));
if (resolution[0] != 0) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; }
if (startyear != INVALID_YEAR) _patches_newgame.starting_year = startyear;
if (generation_seed != GENERATE_NEW_SEED) _patches_newgame.generation_seed = generation_seed;
@@ -514,9 +513,11 @@
/* Initialize game palette */
GfxInitPalettes();
- DEBUG(misc, 1, "Loading blitter '%s'...", blitter);
- if (BlitterFactoryBase::SelectBlitter(blitter) == NULL)
- error("Failed to select requested blitter '%s'; does it exist?", blitter);
+ DEBUG(misc, 1, "Loading blitter...");
+ if (BlitterFactoryBase::SelectBlitter(_ini_blitter) == NULL)
+ StrEmpty(_ini_blitter) ?
+ error("Failed to autoprobe blitter") :
+ error("Failed to select requested blitter '%s'; does it exist?", _ini_blitter);
DEBUG(driver, 1, "Loading drivers...");
@@ -972,6 +973,8 @@
* That check is enforced in DoCommand. */
void StateGameLoop()
{
+ ClearStorageChanges(false);
+
/* dont execute the state loop during pause */
if (_pause_game) return;
if (IsGeneratingWorld()) return;
@@ -1242,25 +1245,25 @@
const FSMportsSpec *fsmportspec = GetCustomFSMportsSpecByGrf(grfid, localidx);
int fsmportspecindex = AllocateFSMportsSpecToStation(fsmportspec, st, true);
- if (grfid != 0x4450414F || localidx != 3) { //skip oilrigs, but otherwise makeairport
+ if (grfid != 0x4450414F || localidx != 3) { // Skip oilrigs, but otherwise makeairport
/* find layout tiletype corresponding to location on airport */
TileIndexDiffC tile_offset = TileIndexToTileIndexDiffC(tile, st->airport_tile);
- int w = fsmportspec->size_x[0]; //old airports are always 0th graphics set orientation... ie NE
+ int w = fsmportspec->size_x[0]; // Old airports are always 0th graphics set orientation... ie NE
const byte *layout_ptr = fsmportspec->layouts[0];
- st->FSMport_orientation = *layout_ptr++; //orientation
- layout_ptr++; //skip minipic ID
+ st->FSMport_orientation = *layout_ptr++; // Orientation
+ layout_ptr++; // Skip minipic ID
for (byte skip = 0; skip < (tile_offset.y * w + tile_offset.x); skip++) {
- layout_ptr++; //skip to the correct layout tiletype
+ layout_ptr++; // Skip to the correct layout tiletype
}
- /* replace the savegame layout tiletype with the newgrf one */
+ /* Replace the savegame layout tiletype with the newgrf one */
MakeAirport(tile, st->owner, st->index, *layout_ptr);
- /*set top bit of m6 to indicate an fsmportsspec */
+ /* Set top bit of m6 to indicate an fsmportsspec */
SetCustomFSMportsSpecIndex(tile, fsmportspecindex);
} else {
- /* Oilrigs must be set against their root tile, not the tile of the landing pad */
- /*set top bit of m6 to indicate an fsmportsspec */
+ /* Oilrigs must be set against their root tile, not the tile of the landing pad
+ * set top bit of m6 to indicate an fsmportsspec */
SetCustomFSMportsSpecIndex(st->xy, fsmportspecindex);
}
}
@@ -2220,6 +2223,20 @@
}
}
+ if (CheckSavegameVersion(78)) {
+ Industry *i;
+ uint j;
+ FOR_ALL_INDUSTRIES(i) {
+ const IndustrySpec *indsp = GetIndustrySpec(i->type);
+ for (j = 0; j < lengthof(i->produced_cargo); j++) {
+ i->produced_cargo[j] = indsp->produced_cargo[j];
+ }
+ for (j = 0; j < lengthof(i->accepts_cargo); j++) {
+ i->accepts_cargo[j] = indsp->accepts_cargo[j];
+ }
+ }
+ }
+
UpdateAllWaypointSigns();
UpdateAllStationVirtCoord();
--- a/src/order.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order.h Sat Oct 06 21:16:00 2007 +0000
@@ -116,18 +116,18 @@
void FreeChain();
};
-#define MAX_BACKUP_ORDER_COUNT 40
+struct BackuppedOrders {
+ BackuppedOrders() : order(NULL) { }
-struct BackuppedOrders {
VehicleID clone;
VehicleOrderID orderindex;
- Order order[MAX_BACKUP_ORDER_COUNT + 1];
+ Order *order;
uint16 service_interval;
char name[32];
};
VARDEF TileIndex _backup_orders_tile;
-VARDEF BackuppedOrders _backup_orders_data[1];
+VARDEF BackuppedOrders _backup_orders_data;
static inline VehicleOrderID GetMaxOrderIndex()
{
@@ -200,8 +200,8 @@
}
/* Functions */
-void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order);
-void RestoreVehicleOrders(const Vehicle* v, const BackuppedOrders* order);
+void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order = &_backup_orders_data);
+void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *order = &_backup_orders_data);
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination);
void InvalidateVehicleOrder(const Vehicle *v);
bool VehicleHasDepotOrders(const Vehicle *v);
--- a/src/order_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -19,6 +19,7 @@
#include "vehicle_gui.h"
#include "cargotype.h"
#include "strings.h"
+#include "aircraft.h"
DEFINE_OLD_POOL_GENERIC(Order, Order)
@@ -198,7 +199,9 @@
break;
case VEH_AIRCRAFT:
- if (!(st->facilities & FACIL_AIRPORT)) return CMD_ERROR;
+ if (!(st->facilities & FACIL_AIRPORT) || !CanAircraftUseStation(v->engine_type, st)) {
+ return CMD_ERROR;
+ }
break;
default: return CMD_ERROR;
@@ -239,7 +242,8 @@
if (!CheckOwnership(st->owner) ||
!(st->facilities & FACIL_AIRPORT) ||
- st->Airport()->num_depots == 0) {
+ st->Airport()->num_depots == 0 ||
+ !CanAircraftUseStation(v->engine_type, st)) {
return CMD_ERROR;
}
} else {
@@ -317,10 +321,6 @@
if (!HasOrderPoolFree(1)) return_cmd_error(STR_8831_NO_MORE_SPACE_FOR_ORDERS);
- /* XXX - This limit is only here because the backuppedorders can't
- * handle any more then this.. */
- if (v->num_orders >= MAX_BACKUP_ORDER_COUNT) return_cmd_error(STR_8832_TOO_MANY_ORDERS);
-
if (v->type == VEH_SHIP &&
IsHumanPlayer(v->owner) &&
!_patches.new_pathfinding_all) {
@@ -920,6 +920,10 @@
*/
void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *bak)
{
+ /* Make sure we always have freed the stuff */
+ free(bak->order);
+ bak->order = NULL;
+
/* Save general info */
bak->orderindex = v->cur_order_index;
bak->service_interval = v->service_interval;
@@ -939,13 +943,21 @@
bak->clone = u->index;
} else {
/* Else copy the orders */
- Order *order, *dest;
-
- dest = bak->order;
/* We do not have shared orders */
bak->clone = INVALID_VEHICLE;
+
+ /* Count the number of orders */
+ uint cnt = 0;
+ const Order *order;
+ FOR_VEHICLE_ORDERS(v, order) cnt++;
+
+ /* Allocate memory for the orders plus an end-of-orders marker */
+ bak->order = MallocT<Order>(cnt + 1);
+
+ Order *dest = bak->order;
+
/* Copy the orders */
FOR_VEHICLE_ORDERS(v, order) {
*dest = *order;
@@ -961,12 +973,10 @@
* Restore vehicle orders that are backupped via BackupVehicleOrders
*
*/
-void RestoreVehicleOrders(const Vehicle* v, const BackuppedOrders* bak)
+void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *bak)
{
- uint i;
-
/* If we have a custom name, process that */
- if (bak->name[0] != 0) {
+ if (!StrEmpty(bak->name)) {
_cmd_text = bak->name;
DoCommandP(0, v->index, 0, NULL, CMD_NAME_VEHICLE);
}
@@ -981,7 +991,7 @@
* order number is one more than the current amount of orders, and because
* in network the commands are queued before send, the second insert always
* fails in test mode. By bypassing the test-mode, that no longer is a problem. */
- for (i = 0; bak->order[i].IsValid(); i++) {
+ for (uint i = 0; bak->order[i].IsValid(); i++) {
if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK))
break;
}
@@ -1032,7 +1042,7 @@
switch (v->type) {
default: NOT_REACHED();
case VEH_TRAIN: return st->train_tile;
- case VEH_AIRCRAFT: return st->airport_tile;
+ case VEH_AIRCRAFT: return CanAircraftUseStation(v->engine_type, st) ? st->airport_tile : 0;
case VEH_SHIP: return st->dock_tile;
case VEH_ROAD:
if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) {
--- a/src/order_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/order_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -355,7 +355,7 @@
{
if (u->type != v->type) return false;
- if (u->HasFront() && !u->IsPrimaryVehicle()) {
+ if (!u->IsPrimaryVehicle()) {
u = u->First();
if (!u->IsPrimaryVehicle()) return false;
}
--- a/src/ottdres.rc Thu Sep 06 19:42:48 2007 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-//Microsoft Developer Studio generated resource script.
-//
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "resource.h"
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-#ifdef MSVC
-#include "winres.h"
-#else
-#include "afxres.h"
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// Neutral (Default) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD)
-#ifdef _WIN32
-LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-100 ICON DISCARDABLE "../media/openttd.ico"
-101 ICON DISCARDABLE "../media/mainicon.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-100 DIALOG DISCARDABLE 0, 0, 305, 77
-STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Fatal Application Failure"
-FONT 8, "MS Sans Serif"
-BEGIN
- PUSHBUTTON "&Close",12,7,58,50,14
- PUSHBUTTON "&Submit report",14,81,58,68,14,WS_DISABLED
- PUSHBUTTON "&Emergency save",13,155,58,68,14
- PUSHBUTTON "",15,243,58,55,14
- EDITTEXT 11,7,79,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL |
- WS_HSCROLL | NOT WS_TABSTOP
- LTEXT "",10,36,7,262,43
- ICON 100,IDC_STATIC,9,9,20,20
-END
-
-
-#ifndef _MAC
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,5,99,0
- PRODUCTVERSION 0,5,99,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "000004b0"
- BEGIN
- VALUE "Comments", "This program is licensed under the GNU General Public License.\0"
- VALUE "CompanyName", "OpenTTD Development Team\0"
- VALUE "FileDescription", "OpenTTD\0"
- VALUE "FileVersion", "Development Version\0"
- VALUE "InternalName", "openttd\0"
- VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2007. All Rights Reserved.\0"
- VALUE "LegalTrademarks", "\0"
- VALUE "OriginalFilename", "openttd.exe\0"
- VALUE "PrivateBuild", "\0"
- VALUE "ProductName", "OpenTTD\0"
- VALUE "ProductVersion", "Development Version\0"
- VALUE "SpecialBuild", "-\0"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x0, 1200
- END
-END
-
-#endif // !_MAC
-
-#endif // Neutral (Default) resources
-/////////////////////////////////////////////////////////////////////////////
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ottdres.rc.in Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,107 @@
+//Microsoft Developer Studio generated resource script.
+//
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#ifdef MSVC
+#include "winres.h"
+#else
+#include "afxres.h"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Neutral (Default) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD)
+#ifdef _WIN32
+LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+100 ICON DISCARDABLE "../media/openttd.ico"
+101 ICON DISCARDABLE "../media/mainicon.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+100 DIALOG DISCARDABLE 0, 0, 305, 77
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Fatal Application Failure"
+FONT 8, "MS Sans Serif"
+BEGIN
+ PUSHBUTTON "&Close",12,7,58,50,14
+ PUSHBUTTON "&Submit report",14,81,58,68,14,WS_DISABLED
+ PUSHBUTTON "&Emergency save",13,155,58,68,14
+ PUSHBUTTON "",15,243,58,55,14
+ EDITTEXT 11,7,79,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL |
+ WS_HSCROLL | NOT WS_TABSTOP
+ LTEXT "",10,36,7,262,43
+ ICON 100,IDC_STATIC,9,9,20,20
+END
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,5,99,0
+ PRODUCTVERSION 0,5,99,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "Comments", "This program is licensed under the GNU General Public License.\0"
+ VALUE "CompanyName", "OpenTTD Development Team\0"
+ VALUE "FileDescription", "OpenTTD\0"
+ VALUE "FileVersion", "Development @@VERSION@@\0"
+ VALUE "InternalName", "openttd\0"
+ VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2007. All Rights Reserved.\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "openttd.exe\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "OpenTTD\0"
+ VALUE "ProductVersion", "Development @@VERSION@@\0"
+ VALUE "SpecialBuild", "-\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
+
+#endif // !_MAC
+
+#endif // Neutral (Default) resources
+/////////////////////////////////////////////////////////////////////////////
--- a/src/player_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/player_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -834,7 +834,7 @@
break;
case WE_PLACE_OBJ:
- if (DoCommandP(e->we.place.tile, 0, 0, NULL, CMD_BUILD_COMPANY_HQ | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS)))
+ if (DoCommandP(e->we.place.tile, 0, 0, NULL, CMD_BUILD_COMPANY_HQ | CMD_NO_WATER | CMD_MSG(STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS)))
ResetObjectToPlace();
w->widget[PCW_WIDGET_BUILD_VIEW_HQ].type = WWT_PUSHTXTBTN; // this button can now behave as a normal push button
RaiseWindowButtons(w);
--- a/src/rail.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail.h Sat Oct 06 21:16:00 2007 +0000
@@ -778,6 +778,7 @@
return bits != TRACK_BIT_HORZ && bits != TRACK_BIT_VERT;
}
+void *UpdateTrainPowerProc(Vehicle *v, void *data);
void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
@@ -787,6 +788,7 @@
* @see DrawCatenaryRailway
*/
void DrawCatenary(const TileInfo *ti);
+void DrawCatenaryOnTunnel(const TileInfo *ti);
Foundation GetRailFoundation(Slope tileh, TrackBits bits);
--- a/src/rail_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -34,10 +34,12 @@
#include "railtypes.h" // include table for railtypes
#include "newgrf.h"
#include "yapf/yapf.h"
+#include "newgrf_engine.h"
#include "newgrf_callbacks.h"
#include "newgrf_station.h"
#include "train.h"
#include "misc/autoptr.hpp"
+#include "autoslope.h"
const byte _track_sloped_sprites[14] = {
14, 15, 22, 13,
@@ -218,8 +220,11 @@
{
if (IsSteepSlope(tileh)) {
if (_patches.build_on_slopes && existing == 0) {
- TrackBits valid = TRACK_BIT_CROSS | (HASBIT(1 << SLOPE_STEEP_W | 1 << SLOPE_STEEP_E, tileh) ? TRACK_BIT_VERT : TRACK_BIT_HORZ);
- if (valid & rail_bits) return _price.terraform;
+ /* There may only be one track on steep slopes. (Autoslope calls with multiple bits in rail_bits) */
+ if (KILL_FIRST_BIT(rail_bits & TRACK_BIT_MASK) == 0) {
+ TrackBits valid = TRACK_BIT_CROSS | (HASBIT(1 << SLOPE_STEEP_W | 1 << SLOPE_STEEP_E, tileh) ? TRACK_BIT_VERT : TRACK_BIT_HORZ);
+ if (valid & rail_bits) return _price.terraform;
+ }
}
} else {
rail_bits |= existing;
@@ -1024,6 +1029,18 @@
typedef CommandCost DoConvertRailProc(TileIndex tile, RailType totype, bool exec);
+void *UpdateTrainPowerProc(Vehicle *v, void *data)
+{
+ /* Similiar checks as in TrainPowerChanged() */
+
+ if (v->type == VEH_TRAIN && v->tile == *(TileIndex*)data && !IsArticulatedPart(v)) {
+ const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
+ if (GetVehicleProperty(v, 0x0B, rvi->power) != 0) TrainPowerChanged(v->First());
+ }
+
+ return NULL;
+}
+
/**
* Switches the rail type.
* Railtypes are stored on a per-tile basis, not on a per-track basis, so
@@ -1036,15 +1053,6 @@
*/
static CommandCost DoConvertRail(TileIndex tile, RailType totype, bool exec)
{
- if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
- if (GetRailType(tile) == totype) return CMD_ERROR;
-
- if (!EnsureNoVehicleOnGround(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR;
-
- /* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
- if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
/* change type. */
if (exec) {
SetRailType(tile, totype);
@@ -1057,18 +1065,13 @@
}
if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
- Vehicle *v;
-
/* Update build vehicle window related to this depot */
+ InvalidateWindowData(WC_VEHICLE_DEPOT, tile);
InvalidateWindowData(WC_BUILD_VEHICLE, tile);
+ }
- /* update power of trains in this depot */
- FOR_ALL_VEHICLES(v) {
- if (v->type == VEH_TRAIN && IsFrontEngine(v) && v->tile == tile && v->u.rail.track == 0x80) {
- TrainPowerChanged(v);
- }
- }
- }
+ /* update power of train engines on this tile */
+ VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
}
return CommandCost(_price.build_rail / 2);
@@ -1111,7 +1114,8 @@
for (x = sx; x <= ex; ++x) {
for (y = sy; y <= ey; ++y) {
TileIndex tile = TileXY(x, y);
- DoConvertRailProc* proc;
+ DoConvertRailProc *proc;
+ RailType totype = (RailType)p2;
switch (GetTileType(tile)) {
case MP_RAILWAY: proc = DoConvertRail; break;
@@ -1121,7 +1125,22 @@
default: continue;
}
- ret = proc(tile, (RailType)p2, false);
+ /* It is possible that 'type' is invalid when there is no rail on the tile,
+ * but this situation will be detected in proc()
+ */
+ RailType type = GetRailType(tile);
+
+ /* Not own tile or track is already converted */
+ if ((!CheckTileOwnership(tile) || type == totype) ||
+ /* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
+ (_patches.disable_elrails && totype == RAILTYPE_RAIL && type == RAILTYPE_ELECTRIC) ||
+ /* Vehicle on a tile while not converting Rail <-> ElRail */
+ (!IsCompatibleRail(type, totype) && !EnsureNoVehicleOnGround(tile))) {
+ ret = CMD_ERROR;
+ continue;
+ }
+
+ ret = proc(tile, totype, false);
if (CmdFailed(ret)) continue;
if (flags & DC_EXEC) {
@@ -1130,7 +1149,7 @@
_additional_cash_required = ret.GetCost();
return cost;
}
- proc(tile, (RailType)p2, true);
+ proc(tile, totype, true);
}
cost.AddCost(ret);
}
@@ -1244,7 +1263,7 @@
sprite = _signal_base + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
}
- AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, 10, GetSlopeZ(x,y));
+ AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSlopeZ(x,y));
}
static uint32 _drawtile_track_palette;
@@ -1499,7 +1518,7 @@
const Station* st = ComposeWaypointStation(ti->tile);
uint gfx = 2;
- if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+ if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
if (callback != CALLBACK_FAILED) gfx = callback;
}
@@ -2175,15 +2194,62 @@
return VETSB_CONTINUE;
}
+/**
+ * Tests if autoslope is allowed.
+ *
+ * @param tile The tile.
+ * @param flags Terraform command flags.
+ * @param z_old Old TileZ.
+ * @param tileh_old Old TileSlope.
+ * @param z_new New TileZ.
+ * @param tileh_new New TileSlope.
+ * @param rail_bits Trackbits.
+ */
+static CommandCost TestAutoslopeOnRailTile(TileIndex tile, uint flags, uint z_old, Slope tileh_old, uint z_new, Slope tileh_new, TrackBits rail_bits)
+{
+ if (!_patches.build_on_slopes || !AutoslopeEnabled()) return CMD_ERROR;
+
+ /* Is the slope-rail_bits combination valid in general? I.e. is it save to call GetRailFoundation() ? */
+ if (CmdFailed(CheckRailSlope(tileh_new, rail_bits, TRACK_BIT_NONE, tile))) return CMD_ERROR;
+
+ /* Get the slopes on top of the foundations */
+ z_old += ApplyFoundationToSlope(GetRailFoundation(tileh_old, rail_bits), &tileh_old);
+ z_new += ApplyFoundationToSlope(GetRailFoundation(tileh_new, rail_bits), &tileh_new);
+
+ Slope track_corner;
+ switch (rail_bits) {
+ case TRACK_BIT_LEFT: track_corner = SLOPE_W; break;
+ case TRACK_BIT_LOWER: track_corner = SLOPE_S; break;
+ case TRACK_BIT_RIGHT: track_corner = SLOPE_E; break;
+ case TRACK_BIT_UPPER: track_corner = SLOPE_N; break;
+
+ /* Surface slope must not be changed */
+ default: return (((z_old != z_new) || (tileh_old != tileh_new)) ? CMD_ERROR : _price.terraform);
+ }
+
+ /* The height of the track_corner must not be changed. The rest ensures GetRailFoundation() already. */
+ if ((tileh_old & track_corner) != 0) z_old += TILE_HEIGHT;
+ if ((tileh_new & track_corner) != 0) z_new += TILE_HEIGHT;
+ if (z_old != z_new) return CMD_ERROR;
+
+ /* Make the ground dirty, if surface slope has changed */
+ if ((tileh_old != tileh_new) && ((flags & DC_EXEC) != 0)) SetRailGroundType(tile, RAIL_GROUND_BARREN);
+
+ return _price.terraform;
+}
+
static CommandCost TerraformTile_Track(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
+ uint z_old;
+ Slope tileh_old = GetTileSlope(tile, &z_old);
if (IsPlainRailTile(tile)) {
- uint z_old;
- Slope tileh_old = GetTileSlope(tile, &z_old);
TrackBits rail_bits = GetTrackBits(tile);
_error_message = STR_1008_MUST_REMOVE_RAILROAD_TRACK;
+ /* First test autoslope. However if it succeeds we still have to test the rest, because non-autoslope terraforming is cheaper. */
+ CommandCost autoslope_result = TestAutoslopeOnRailTile(tile, flags, z_old, tileh_old, z_new, tileh_new, rail_bits);
+
/* When there is only a single horizontal/vertical track, one corner can be terraformed. */
Slope allowed_corner;
switch (rail_bits) {
@@ -2191,7 +2257,7 @@
case TRACK_BIT_UPPER: allowed_corner = SLOPE_S; break;
case TRACK_BIT_LEFT: allowed_corner = SLOPE_E; break;
case TRACK_BIT_LOWER: allowed_corner = SLOPE_N; break;
- default: return CMD_ERROR;
+ default: return autoslope_result;
}
Slope track_corners = ComplementSlope(allowed_corner);
@@ -2207,28 +2273,28 @@
z_new += TILE_HEIGHT;
} else {
/* do not build a foundation */
- if ((tileh_new != SLOPE_FLAT) && (tileh_new != allowed_corner)) return CMD_ERROR;
+ if ((tileh_new != SLOPE_FLAT) && (tileh_new != allowed_corner)) return autoslope_result;
}
/* Track height must remain unchanged */
- if (z_old != z_new) return CMD_ERROR;
+ if (z_old != z_new) return autoslope_result;
break;
case FOUNDATION_LEVELED:
/* Is allowed_corner covered by the foundation? */
- if ((tileh_old & allowed_corner) == 0) return CMD_ERROR;
+ if ((tileh_old & allowed_corner) == 0) return autoslope_result;
/* allowed_corner may only be raised -> steep slope */
- if ((z_old != z_new) || (tileh_new != (tileh_old | SLOPE_STEEP))) return CMD_ERROR;
+ if ((z_old != z_new) || (tileh_new != (tileh_old | SLOPE_STEEP))) return autoslope_result;
break;
case FOUNDATION_STEEP_LOWER:
/* Only allow to lower highest corner */
- if ((z_old != z_new) || (tileh_new != (tileh_old & ~SLOPE_STEEP))) return CMD_ERROR;
+ if ((z_old != z_new) || (tileh_new != (tileh_old & ~SLOPE_STEEP))) return autoslope_result;
break;
case FOUNDATION_STEEP_HIGHER:
- return CMD_ERROR;
+ return autoslope_result;
default: NOT_REACHED();
}
@@ -2238,6 +2304,22 @@
/* allow terraforming, no extra costs */
return CommandCost();
+ } else {
+ if (_patches.build_on_slopes && AutoslopeEnabled()) {
+ switch (GetRailTileType(tile)) {
+ case RAIL_TILE_WAYPOINT: {
+ CommandCost cost = TestAutoslopeOnRailTile(tile, flags, z_old, tileh_old, z_new, tileh_new, GetRailWaypointBits(tile));
+ if (!CmdFailed(cost)) return cost; // allow autoslope
+ break;
+ }
+
+ case RAIL_TILE_DEPOT:
+ if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRailDepotDirection(tile))) return _price.terraform;
+ break;
+
+ default: NOT_REACHED();
+ }
+ }
}
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
--- a/src/rail_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/rail_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -66,8 +66,8 @@
{
DoCommandP(tile, _cur_railtype, cmd, CcPlaySound1E,
_remove_button_clicked ?
- CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER :
- CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER
+ CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_NO_WATER :
+ CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_NO_WATER
);
}
@@ -103,7 +103,7 @@
if (GetRailTileType(tile) != RAIL_TILE_NORMAL) return;
if ((GetTrackBits(tile) & GB(extra, 8, 8)) == 0) return;
- DoCommandP(tile, _cur_railtype, extra & 0xFF, NULL, CMD_BUILD_SINGLE_RAIL | CMD_AUTO | CMD_NO_WATER);
+ DoCommandP(tile, _cur_railtype, extra & 0xFF, NULL, CMD_BUILD_SINGLE_RAIL | CMD_NO_WATER);
}
static const uint16 _place_depot_extra[12] = {
@@ -134,7 +134,7 @@
static void PlaceRail_Depot(TileIndex tile)
{
DoCommandP(tile, _cur_railtype, _build_depot_direction, CcRailDepot,
- CMD_BUILD_TRAIN_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_100E_CAN_T_BUILD_TRAIN_DEPOT));
+ CMD_BUILD_TRAIN_DEPOT | CMD_NO_WATER | CMD_MSG(STR_100E_CAN_T_BUILD_TRAIN_DEPOT));
}
static void PlaceRail_Waypoint(TileIndex tile)
@@ -166,7 +166,7 @@
DoCommandP(tile,
_railstation.orientation | (_railstation.numtracks << 8) | (_railstation.platlength << 16) | (_ctrl_pressed << 24),
_cur_railtype | (_railstation.station_class << 8) | (_railstation.station_type << 16), CcStation,
- CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_AUTO | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
+ CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
}
}
@@ -190,10 +190,10 @@
SB(p1, 4, 1, _cur_year < _patches.semaphore_build_before);
DoCommandP(tile, p1, 0, CcPlaySound1E,
- CMD_BUILD_SIGNALS | CMD_AUTO | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE));
+ CMD_BUILD_SIGNALS | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE));
} else {
DoCommandP(tile, track, 0, CcPlaySound1E,
- CMD_REMOVE_SIGNALS | CMD_AUTO | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
+ CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
}
}
@@ -215,12 +215,12 @@
static void PlaceRail_Tunnel(TileIndex tile)
{
DoCommandP(tile, _cur_railtype, 0, CcBuildRailTunnel,
- CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
+ CMD_BUILD_TUNNEL | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
}
void PlaceProc_BuyLand(TileIndex tile)
{
- DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_PURCHASE_LAND_AREA | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_5806_CAN_T_PURCHASE_THIS_LAND));
+ DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_PURCHASE_LAND_AREA | CMD_NO_WATER | CMD_MSG(STR_5806_CAN_T_PURCHASE_THIS_LAND));
}
static void PlaceRail_ConvertRail(TileIndex tile)
@@ -346,8 +346,8 @@
{
DoCommandP(TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), _cur_railtype | (mode << 4), NULL,
_remove_button_clicked ?
- CMD_REMOVE_RAILROAD_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
- CMD_BUILD_RAILROAD_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
+ CMD_REMOVE_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) :
+ CMD_BUILD_RAILROAD_TRACK | CMD_NO_WATER | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK)
);
}
@@ -388,8 +388,8 @@
p2,
CcPlaySound1E,
_remove_button_clicked ?
- CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
- CMD_BUILD_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)
+ CMD_REMOVE_SIGNAL_TRACK | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
+ CMD_BUILD_SIGNAL_TRACK | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)
);
}
@@ -671,7 +671,7 @@
DoCommandP(TileXY(sx, sy),
_railstation.orientation | (w << 8) | (h << 16) | (_ctrl_pressed << 24),
_cur_railtype | (_railstation.station_class << 8) | (_railstation.station_type << 16), CcStation,
- CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_AUTO | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
+ CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
}
/* Check if the currently selected station size is allowed */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rev.cpp.in Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,4 @@
+extern const char _openttd_revision[] = "@@VERSION@@";
+#ifdef __MORPHOS__
+extern const char morphos_versions_tag[] = "\\0$VER: OpenTTD @@VERSION@@ (@@DATE@@) OpenTTD Team [MorphOS, PowerPC]";
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/road.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -0,0 +1,69 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "functions.h"
+#include "rail_map.h"
+#include "road.h"
+#include "road_map.h"
+#include "water_map.h"
+#include "macros.h"
+
+bool IsPossibleCrossing(const TileIndex tile, Axis ax)
+{
+ return (IsTileType(tile, MP_RAILWAY) &&
+ !HasSignals(tile) &&
+ GetTrackBits(tile) == (ax == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X) &&
+ GetTileSlope(tile, NULL) == SLOPE_FLAT);
+}
+
+RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
+{
+ for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+ const TileIndex neighbor_tile = TileAddByDiagDir(tile, dir);
+
+ /* Get the Roadbit pointing to the neighbor_tile */
+ const RoadBits target_rb = DiagDirToRoadBits(dir);
+
+ /* If the roadbit is in the current plan */
+ if (org_rb & target_rb) {
+ bool connective = false;
+ const RoadBits mirrored_rb = MirrorRoadBits(target_rb);
+
+ switch (GetTileType(neighbor_tile)) {
+ /* Allways connective ones */
+ case MP_CLEAR: case MP_TREES:
+ connective = true;
+ break;
+
+ /* The conditionaly connective ones */
+ case MP_TUNNELBRIDGE:
+ case MP_STATION:
+ case MP_ROAD: {
+ const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM);
+
+ /* Accept only connective tiles */
+ connective = (neighbor_rb & mirrored_rb) || // Neighbor has got the fitting RoadBit
+ COUNTBITS(neighbor_rb) == 1; // Neighbor has got only one Roadbit
+
+ } break;
+
+ case MP_RAILWAY:
+ connective = IsPossibleCrossing(neighbor_tile, DiagDirToAxis(dir));
+ break;
+
+ case MP_WATER:
+ /* Check for real water tile */
+ connective = !IsWater(neighbor_tile);
+ break;
+
+ /* The defentetly not connective ones */
+ default: break;
+ }
+
+ /* If the neighbor tile is inconnective remove the planed road connection to it */
+ if (!connective) org_rb ^= target_rb;
+
+ }
+ }
+
+ return org_rb;
+}
--- a/src/road.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road.h Sat Oct 06 21:16:00 2007 +0000
@@ -116,6 +116,36 @@
}
/**
+ * Calculate the mirrored RoadBits
+ *
+ * Simply move the bits to their new position.
+ *
+ * @param r The given RoadBits value
+ * @return the mirrored
+ */
+static inline RoadBits MirrorRoadBits(RoadBits r)
+{
+ return (RoadBits)(GB(r, 0, 2) << 2 | GB(r, 2, 2));
+}
+
+/**
+ * Calculate rotated RoadBits
+ *
+ * Move the Roadbits clockwise til they are in their final position.
+ *
+ * @param r The given RoadBits value
+ * @param rot The given Rotation angle
+ * @return the rotated
+ */
+static inline RoadBits RotateRoadBits(RoadBits r, DiagDirDiff rot)
+{
+ for (; rot > (DiagDirDiff)0; rot--){
+ r = (RoadBits)(GB(r, 0, 1) << 3 | GB(r, 1, 3));
+ }
+ return r;
+}
+
+/**
* Create the road-part which belongs to the given DiagDirection
*
* This function returns a RoadBits value which belongs to
@@ -126,10 +156,20 @@
*/
static inline RoadBits DiagDirToRoadBits(DiagDirection d)
{
- return (RoadBits)(1U << (3 ^ d));
+ return (RoadBits)(ROAD_NW << (3 ^ d));
}
/**
+ * Return if the tile is a valid tile for a crossing.
+ *
+ * @note function is overloaded
+ * @param tile the curent tile
+ * @param ax the axis of the road over the rail
+ * @return true if it is a valid tile
+ */
+bool IsPossibleCrossing(const TileIndex tile, Axis ax);
+
+/**
* Checks whether the trackdir means that we are reversing.
* @param dir the trackdir to check
* @return true if it is a reversing road trackdir
@@ -150,6 +190,14 @@
}
/**
+ * Clean up unneccesary RoadBits of a planed tile.
+ * @param tile current tile
+ * @param org_rb planed RoadBits
+ * @return optimised RoadBits
+ */
+RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb);
+
+/**
* Is it allowed to remove the given road bits from the given tile?
* @param tile the tile to remove the road from
* @param remove the roadbits that are going to be removed
--- a/src/road_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -32,6 +32,12 @@
#include "station_map.h"
#include "tunnel_map.h"
#include "misc/autoptr.hpp"
+#include "autoslope.h"
+
+#define M(x) (1 << (x))
+/* Level crossings may only be built on these slopes */
+static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
+#undef M
bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
{
@@ -198,10 +204,12 @@
if (present == ROAD_NONE) {
RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
if (rts == ROADTYPES_NONE) {
+ /* Includes MarkTileDirtyByTile() */
DoClearSquare(tile);
} else {
SetRoadBits(tile, ROAD_NONE, rt);
SetRoadTypes(tile, rts);
+ MarkTileDirtyByTile(tile);
}
} else {
/* When bits are removed, you *always* end up with something that
@@ -251,70 +259,121 @@
static const RoadBits _valid_tileh_slopes_road[][15] = {
/* set of normal ones */
{
- ROAD_ALL, ROAD_NONE, ROAD_NONE,
- ROAD_X, ROAD_NONE, ROAD_NONE, // 3, 4, 5
- ROAD_Y, ROAD_NONE, ROAD_NONE,
- ROAD_Y, ROAD_NONE, ROAD_NONE, // 9, 10, 11
- ROAD_X, ROAD_NONE, ROAD_NONE
+ ROAD_ALL, // SLOPE_FLAT
+ ROAD_NONE, // SLOPE_W
+ ROAD_NONE, // SLOPE_S
+
+ ROAD_X, // SLOPE_SW
+ ROAD_NONE, // SLOPE_E
+ ROAD_NONE, // SLOPE_EW
+
+ ROAD_Y, // SLOPE_SE
+ ROAD_NONE, // SLOPE_WSE
+ ROAD_NONE, // SLOPE_N
+
+ ROAD_Y, // SLOPE_NW
+ ROAD_NONE, // SLOPE_NS
+ ROAD_NONE, // SLOPE_NE
+
+ ROAD_X, // SLOPE_ENW
+ ROAD_NONE, // SLOPE_SEN
+ ROAD_NONE // SLOPE_ELEVATED
},
/* allowed road for an evenly raised platform */
{
- ROAD_NONE,
- ROAD_SW | ROAD_NW,
- ROAD_SW | ROAD_SE,
- ROAD_Y | ROAD_SW,
+ ROAD_NONE, // SLOPE_FLAT
+ ROAD_SW | ROAD_NW, // SLOPE_W
+ ROAD_SW | ROAD_SE, // SLOPE_S
- ROAD_SE | ROAD_NE, // 4
- ROAD_ALL,
- ROAD_X | ROAD_SE,
- ROAD_ALL,
+ ROAD_Y | ROAD_SW, // SLOPE_SW
+ ROAD_SE | ROAD_NE, // SLOPE_E
+ ROAD_ALL, // SLOPE_EW
- ROAD_NW | ROAD_NE, // 8
- ROAD_X | ROAD_NW,
- ROAD_ALL,
- ROAD_ALL,
+ ROAD_X | ROAD_SE, // SLOPE_SE
+ ROAD_ALL, // SLOPE_WSE
+ ROAD_NW | ROAD_NE, // SLOPE_N
- ROAD_Y | ROAD_NE, // 12
- ROAD_ALL,
- ROAD_ALL
+ ROAD_X | ROAD_NW, // SLOPE_NW
+ ROAD_ALL, // SLOPE_NS
+ ROAD_ALL, // SLOPE_NE
+
+ ROAD_Y | ROAD_NE, // SLOPE_ENW
+ ROAD_ALL, // SLOPE_SEN
+ ROAD_ALL // SLOPE_ELEVATED
+ },
+ /* Singe bits on slopes */
+ {
+ ROAD_ALL, // SLOPE_FLAT
+ ROAD_NE | ROAD_SE, // SLOPE_W
+ ROAD_NE | ROAD_NW, // SLOPE_S
+
+ ROAD_NE, // SLOPE_SW
+ ROAD_NW | ROAD_SW, // SLOPE_E
+ ROAD_ALL, // SLOPE_EW
+
+ ROAD_NW, // SLOPE_SE
+ ROAD_ALL, // SLOPE_WSE
+ ROAD_SE | ROAD_SW, // SLOPE_N
+
+ ROAD_SE, // SLOPE_NW
+ ROAD_ALL, // SLOPE_NS
+ ROAD_ALL, // SLOPE_NE
+
+ ROAD_SW, // SLOPE_ENW
+ ROAD_ALL, // SLOPE_SEN
+ ROAD_ALL, // SLOPE_ELEVATED
},
};
-
+/**
+ * Calculate the costs for roads on slopes
+ * Aside modify the RoadBits to fit on the slopes
+ *
+ * @note The RoadBits are modified too!
+ * @param tileh The current slope
+ * @param pieces The RoadBits we want to add
+ * @param existing The existent RoadBits
+ * @return The costs for these RoadBits on this slope
+ */
static CommandCost CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing)
{
- RoadBits road_bits;
-
if (IsSteepSlope(tileh)) {
- /* force full pieces. */
- *pieces |= (RoadBits)((*pieces & 0xC) >> 2);
- *pieces |= (RoadBits)((*pieces & 0x3) << 2);
+ /* Force straight roads. */
+ *pieces |= MirrorRoadBits(*pieces);
- if (existing == 0 || existing == *pieces) {
+ if (existing == ROAD_NONE || existing == *pieces) {
if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
}
return CMD_ERROR;
}
- road_bits = *pieces | existing;
+
+ RoadBits road_bits = *pieces | existing;
+
+ /* Single bits on slopes.
+ * We check for the roads that need at least 2 bits */
+ if (_patches.build_on_slopes && !_is_old_ai_player &&
+ existing == ROAD_NONE && COUNTBITS(*pieces) == 1 &&
+ (_valid_tileh_slopes_road[2][tileh] & *pieces) == ROAD_NONE) {
+ return CommandCost(_price.terraform);
+ }
/* no special foundation */
- if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == 0) {
+ if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == ROAD_NONE) {
/* force that all bits are set when we have slopes */
if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
return CommandCost(); // no extra cost
}
/* foundation is used. Whole tile is leveled up */
- if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == 0) {
- return CommandCost(existing != 0 ? 0 : _price.terraform);
+ if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == ROAD_NONE) {
+ return CommandCost(existing != ROAD_NONE ? 0 : _price.terraform);
}
- *pieces |= (RoadBits)((*pieces & 0xC) >> 2);
- *pieces |= (RoadBits)((*pieces & 0x3) << 2);
+ /* Force straight roads. */
+ *pieces |= MirrorRoadBits(*pieces);
/* partly leveled up tile, only if there's no road on that tile */
- if ((existing == 0 || existing == *pieces) && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
- /* force full pieces. */
+ if ((existing == ROAD_NONE || existing == *pieces) && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
}
return CMD_ERROR;
@@ -403,12 +462,10 @@
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
}
-#define M(x) (1 << (x))
/* Level crossings may only be built on these slopes */
- if (!HASBIT(M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT), tileh)) {
+ if (!HASBIT(VALID_LEVEL_CROSSING_SLOPES, tileh)) {
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
}
-#undef M
if (GetRailTileType(tile) != RAIL_TILE_NORMAL) goto do_clear;
switch (GetTrackBits(tile)) {
@@ -541,18 +598,11 @@
/* not a railroad crossing? */
if (!IsLevelCrossing(tile)) return CMD_ERROR;
- /* not owned by me? */
- if (!CheckTileOwnership(tile) || !EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
-
- if (GetRailType(tile) == totype) return CMD_ERROR;
-
- /* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
- if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
if (exec) {
SetRailType(tile, totype);
MarkTileDirtyByTile(tile);
YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetCrossingRailBits(tile)));
+ VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
}
return CommandCost(_price.build_rail / 2);
@@ -603,7 +653,7 @@
/* On the X-axis, we have to swap the initial bits, so they
* will be interpreted correctly in the GTTS. Futhermore
* when you just 'click' on one tile to build them. */
- if (HASBIT(p2, 2) == (start_tile == end_tile)) drd ^= DRD_BOTH;
+ if (HASBIT(p2, 2) == (start_tile == end_tile && HASBIT(p2, 0) == HASBIT(p2, 1))) drd ^= DRD_BOTH;
/* No disallowed direction bits have to be toggled */
if (!HASBIT(p2, 5)) drd = DRD_NONE;
@@ -786,10 +836,9 @@
case ROAD_TILE_NORMAL: {
RoadBits b = GetAllRoadBits(tile);
-#define M(x) (1 << (x))
/* Clear the road if only one piece is on the tile OR the AI tries
* to clear town road OR we are not using the DC_AUTO flag */
- if ((M(b) & (M(ROAD_NW) | M(ROAD_SW) | M(ROAD_SE) | M(ROAD_NE))) ||
+ if ((COUNTBITS(b) == 1 && GetRoadBits(tile, ROADTYPE_TRAM) == ROAD_NONE) ||
((flags & DC_AI_BUILDING) && IsTileOwner(tile, OWNER_TOWN)) ||
!(flags & DC_AUTO)
) {
@@ -806,7 +855,6 @@
}
return_cmd_error(STR_1801_MUST_REMOVE_ROAD_FIRST);
}
-#undef M
case ROAD_TILE_CROSSING: {
RoadTypes rts = GetRoadTypes(tile);
@@ -915,8 +963,8 @@
front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
}
- AddSortableSpriteToDraw(back, PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
- AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, 0x1F, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
+ AddSortableSpriteToDraw(back, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
+ AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
}
/**
@@ -1183,8 +1231,8 @@
if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) return;
+ const Town* t = ClosestTownFromTile(tile, (uint)-1);
if (!HasRoadWorks(tile)) {
- const Town* t = ClosestTownFromTile(tile, (uint)-1);
int grp = 0;
if (t != NULL) {
@@ -1193,8 +1241,8 @@
/* Show an animation to indicate road work */
if (t->road_build_months != 0 &&
(DistanceManhattan(t->xy, tile) < 8 || grp != 0) &&
- GetRoadTileType(tile) == ROAD_TILE_NORMAL && (GetAllRoadBits(tile) == ROAD_X || GetAllRoadBits(tile) == ROAD_Y)) {
- if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 20)) {
+ GetRoadTileType(tile) == ROAD_TILE_NORMAL && COUNTBITS(GetAllRoadBits(tile)) > 1 ) {
+ if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 40)) {
StartRoadWorks(tile);
SndPlayTileFx(SND_21_JACKHAMMER, tile);
@@ -1232,6 +1280,17 @@
}
} else if (IncreaseRoadWorksCounter(tile)) {
TerminateRoadWorks(tile);
+
+ if (_patches.mod_road_rebuild) {
+ /* Generate a nicer town surface */
+ const RoadBits old_rb = GetAnyRoadBits(tile, ROADTYPE_ROAD);
+ const RoadBits new_rb = CleanUpRoadBits(tile, old_rb);
+
+ if (old_rb != new_rb) {
+ DoCommand(tile, (old_rb ^ new_rb), t->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_REMOVE_ROAD);
+ }
+ }
+
MarkTileDirtyByTile(tile);
}
}
@@ -1377,6 +1436,41 @@
static CommandCost TerraformTile_Road(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
+ if (_patches.build_on_slopes && AutoslopeEnabled()) {
+ switch (GetRoadTileType(tile)) {
+ case ROAD_TILE_CROSSING:
+ if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new)) && HASBIT(VALID_LEVEL_CROSSING_SLOPES, tileh_new)) return _price.terraform;
+ break;
+
+ case ROAD_TILE_DEPOT:
+ if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRoadDepotDirection(tile))) return _price.terraform;
+ break;
+
+ case ROAD_TILE_NORMAL: {
+ RoadBits bits = GetAllRoadBits(tile);
+ RoadBits bits_copy = bits;
+ /* Check if the slope-road_bits combination is valid at all, i.e. it is save to call GetRoadFoundation(). */
+ if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE))) {
+ /* CheckRoadSlope() sometimes changes the road_bits, if it does not agree with them. */
+ if (bits == bits_copy) {
+ uint z_old;
+ Slope tileh_old = GetTileSlope(tile, &z_old);
+
+ /* Get the slope on top of the foundation */
+ z_old += ApplyFoundationToSlope(GetRoadFoundation(tileh_old, bits), &tileh_old);
+ z_new += ApplyFoundationToSlope(GetRoadFoundation(tileh_new, bits), &tileh_new);
+
+ /* The surface slope must not be changed */
+ if ((z_old == z_new) && (tileh_old == tileh_new)) return _price.terraform;
+ }
+ }
+ break;
+ }
+
+ default: NOT_REACHED();
+ }
+ }
+
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
--- a/src/road_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/road_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -115,7 +115,7 @@
static void PlaceRoad_Tunnel(TileIndex tile)
{
- DoCommandP(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
+ DoCommandP(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
}
static void BuildRoadOutsideStation(TileIndex tile, DiagDirection direction)
@@ -143,7 +143,7 @@
static void PlaceRoad_Depot(TileIndex tile)
{
- DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_depot));
+ DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_depot));
}
static void PlaceRoadStop(TileIndex tile, uint32 p2, uint32 cmd)
@@ -162,7 +162,7 @@
if (_remove_button_clicked) {
DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::BUS]));
} else {
- PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::BUS]));
+ PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::BUS]));
}
}
@@ -171,7 +171,7 @@
if (_remove_button_clicked) {
DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::TRUCK]));
} else {
- PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
+ PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
}
}
@@ -347,8 +347,8 @@
case DDSP_PLACE_ROAD_NW:
DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | _ctrl_pressed << 5, CcPlaySound1D,
_remove_button_clicked ?
- CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
- CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
+ CMD_REMOVE_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
+ CMD_BUILD_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
break;
}
}
--- a/src/roadveh.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh.h Sat Oct 06 21:16:00 2007 +0000
@@ -69,7 +69,6 @@
ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_ROADVEH_INC : EXPENSES_ROADVEH_RUN; }
WindowClass GetVehicleListWindowClass() const { return WC_ROADVEH_LIST; }
bool IsPrimaryVehicle() const { return IsRoadVehFront(this); }
- bool HasFront() const { return true; }
int GetImage(Direction direction) const;
int GetDisplaySpeed() const { return this->cur_speed * 10 / 32; }
int GetDisplayMaxSpeed() const { return this->max_speed * 10 / 32; }
--- a/src/roadveh_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -179,11 +179,11 @@
if (HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) != HASBIT(EngInfo(p1)->misc_flags, EF_ROAD_TRAM)) return_cmd_error(STR_DEPOT_WRONG_DEPOT_TYPE);
- uint num_vehicles = 1 + CountArticulatedParts(p1);
+ uint num_vehicles = 1 + CountArticulatedParts(p1, false);
- /* Allow for the front and up to 10 articulated parts. */
- Vehicle *vl[11];
- memset(&vl, 0, sizeof(vl));
+ /* Allow for the front and the articulated parts, plus one to "terminate" the list. */
+ Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+ memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
if (!Vehicle::AllocateList(vl, num_vehicles)) {
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -477,6 +477,7 @@
* Now we change the setting to apply the new one and let the vehicle head for the same depot.
* Note: the if is (true for requesting service == true for ordered to stop in depot) */
if (flags & DC_EXEC) {
+ CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
}
@@ -997,7 +998,7 @@
const Vehicle* u;
const Vehicle* v;
TileIndex tile;
- byte tilebits;
+ uint16 tilebits;
};
static void* EnumFindVehToOvertake(Vehicle* v, void* data)
@@ -1013,9 +1014,10 @@
{
uint32 bits;
- bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes) & 0x3F;
+ bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes);
+ bits |= bits >> 8;
- if (!(od->tilebits & bits) || (bits & 0x3C) || (bits & 0x3F3F0000))
+ if (!(od->tilebits & bits) || (bits & 0x3C3C) || (bits & 0x3F3F0000))
return true;
return VehicleFromPos(od->tile, od, EnumFindVehToOvertake) != NULL;
}
@@ -1023,7 +1025,7 @@
static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
{
OvertakeData od;
- byte tt;
+ uint16 tt;
od.v = v;
od.u = u;
@@ -1037,6 +1039,9 @@
/* Trams can't overtake other trams */
if (v->u.road.roadtype == ROADTYPE_TRAM) return;
+ /* Don't overtake in stations */
+ if (IsTileType(v->tile, MP_STATION)) return;
+
/* For now, articulated road vehicles can't overtake anything. */
if (RoadVehHasArticPart(v)) return;
@@ -1045,7 +1050,10 @@
/* Check if vehicle is in a road stop, depot, tunnel or bridge or not on a straight road */
if (v->u.road.state >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
- tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & 0x3F;
+ tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
+ tt |= tt >> 8;
+ tt &= 0x3F;
+
if ((tt & 3) == 0) return;
if ((tt & 0x3C) != 0) return;
@@ -1646,9 +1654,9 @@
Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir);
if (u != NULL) {
- v->cur_speed = u->cur_speed;
/* There is a vehicle in front overtake it if possible */
if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u);
+ if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed;
return false;
}
}
@@ -2022,7 +2030,7 @@
if (v->cargo_cap == 0) continue;
- if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+ if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
/* Back up the cargo type */
CargoID temp_cid = v->cargo_type;
byte temp_subtype = v->cargo_subtype;
--- a/src/roadveh_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/roadveh_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -19,6 +19,82 @@
#include "vehicle_gui.h"
#include "newgrf_engine.h"
+
+void DrawRoadVehDetails(const Vehicle *v, int x, int y)
+{
+ uint y_offset = RoadVehHasArticPart(v) ? 15 :0;
+ StringID str;
+
+ SetDParam(0, v->engine_type);
+ SetDParam(1, v->build_year);
+ SetDParam(2, v->value);
+ DrawString(x, y + y_offset, STR_9011_BUILT_VALUE, 0);
+
+ if (RoadVehHasArticPart(v)) {
+ AcceptedCargo max_cargo;
+ char capacity[512];
+
+ memset(max_cargo, 0, sizeof(max_cargo));
+
+ for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+ max_cargo[u->cargo_type] += u->cargo_cap;
+ }
+
+ GetString(capacity, STR_ARTICULATED_RV_CAPACITY, lastof(capacity));
+
+ bool first = true;
+ for (CargoID i = 0; i < NUM_CARGO; i++) {
+ if (max_cargo[i] > 0) {
+ char buffer[128];
+
+ SetDParam(0, i);
+ SetDParam(1, max_cargo[i]);
+ GetString(buffer, STR_BARE_CARGO, lastof(buffer));
+
+ if (!first) strecat(capacity, ", ", lastof(capacity));
+ strecat(capacity, buffer, lastof(capacity));
+ first = false;
+ }
+ }
+
+ SetDParamStr(0, capacity);
+ DrawStringTruncated(x, y + 10 + y_offset, STR_JUST_STRING, 0, 380 - x);
+
+ for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+ str = STR_8812_EMPTY;
+ if (!u->cargo.Empty()) {
+ SetDParam(0, u->cargo_type);
+ SetDParam(1, u->cargo.Count());
+ SetDParam(2, u->cargo.Source());
+ str = STR_8813_FROM;
+ }
+ DrawString(x, y + 21 + y_offset, str, 0);
+
+ y_offset += 11;
+ }
+
+ y_offset -= 11;
+ } else {
+ SetDParam(0, v->cargo_type);
+ SetDParam(1, v->cargo_cap);
+ DrawString(x, y + 10 + y_offset, STR_9012_CAPACITY, 0);
+
+ str = STR_8812_EMPTY;
+ if (!v->cargo.Empty()) {
+ SetDParam(0, v->cargo_type);
+ SetDParam(1, v->cargo.Count());
+ SetDParam(2, v->cargo.Source());
+ str = STR_8813_FROM;
+ }
+ DrawString(x, y + 21 + y_offset, str, 0);
+ }
+
+ /* Draw Transfer credits text */
+ SetDParam(0, v->cargo.FeederShare());
+ DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
+}
+
+
static inline int RoadVehLengthToPixels(int length)
{
return (length * 28) / 8;
@@ -26,17 +102,13 @@
void DrawRoadVehImage(const Vehicle *v, int x, int y, int count, VehicleID selection)
{
- int dx = 0;
-
/* Road vehicle lengths are measured in eighths of the standard length, so
* count is the number of standard vehicles that should be drawn. If it is
* 0, we draw enough vehicles for 10 standard vehicle lengths. */
int max_length = (count == 0) ? 80 : count * 8;
- do {
- int length = v->u.road.cached_veh_length;
-
- if (dx + length > 0 && dx <= max_length) {
+ for (int dx = 0 ; v != NULL && dx < max_length ; dx += v->u.road.cached_veh_length, v = v->Next()) {
+ if (dx + v->u.road.cached_veh_length > 0 && dx <= max_length) {
SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
DrawSprite(v->GetImage(DIR_W), pal, x + 14 + RoadVehLengthToPixels(dx), y + 6);
@@ -44,226 +116,9 @@
DrawFrameRect(x - 1, y - 1, x + 28, y + 12, 15, FR_BORDERONLY);
}
}
-
- dx += length;
- v = v->Next();
- } while (v != NULL && dx < max_length);
-}
-
-static void RoadVehDetailsWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_CREATE: {
- const Vehicle *v = GetVehicle(w->window_number);
-
- if (!RoadVehHasArticPart(v)) break;
-
- /* Draw the text under the vehicle instead of next to it, minus the
- * height already allocated for the cargo of the first vehicle. */
- uint height_extension = 15 - 11;
-
- /* Add space for the cargo amount for each part. */
- do {
- height_extension += 11;
- } while ((v = v->Next()) != NULL);
-
- ResizeWindow(w, 0, height_extension);
- } break;
-
- case WE_PAINT: {
- const Vehicle *v = GetVehicle(w->window_number);
- StringID str;
- uint y_offset = RoadVehHasArticPart(v) ? 15 :0;
-
- SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
- /* disable service-scroller when interval is set to disabled */
- SetWindowWidgetDisabledState(w, 5, !_patches.servint_roadveh);
- SetWindowWidgetDisabledState(w, 6, !_patches.servint_roadveh);
-
- SetDParam(0, v->index);
- DrawWindowWidgets(w);
-
- /* Draw running cost */
- {
- int year = v->age / 366;
-
- SetDParam(1, year);
-
- SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
- SetDParam(2, v->max_age / 366);
- SetDParam(3, v->GetDisplayRunningCost());
- DrawString(2, 15, STR_900D_AGE_RUNNING_COST_YR, 0);
- }
-
- /* Draw max speed */
- {
- SetDParam(0, v->GetDisplayMaxSpeed());
- DrawString(2, 25, STR_900E_MAX_SPEED, 0);
- }
-
- /* Draw profit */
- {
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
- DrawString(2, 35, STR_900F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
- }
-
- /* Draw breakdown & reliability */
- {
- SetDParam(0, v->reliability * 100 >> 16);
- SetDParam(1, v->breakdowns_since_last_service);
- DrawString(2, 45, STR_9010_RELIABILITY_BREAKDOWNS, 0);
- }
-
- DrawRoadVehImage(v, 3, 57, 0, INVALID_VEHICLE);
-
- SetDParam(0, v->engine_type);
- SetDParam(1, v->build_year);
- SetDParam(2, v->value);
- DrawString(34, 57 + y_offset, STR_9011_BUILT_VALUE, 0);
-
- if (RoadVehHasArticPart(v)) {
- AcceptedCargo max_cargo;
- char capacity[512];
-
- memset(max_cargo, 0, sizeof(max_cargo));
-
- for (const Vehicle *u = v; u != NULL; u = u->Next()) {
- max_cargo[u->cargo_type] += u->cargo_cap;
- }
-
- GetString(capacity, STR_ARTICULATED_RV_CAPACITY, lastof(capacity));
-
- bool first = true;
- for (CargoID i = 0; i < NUM_CARGO; i++) {
- if (max_cargo[i] > 0) {
- char buffer[128];
-
- SetDParam(0, i);
- SetDParam(1, max_cargo[i]);
- GetString(buffer, STR_BARE_CARGO, lastof(buffer));
-
- if (!first) strecat(capacity, ", ", lastof(capacity));
- strecat(capacity, buffer, lastof(capacity));
-
- first = false;
- }
- }
-
- SetDParamStr(0, capacity);
- DrawStringTruncated(34, 67 + y_offset, STR_JUST_STRING, 0, w->width - 34);
-
- for (const Vehicle *u = v; u != NULL; u = u->Next()) {
- str = STR_8812_EMPTY;
- if (!u->cargo.Empty()) {
- SetDParam(0, u->cargo_type);
- SetDParam(1, u->cargo.Count());
- SetDParam(2, u->cargo.Source());
- str = STR_8813_FROM;
- }
- DrawString(34, 78 + y_offset, str, 0);
-
- y_offset += 11;
- }
-
- y_offset -= 11;
- } else {
- SetDParam(0, v->cargo_type);
- SetDParam(1, v->cargo_cap);
- DrawString(34, 67 + y_offset, STR_9012_CAPACITY, 0);
-
- str = STR_8812_EMPTY;
- if (!v->cargo.Empty()) {
- SetDParam(0, v->cargo_type);
- SetDParam(1, v->cargo.Count());
- SetDParam(2, v->cargo.Source());
- str = STR_8813_FROM;
- }
- DrawString(34, 78 + y_offset, str, 0);
- }
-
- /* Draw Transfer credits text */
- SetDParam(0, v->cargo.FeederShare());
- DrawString(34, 90 + y_offset, STR_FEEDER_CARGO_VALUE, 0);
-
- /* Draw service interval text */
- {
- SetDParam(0, v->service_interval);
- SetDParam(1, v->date_of_last_service);
- DrawString(13, 102 + y_offset, _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
- }
- } break;
-
- case WE_CLICK: {
- int mod;
- const Vehicle *v;
- switch (e->we.click.widget) {
- case 2: /* rename */
- v = GetVehicle(w->window_number);
- SetDParam(0, v->index);
- ShowQueryString(STR_VEHICLE_NAME, STR_902C_NAME_ROAD_VEHICLE, 31, 150, w, CS_ALPHANUMERAL);
- break;
-
- case 5: /* increase int */
- mod = _ctrl_pressed? 5 : 10;
- goto do_change_service_int;
- case 6: /* decrease int */
- mod = _ctrl_pressed? -5 : -10;
-do_change_service_int:
- v = GetVehicle(w->window_number);
-
- mod = GetServiceIntervalClamped(mod + v->service_interval);
- if (mod == v->service_interval) return;
-
- DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
- break;
- }
- } break;
-
- case WE_ON_EDIT_TEXT: {
- if (e->we.edittext.str[0] != '\0') {
- _cmd_text = e->we.edittext.str;
- DoCommandP(0, w->window_number, 0, NULL,
- CMD_NAME_VEHICLE | CMD_MSG(STR_902D_CAN_T_NAME_ROAD_VEHICLE));
- }
- } break;
-
}
}
-static const Widget _roadveh_details_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 14, 11, 339, 0, 13, STR_900C_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 340, 379, 0, 13, STR_01AA_NAME, STR_902E_NAME_ROAD_VEHICLE},
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 379, 14, 55, 0x0, STR_NULL},
-{ WWT_PANEL, RESIZE_BOTTOM, 14, 0, 379, 56, 100, 0x0, STR_NULL},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 101, 106, STR_0188, STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 107, 112, STR_0189, STR_884E_DECREASE_SERVICING_INTERVAL},
-{ WWT_PANEL, RESIZE_TB, 14, 11, 379, 101, 112, 0x0, STR_NULL},
-{ WIDGETS_END},
-};
-
-static const WindowDesc _roadveh_details_desc = {
- WDP_AUTO, WDP_AUTO, 380, 113, 380, 113,
- WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW,
- WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
- _roadveh_details_widgets,
- RoadVehDetailsWndProc
-};
-
-
-void ShowRoadVehDetailsWindow(const Vehicle *v)
-{
- Window *w;
- VehicleID veh = v->index;
-
- DeleteWindowById(WC_VEHICLE_ORDERS, veh);
- DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
- w = AllocateWindowDescFront(&_roadveh_details_desc, veh);
- w->caption_color = v->owner;
-}
-
void CcBuildRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
const Vehicle *v;
@@ -273,7 +128,7 @@
v = GetVehicle(_new_vehicle_id);
if (v->tile == _backup_orders_tile) {
_backup_orders_tile = 0;
- RestoreVehicleOrders(v, _backup_orders_data);
+ RestoreVehicleOrders(v);
}
ShowVehicleViewWindow(v);
}
--- a/src/saveload.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/saveload.h Sat Oct 06 21:16:00 2007 +0000
@@ -13,7 +13,7 @@
#define SIZE_MAX ((size_t)-1)
-static const uint NEWGRF_AIRPORTS_SAVEGAME = 75;
+static const uint NEWGRF_AIRPORTS_SAVEGAME = 80;
enum SaveOrLoadResult {
SL_OK = 0, ///< completed successfully
@@ -213,10 +213,10 @@
#define SLE_WRITEBYTE(base, variable, value) SLE_GENERAL(SL_WRITEBYTE, base, variable, 0, 0, value, value)
/* The same as the ones at the top, only the offset is given directly; used for unions */
-#define SLE_GENERALX(cmd, offset, type, len, param1, param2) {false, cmd, type, len, param1, param2, (void*)(offset)}
+#define SLE_GENERALX(cmd, offset, type, length, param1, param2) {false, cmd, type, length, param1, param2, (void*)(offset)}
#define SLE_CONDVARX(offset, type, from, to) SLE_GENERALX(SL_VAR, offset, type, 0, from, to)
+#define SLE_CONDARRX(offset, type, length, from, to) SLE_GENERALX(SL_ARR, offset, type, length, from, to)
#define SLE_CONDREFX(offset, type, from, to) SLE_GENERALX(SL_REF, offset, type, 0, from, to)
-#define SLE_CONDARRX(offset, type, length, from, to) SLE_GENERALX(SL_ARR, offset, type, length, from, to)
#define SLE_VARX(offset, type) SLE_CONDVARX(offset, type, 0, SL_MAX_VERSION)
#define SLE_REFX(offset, type) SLE_CONDREFX(offset, type, 0, SL_MAX_VERSION)
--- a/src/settings.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/settings.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1245,6 +1245,7 @@
SDTG_STR("videodriver", SLE_STRB,C|S,0, _ini_videodriver, NULL, STR_NULL, NULL),
SDTG_STR("musicdriver", SLE_STRB,C|S,0, _ini_musicdriver, NULL, STR_NULL, NULL),
SDTG_STR("sounddriver", SLE_STRB,C|S,0, _ini_sounddriver, NULL, STR_NULL, NULL),
+ SDTG_STR("blitter", SLE_STRB,C|S,0, _ini_blitter, NULL, STR_NULL, NULL),
SDTG_STR("language", SLE_STRB, S, 0, _dynlang.curr_file, NULL, STR_NULL, NULL),
SDTG_LIST("resolution", SLE_UINT16, S, 0, _cur_resolution, "640,480", STR_NULL, NULL),
SDTG_STR("screenshot_format",SLE_STRB, S, 0, _screenshot_format_name,NULL, STR_NULL, NULL),
@@ -1353,14 +1354,15 @@
SDT_VAR(Patches,right_mouse_btn_emulation,SLE_UINT8,S,MS,0, 0, 2, 0, STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU, NULL),
#endif
SDT_BOOL(Patches, pause_on_newgame, S, 0, false, STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME, NULL),
- SDT_BOOL(Patches, advanced_vehicle_list, S, 0, true, STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS, NULL),
+ SDT_VAR(Patches,advanced_vehicle_list,SLE_UINT8,S,MS, 1, 0, 2, 0, STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS,NULL),
SDT_BOOL(Patches, timetable_in_ticks, S, 0, false, STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS, NULL),
- SDT_BOOL(Patches, loading_indicators, S, 0, true, STR_CONFIG_PATCHES_LOADING_INDICATORS, RedrawScreen),
+ SDT_VAR(Patches, loading_indicators, SLE_UINT8, S,MS, 1, 0, 2, 0, STR_CONFIG_PATCHES_LOADING_INDICATORS, RedrawScreen),
SDT_VAR(Patches, default_rail_type, SLE_UINT8, S,MS, 4, 0, 6, 0, STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE, NULL),
/***************************************************************************/
/* Construction section of the GUI-configure patches window */
SDT_BOOL(Patches, build_on_slopes, 0, 0, true, STR_CONFIG_PATCHES_BUILDONSLOPES, NULL),
+ SDT_CONDBOOL(Patches, autoslope, 75, SL_MAX_VERSION, 0, 0, true, STR_CONFIG_PATCHES_AUTOSLOPE, NULL),
SDT_BOOL(Patches, extra_dynamite, 0, 0, false, STR_CONFIG_PATCHES_EXTRADYNAMITE, NULL),
SDT_BOOL(Patches, longbridges, 0, 0, true, STR_CONFIG_PATCHES_LONGBRIDGES, NULL),
SDT_BOOL(Patches, signal_side, N, 0, true, STR_CONFIG_PATCHES_SIGNALSIDE, RedrawScreen),
@@ -1427,6 +1429,8 @@
SDT_BOOL(Patches, multiple_industry_per_town, 0, 0, false, STR_CONFIG_PATCHES_MULTIPINDTOWN, NULL),
SDT_BOOL(Patches, same_industry_close, 0, 0, false, STR_CONFIG_PATCHES_SAMEINDCLOSE, NULL),
SDT_BOOL(Patches, bribe, 0, 0, true, STR_CONFIG_PATCHES_BRIBE, NULL),
+ SDT_CONDBOOL(Patches, exclusive_rights, 79, SL_MAX_VERSION, 0, 0, true, STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE, NULL),
+ SDT_CONDBOOL(Patches, give_money, 79, SL_MAX_VERSION, 0, 0, true, STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY, NULL),
SDT_VAR(Patches, snow_line_height,SLE_UINT8, 0, 0, 7, 2, 13, 0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT, NULL),
SDT_VAR(Patches, colored_news_year,SLE_INT32, 0,NC, 2000, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_COLORED_NEWS_YEAR,NULL),
SDT_VAR(Patches, starting_year, SLE_INT32, 0,NC, 1950, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_STARTING_YEAR,NULL),
@@ -1436,6 +1440,7 @@
SDT_CONDVAR(Patches, town_growth_rate, SLE_UINT8, 54, SL_MAX_VERSION, 0, MS, 2, 0, 4, 0, STR_CONFIG_PATCHES_TOWN_GROWTH, NULL),
SDT_CONDVAR(Patches, larger_towns, SLE_UINT8, 54, SL_MAX_VERSION, 0, D0, 4, 0, 255, 1, STR_CONFIG_PATCHES_LARGER_TOWNS, NULL),
SDT_CONDVAR(Patches, initial_city_size, SLE_UINT8, 56, SL_MAX_VERSION, 0, 0, 2, 1, 10, 1, STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER, NULL),
+ SDT_CONDBOOL(Patches, mod_road_rebuild, 77, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_MODIFIED_ROAD_REBUILD, NULL),
/***************************************************************************/
/* AI section of the GUI-configure patches window */
--- a/src/settings_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/settings_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -664,6 +664,7 @@
static const char *_patches_construction[] = {
"build_on_slopes",
+ "autoslope",
"extra_dynamite",
"longbridges",
"signal_side",
@@ -671,7 +672,6 @@
"drag_signals_density",
"oil_refinery_limit",
"semaphore_build_before",
- "town_layout",
};
static const char *_patches_stations[] = {
@@ -695,10 +695,14 @@
"multiple_industry_per_town",
"same_industry_close",
"bribe",
+ "exclusive_rights",
+ "give_money",
"colored_news_year",
"ending_year",
"smooth_economy",
"allow_shares",
+ "town_layout",
+ "mod_road_rebuild",
"town_growth_rate",
"larger_towns",
"initial_city_size",
--- a/src/ship_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ship_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1004,6 +1004,7 @@
* Now we change the setting to apply the new one and let the vehicle head for the same depot.
* Note: the if is (true for requesting service == true for ordered to stop in depot) */
if (flags & DC_EXEC) {
+ CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
}
@@ -1078,7 +1079,7 @@
SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN);
/* Check the refit capacity callback */
- if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+ if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
/* Back up the existing cargo type */
CargoID temp_cid = v->cargo_type;
byte temp_subtype = v->cargo_subtype;
--- a/src/ship_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/ship_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -27,153 +27,6 @@
}
}
-static void ShipDetailsWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT: {
- const Vehicle *v = GetVehicle(w->window_number);
- StringID str;
-
- SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
- /* disable service-scroller when interval is set to disabled */
- SetWindowWidgetDisabledState(w, 5, !_patches.servint_ships);
- SetWindowWidgetDisabledState(w, 6, !_patches.servint_ships);
-
- SetDParam(0, v->index);
- DrawWindowWidgets(w);
-
- /* Draw running cost */
- {
- int year = v->age / 366;
-
- SetDParam(1, year);
-
- SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
- SetDParam(2, v->max_age / 366);
- SetDParam(3, v->GetDisplayRunningCost());
- DrawString(2, 15, STR_9812_AGE_RUNNING_COST_YR, 0);
- }
-
- /* Draw max speed */
- {
- SetDParam(0, v->GetDisplayMaxSpeed());
- DrawString(2, 25, STR_9813_MAX_SPEED, 0);
- }
-
- /* Draw profit */
- {
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
- DrawString(2, 35, STR_9814_PROFIT_THIS_YEAR_LAST_YEAR, 0);
- }
-
- /* Draw breakdown & reliability */
- {
- SetDParam(0, v->reliability * 100 >> 16);
- SetDParam(1, v->breakdowns_since_last_service);
- DrawString(2, 45, STR_9815_RELIABILITY_BREAKDOWNS, 0);
- }
-
- /* Draw service interval text */
- {
- SetDParam(0, v->service_interval);
- SetDParam(1, v->date_of_last_service);
- DrawString(13, 102, _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
- }
-
- DrawShipImage(v, 3, 57, INVALID_VEHICLE);
-
- SetDParam(0, v->engine_type);
- SetDParam(1, v->build_year);
- SetDParam(2, v->value);
- DrawString(74, 57, STR_9816_BUILT_VALUE, 0);
-
- SetDParam(0, v->cargo_type);
- SetDParam(1, v->cargo_cap);
- DrawString(74, 67, STR_9817_CAPACITY, 0);
-
- str = STR_8812_EMPTY;
- if (!v->cargo.Empty()) {
- SetDParam(0, v->cargo_type);
- SetDParam(1, v->cargo.Count());
- SetDParam(2, v->cargo.Source());
- str = STR_8813_FROM;
- }
- DrawString(74, 78, str, 0);
-
- /* Draw Transfer credits text */
- SetDParam(0, v->cargo.FeederShare());
- DrawString(74, 89, STR_FEEDER_CARGO_VALUE, 0);
-
- } break;
-
- case WE_CLICK: {
- int mod;
- const Vehicle *v;
- switch (e->we.click.widget) {
- case 2: /* rename */
- v = GetVehicle(w->window_number);
- SetDParam(0, v->index);
- ShowQueryString(STR_VEHICLE_NAME, STR_9831_NAME_SHIP, 31, 150, w, CS_ALPHANUMERAL);
- break;
- case 5: /* increase int */
- mod = _ctrl_pressed? 5 : 10;
- goto do_change_service_int;
- case 6: /* decrease int */
- mod = _ctrl_pressed ? - 5 : -10;
-do_change_service_int:
- v = GetVehicle(w->window_number);
-
- mod = GetServiceIntervalClamped(mod + v->service_interval);
- if (mod == v->service_interval) return;
-
- DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
- break;
- }
- } break;
-
- case WE_ON_EDIT_TEXT:
- if (e->we.edittext.str[0] != '\0') {
- _cmd_text = e->we.edittext.str;
- DoCommandP(0, w->window_number, 0, NULL,
- CMD_NAME_VEHICLE | CMD_MSG(STR_9832_CAN_T_NAME_SHIP));
- }
- break;
- }
-}
-
-
-static const Widget _ship_details_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 14, 11, 364, 0, 13, STR_9811_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 365, 404, 0, 13, STR_01AA_NAME, STR_982F_NAME_SHIP},
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 404, 14, 55, 0x0, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 404, 56, 100, 0x0, STR_NULL},
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 10, 101, 106, STR_0188, STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 10, 107, 112, STR_0189, STR_884E_DECREASE_SERVICING_INTERVAL},
-{ WWT_PANEL, RESIZE_NONE, 14, 11, 404, 101, 112, 0x0, STR_NULL},
-{ WIDGETS_END},
-};
-
-static const WindowDesc _ship_details_desc = {
- WDP_AUTO, WDP_AUTO, 405, 113, 405, 113,
- WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
- WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
- _ship_details_widgets,
- ShipDetailsWndProc
-};
-
-void ShowShipDetailsWindow(const Vehicle *v)
-{
- Window *w;
- VehicleID veh = v->index;
-
- DeleteWindowById(WC_VEHICLE_ORDERS, veh);
- DeleteWindowById(WC_VEHICLE_DETAILS, veh);
- w = AllocateWindowDescFront(&_ship_details_desc, veh);
- w->caption_color = v->owner;
-}
-
void CcBuildShip(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
const Vehicle *v;
@@ -182,7 +35,39 @@
v = GetVehicle(_new_vehicle_id);
if (v->tile == _backup_orders_tile) {
_backup_orders_tile = 0;
- RestoreVehicleOrders(v, _backup_orders_data);
+ RestoreVehicleOrders(v);
}
ShowVehicleViewWindow(v);
}
+
+/**
+* Draw the details for the given vehicle at the position (x,y)
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+*/
+void DrawShipDetails(const Vehicle *v, int x, int y)
+{
+ SetDParam(0, v->engine_type);
+ SetDParam(1, v->build_year);
+ SetDParam(2, v->value);
+ DrawString(x, y, STR_9816_BUILT_VALUE, 0);
+
+ SetDParam(0, v->cargo_type);
+ SetDParam(1, v->cargo_cap);
+ DrawString(x, y + 10, STR_9817_CAPACITY, 0);
+
+ StringID str = STR_8812_EMPTY;
+ if (!v->cargo.Empty()) {
+ SetDParam(0, v->cargo_type);
+ SetDParam(1, v->cargo.Count());
+ SetDParam(2, v->cargo.Source());
+ str = STR_8813_FROM;
+ }
+ DrawString(x, y + 21, str, 0);
+
+ /* Draw Transfer credits text */
+ SetDParam(0, v->cargo.FeederShare());
+ DrawString(x, y + 33, STR_FEEDER_CARGO_VALUE, 0);
+}
--- a/src/signs.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/signs.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -60,10 +60,12 @@
}
/**
+ * Marks the region of a sign as dirty.
*
- * Marks the region of a sign as dirty
+ * This function marks the sign in all viewports as dirty for repaint.
*
* @param si Pointer to the Sign
+ * @ingroup dirty
*/
static void MarkSignDirty(Sign *si)
{
--- a/src/slope.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/slope.h Sat Oct 06 21:16:00 2007 +0000
@@ -41,6 +41,16 @@
};
/**
+ * Enumeration of tile corners
+ */
+enum Corner {
+ CORNER_W = 0,
+ CORNER_S = 1,
+ CORNER_E = 2,
+ CORNER_N = 3,
+};
+
+/**
* Checks if a slope is steep.
*
* @param s The given #Slope.
@@ -73,23 +83,70 @@
*
* @pre The slope must be a slope with one corner raised or a steep slope.
* @param s The #Slope.
- * @return Number of the highest corner. (0 west, 1 south, 2 east, 3 north)
+ * @return Highest corner.
*/
-static inline byte GetHighestSlopeCorner(Slope s)
+static inline Corner GetHighestSlopeCorner(Slope s)
{
switch (s) {
case SLOPE_W:
- case SLOPE_STEEP_W: return 0;
+ case SLOPE_STEEP_W: return CORNER_W;
case SLOPE_S:
- case SLOPE_STEEP_S: return 1;
+ case SLOPE_STEEP_S: return CORNER_S;
case SLOPE_E:
- case SLOPE_STEEP_E: return 2;
+ case SLOPE_STEEP_E: return CORNER_E;
case SLOPE_N:
- case SLOPE_STEEP_N: return 3;
+ case SLOPE_STEEP_N: return CORNER_N;
default: NOT_REACHED();
}
}
+/**
+ * Returns the height of the highest corner of a slope relative to TileZ (= minimal height)
+ *
+ * @param s The #Slope.
+ * @return Relative height of highest corner.
+ */
+static inline uint GetSlopeMaxZ(Slope s)
+{
+ if (s == SLOPE_FLAT) return 0;
+ if (IsSteepSlope(s)) return 2 * TILE_HEIGHT;
+ return TILE_HEIGHT;
+}
+
+/**
+ * Returns the opposite corner.
+ *
+ * @param corner A #Corner.
+ * @return The opposite corner to "corner".
+ */
+static inline Corner OppositeCorner(Corner corner)
+{
+ return (Corner)(corner ^ 2);
+}
+
+/**
+ * Returns the slope with a specific corner raised.
+ *
+ * @param corner The #Corner.
+ * @return The #Slope with corner "corner" raised.
+ */
+static inline Slope SlopeWithOneCornerRaised(Corner corner)
+{
+ assert(IS_INT_INSIDE(corner, 0, 4));
+ return (Slope)(1 << corner);
+}
+
+/**
+ * Returns the slope with all except one corner raised.
+ *
+ * @param corner The #Corner.
+ * @return The #Slope with all corners but "corner" raised.
+ */
+static inline Slope SlopeWithThreeCornersRaised(Corner corner)
+{
+ return ComplementSlope(SlopeWithOneCornerRaised(corner));
+}
+
/**
* Enumeration for Foundations.
--- a/src/sound.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sound.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -30,6 +30,7 @@
uint i;
FioOpenFile(SOUND_SLOT, filename);
+ uint pos = FioGetPos();
count = FioReadDword() / 8;
FileEntry *fe = CallocT<FileEntry>(count);
@@ -42,10 +43,11 @@
_file_count = count;
_files = fe;
- FioSeekTo(0, SEEK_SET);
+ FioSeekTo(pos, SEEK_SET);
for (i = 0; i != count; i++) {
- fe[i].file_offset = FioReadDword();
+ fe[i].file_slot = SOUND_SLOT;
+ fe[i].file_offset = FioReadDword() + pos;
fe[i].file_size = FioReadDword();
}
@@ -75,7 +77,8 @@
FioSeekTo(size - (2 + 2 + 4 + 4 + 2 + 1), SEEK_CUR);
} else if (tag == 'atad') {
fe->file_size = size;
- fe->file_offset = FioGetPos() | (SOUND_SLOT << 24);
+ fe->file_slot = SOUND_SLOT;
+ fe->file_offset = FioGetPos();
break;
} else {
fe->file_size = 0;
@@ -91,7 +94,8 @@
fe->channels = 1;
fe->rate = 11025;
fe->bits_per_sample = 8;
- fe->file_offset = FioGetPos() | (SOUND_SLOT << 24);
+ fe->file_slot = SOUND_SLOT;
+ fe->file_offset = FioGetPos();
}
}
}
@@ -114,7 +118,7 @@
int8 *mem = MallocT<int8>(fe->file_size);
if (mem == NULL) return false;
- FioSeekToFile(fe->file_offset);
+ FioSeekToFile(fe->file_slot, fe->file_offset);
FioReadBlock(mem, fe->file_size);
for (i = 0; i != fe->file_size; i++)
--- a/src/sound.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sound.h Sat Oct 06 21:16:00 2007 +0000
@@ -21,6 +21,7 @@
VARDEF MusicFileSettings msf;
struct FileEntry {
+ uint8 file_slot;
uint32 file_offset;
uint32 file_size;
uint16 rate;
--- a/src/sprite.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/sprite.h Sat Oct 06 21:16:00 2007 +0000
@@ -34,10 +34,10 @@
struct DrawBuildingsTileStruct {
PalSpriteID ground;
PalSpriteID building;
- byte subtile_x:4;
- byte subtile_y:4;
- byte width:4;
- byte height:4;
+ byte subtile_x;
+ byte subtile_y;
+ byte width;
+ byte height;
byte dz;
byte draw_proc; /* this allows to specify a special drawing procedure.*/
};
--- a/src/spritecache.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spritecache.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -25,6 +25,7 @@
struct SpriteCache {
void *ptr;
+ uint8 file_slot;
uint32 file_pos;
int16 lru;
uint32 id;
@@ -120,13 +121,14 @@
/* Special case for Sprite ID zero -- its position is also 0... */
if (id == 0) return true;
if (id >= _spritecache_items) return false;
- return GetSpriteCache(id)->file_pos != 0;
+ return !(GetSpriteCache(id)->file_pos == 0 && GetSpriteCache(id)->file_slot == 0);
}
void* AllocSprite(size_t);
static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite)
{
+ uint8 file_slot = sc->file_slot;
uint32 file_pos = sc->file_pos;
DEBUG(sprite, 9, "Load sprite %d", id);
@@ -136,7 +138,8 @@
/* SPR_IMG_QUERY is a BIG FAT RED ? */
id = SPR_IMG_QUERY;
- file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos;
+ file_slot = GetSpriteCache(SPR_IMG_QUERY)->file_slot;
+ file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos;
}
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 32) {
@@ -145,7 +148,7 @@
SpriteLoaderPNG sprite_loader;
SpriteLoader::Sprite sprite;
- if (sprite_loader.LoadSprite(&sprite, sc->grf_name, sc->id)) {
+ if (sprite_loader.LoadSprite(&sprite, sc->grf_name, 0, sc->id)) {
sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite);
free(sprite.data);
@@ -161,7 +164,7 @@
#endif /* WITH_PNG */
}
- FioSeekToFile(file_pos);
+ FioSeekToFile(file_slot, file_pos);
/* Read the size and type */
int num = FioReadWord();
@@ -232,7 +235,7 @@
SpriteLoaderGrf sprite_loader;
SpriteLoader::Sprite sprite;
- if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_pos)) return NULL;
+ if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_slot, file_pos)) return NULL;
if (id == 142) sprite.height = 10; // Compensate for a TTD bug
sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite);
free(sprite.data);
@@ -241,10 +244,10 @@
}
-bool LoadNextSprite(int load_index, byte file_index, uint file_sprite_id)
+bool LoadNextSprite(int load_index, byte file_slot, uint file_sprite_id)
{
SpriteCache *sc;
- uint32 file_pos = FioGetPos() | (file_index << 24);
+ uint32 file_pos = FioGetPos();
if (!ReadSpriteHeaderSkipData()) return false;
@@ -253,6 +256,7 @@
}
sc = AllocateSpriteCache(load_index);
+ sc->file_slot = file_slot;
sc->file_pos = file_pos;
sc->ptr = NULL;
sc->lru = 0;
@@ -280,6 +284,7 @@
SpriteCache *scold = GetSpriteCache(old_spr);
SpriteCache *scnew = AllocateSpriteCache(new_spr);
+ scnew->file_slot = scold->file_slot;
scnew->file_pos = scold->file_pos;
scnew->ptr = NULL;
scnew->id = scold->id;
--- a/src/spriteloader/grf.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/grf.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -8,10 +8,10 @@
#include "../debug.h"
#include "grf.hpp"
-bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos)
+bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos)
{
/* Open the right file and go to the correct position */
- FioSeekToFile(file_pos);
+ FioSeekToFile(file_slot, file_pos);
/* Read the size and type */
int num = FioReadWord();
--- a/src/spriteloader/grf.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/grf.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -12,7 +12,7 @@
/**
* Load a sprite from the disk and return a sprite struct which is the same for all loaders.
*/
- bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos);
+ bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos);
};
#endif /* SPRITELOADER_GRF_HPP */
--- a/src/spriteloader/png.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/png.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -180,7 +180,7 @@
return true;
}
-bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos)
+bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos)
{
if (!LoadPNG(sprite, filename, file_pos, false)) return false;
if (!LoadPNG(sprite, filename, file_pos, true)) return false;
--- a/src/spriteloader/png.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/png.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -12,7 +12,7 @@
/**
* Load a sprite from the disk and return a sprite struct which is the same for all loaders.
*/
- bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos);
+ bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos);
};
#endif /* SPRITELOADER_PNG_HPP */
--- a/src/spriteloader/spriteloader.hpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spriteloader/spriteloader.hpp Sat Oct 06 21:16:00 2007 +0000
@@ -26,7 +26,7 @@
/**
* Load a sprite from the disk and return a sprite struct which is the same for all loaders.
*/
- virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos) = 0;
+ virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) = 0;
virtual ~SpriteLoader() { }
};
--- a/src/station.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/station.h Sat Oct 06 21:16:00 2007 +0000
@@ -184,7 +184,19 @@
virtual ~Station();
void AddFacility(byte new_facility_bit, TileIndex facil_xy);
+
+ /**
+ * Mark the sign of a station dirty for repaint.
+ *
+ * @ingroup dirty
+ */
void MarkDirty() const;
+
+ /**
+ * Marks the tiles of the station as dirty.
+ *
+ * @ingroup dirty
+ */
void MarkTilesDirty(bool cargo_change) const;
bool TileBelongsToRailStation(TileIndex tile) const;
uint GetPlatformLength(TileIndex tile, DiagDirection dir) const;
--- a/src/station_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/station_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -42,6 +42,7 @@
#include "road.h"
#include "cargotype.h"
#include "strings.h"
+#include "autoslope.h"
#include "newgrf_fsmports.h"
DEFINE_OLD_POOL_GENERIC(Station, Station)
@@ -226,14 +227,14 @@
/* No industry */
if (!IsTileType(tile, MP_INDUSTRY)) return false;
- const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+ const Industry *ind = GetIndustryByTile(tile);
/* No extractive industry */
- if ((indsp->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false;
-
- for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+ if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false;
+
+ for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
/* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine */
- if (indsp->produced_cargo[i] != CT_INVALID && (GetCargo(indsp->produced_cargo[i])->classes & CC_LIQUID) == 0) return true;
+ if (ind->produced_cargo[i] != CT_INVALID && (GetCargo(ind->produced_cargo[i])->classes & CC_LIQUID) == 0) return true;
}
return false;
@@ -269,14 +270,14 @@
/* No industry */
if (!IsTileType(tile, MP_INDUSTRY)) return false;
- const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+ const Industry *ind = GetIndustryByTile(tile);
/* No extractive industry */
- if ((indsp->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
-
- for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+ if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
+
+ for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
/* The industry produces wood. */
- if (indsp->produced_cargo[i] != CT_INVALID && GetCargo(indsp->produced_cargo[i])->label == 'WOOD') return true;
+ if (ind->produced_cargo[i] != CT_INVALID && GetCargo(ind->produced_cargo[i])->label == 'WOOD') return true;
}
return false;
@@ -437,7 +438,14 @@
}
}
-// Update the station virt coords while making the modified parts dirty.
+/**
+ * Update the station virt coords while making the modified parts dirty.
+ *
+ * This function updates the virt coords and mark the modified parts as dirty
+ *
+ * @param st The station to update the virt coords
+ * @ingroup dirty
+ */
static void UpdateStationVirtCoordDirty(Station *st)
{
st->MarkDirty();
@@ -1316,22 +1324,14 @@
*/
CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec)
{
- const Station* st = GetStationByTile(tile);
-
- if (!CheckOwnership(st->owner) || !EnsureNoVehicle(tile)) return CMD_ERROR;
-
- // tile is not a railroad station?
+ /* Tile is not a railroad station? */
if (!IsRailwayStation(tile)) return CMD_ERROR;
- if (GetRailType(tile) == totype) return CMD_ERROR;
-
- // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled
- if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
if (exec) {
SetRailType(tile, totype);
MarkTileDirtyByTile(tile);
YapfNotifyTrackLayoutChange(tile, GetRailStationTrack(tile));
+ VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
}
return CommandCost(_price.build_rail / 2);
@@ -1803,7 +1803,7 @@
BEGIN_TILE_LOOP(tile_cur, w, h, tile)
byte layout = *layout_ptr++;
if ((byte)layout != (byte)255) {
- if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
+ if (!EnsureNoVehicleOnGround(tile_cur)) return CMD_ERROR;
if (flags & DC_EXEC) {
DeleteAnimatedTile(tile_cur);
@@ -2139,7 +2139,7 @@
relocation = GetCustomStationRelocation(statspec, st, ti->tile);
- if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+ if (HASBIT(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
if (callback != CALLBACK_FAILED) tile = (callback & ~1) + GetRailStationAxis(ti->tile);
}
@@ -2219,7 +2219,7 @@
HASBIT(_transparent_opt, TO_BUILDINGS)
);
} else {
- AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
+ AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y, HASBIT(_transparent_opt, TO_BUILDINGS));
}
}
}
@@ -2999,6 +2999,36 @@
static CommandCost TerraformTile_Station(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
+ if (_patches.build_on_slopes && AutoslopeEnabled()) {
+ /* TODO: If you implement newgrf callback 149 'land slope check', you have to decide what to do with it here.
+ * TTDP does not call it.
+ */
+ if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
+ switch (GetStationType(tile)) {
+ case STATION_RAIL: {
+ DiagDirection direction = AxisToDiagDir(GetRailStationAxis(tile));
+ if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, direction)) break;
+ if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, ReverseDiagDir(direction))) break;
+ return _price.terraform;
+ }
+
+ case STATION_AIRPORT:
+ return _price.terraform;
+
+ case STATION_TRUCK:
+ case STATION_BUS: {
+ DiagDirection direction = GetRoadStopDir(tile);
+ if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, direction)) break;
+ if (IsDriveThroughStopTile(tile)) {
+ if (!AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, ReverseDiagDir(direction))) break;
+ }
+ return _price.terraform;
+ }
+
+ default: break;
+ }
+ }
+ }
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
--- a/src/strings.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/strings.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -531,6 +531,12 @@
uint modifier = 0;
while ((b = Utf8Consume(&str)) != '\0') {
+ if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) {
+ /* We need to pass some stuff as it might be modified; oh boy. */
+ b = RemapNewGRFStringControlCode(b, &buff, &str, (int64*)argv);
+ if (b == 0) continue;
+ }
+
switch (b) {
case SCC_SETX: // {SETX}
if (buff + Utf8CharLen(SCC_SETX) + 1 < last) {
--- a/src/table/control_codes.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/control_codes.h Sat Oct 06 21:16:00 2007 +0000
@@ -6,7 +6,7 @@
/* List of string control codes used for string formatting, displaying, and
* by strgen to generate the language files. */
-enum {
+enum StringControlCode {
SCC_CONTROL_START = 0xE000,
SCC_CONTROL_END = 0xE1FF,
@@ -90,6 +90,28 @@
SCC_BLACK,
SCC_PREVIOUS_COLOUR,
+ /**
+ * The next variables are part of a NewGRF subsystem for creating text strings.
+ * It uses a "stack" of bytes and reads from there.
+ */
+ SCC_NEWGRF_FIRST,
+ SCC_NEWGRF_PRINT_DWORD = SCC_NEWGRF_FIRST, ///< Read 4 bytes from the stack
+ SCC_NEWGRF_PRINT_SIGNED_WORD, ///< Read 2 bytes from the stack as signed value
+ SCC_NEWGRF_PRINT_SIGNED_BYTE, ///< Read 1 bytes from the stack as signed value
+ SCC_NEWGRF_PRINT_UNSIGNED_WORD, ///< Read 2 bytes from the stack as unsigned value
+ SCC_NEWGRF_PRINT_DWORD_CURRENCY, ///< Read 4 bytes from the stack as currency
+ SCC_NEWGRF_PRINT_STRING_ID, ///< Read 2 bytes from the stack as String ID
+ SCC_NEWGRF_PRINT_DATE, ///< Read 2 bytes from the stack as base 1920 date
+ SCC_NEWGRF_PRINT_MONTH_YEAR, ///< Read 2 bytes from the stack as base 1920 date
+ SCC_NEWGRF_PRINT_WORD_SPEED, ///< Read 2 bytes from the stack as signed speed
+ SCC_NEWGRF_PRINT_WORD_LITRES, ///< Read 2 bytes from the stack as signed litres
+ SCC_NEWGRF_PRINT_QWORD_CURRENCY, ///< Read 8 bytes from the stack as currency
+ SCC_NEWGRF_PUSH_WORD, ///< Pushes 2 bytes onto the stack
+ SCC_NEWGRF_UNPRINT, ///< "Unprints" the given number of bytes from the string
+ SCC_NEWGRF_DISCARD_WORD, ///< Discard the next two bytes
+ SCC_NEWGRF_ROTATE_TOP_4_WORDS, ///< Rotate the top 4 words of the stack (W4 W1 W2 W3)
+ SCC_NEWGRF_LAST = SCC_NEWGRF_ROTATE_TOP_4_WORDS,
+
/* Special printable symbols.
* These are mapped to the original glyphs */
SCC_LESSTHAN = SCC_SPRITE_START + 0x3C,
--- a/src/table/elrail_data.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/elrail_data.h Sat Oct 06 21:16:00 2007 +0000
@@ -229,13 +229,13 @@
}
};
/* Geometric placement of the PCP relative to the tile origin */
-static const int8 x_pcp_offsets[DIAGDIR_END] = {0, 8, 15, 8};
-static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 15, 8, 0};
+static const int8 x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
+static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
/* Geometric placement of the PPP relative to the PCP*/
-static const int8 x_ppp_offsets[DIR_END] = {-3, -4, -3, 0, 3, 4, 3, 0};
-static const int8 y_ppp_offsets[DIR_END] = {-3, 0, 3, 4, 3, 0, -3, -4};
+static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
+static const int8 y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
/* The type of pylon to draw at each PPP */
-static const SpriteID pylons_normal[] = {
+static const SpriteID pylon_sprites[] = {
SPR_PYLON_EW_N,
SPR_PYLON_Y_NE,
SPR_PYLON_NS_E,
@@ -246,13 +246,6 @@
SPR_PYLON_X_NW
};
-static const SpriteID pylons_bridge[] = {
- SPR_PYLON_X_NW,
- SPR_PYLON_X_SE,
- SPR_PYLON_Y_NE,
- SPR_PYLON_Y_SW
-};
-
struct SortableSpriteStruct {
SpriteID image;
int8 x_offset;
@@ -265,9 +258,7 @@
enum {
/** Distance between wire and rail */
- ELRAIL_ELEVATION = 8,
- /** Corrects an off-by-one error in some places (tileh 12 and 9) (TODO -- find source of error) */
- ELRAIL_ELEV_CORR = ELRAIL_ELEVATION + 1,
+ ELRAIL_ELEVATION = 10,
/** Wires that a draw one level higher than the north corner. */
ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT
};
@@ -276,41 +267,41 @@
/* X direction */
/* Flat tiles: */
/* Wires */
- { SPR_WIRE_X_SW, 0, 8, 16, 1, 1, ELRAIL_ELEVATION }, //! 0: Wire in X direction, pylon on the SW end only
- { SPR_WIRE_X_NE, 0, 8, 16, 1, 1, ELRAIL_ELEVATION }, //! 1: Wire in X direction, pylon on the NE end
- { SPR_WIRE_X_SHORT, 0, 8, 16, 1, 1, ELRAIL_ELEVATION }, //! 2: Wire in X direction, pylon on both ends
+ { SPR_WIRE_X_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! 0: Wire in X direction, pylon on the SW end only
+ { SPR_WIRE_X_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! 1: Wire in X direction, pylon on the NE end
+ { SPR_WIRE_X_SHORT, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! 2: Wire in X direction, pylon on both ends
/* "up" tiles */
/* Wires */
- { SPR_WIRE_X_SW_UP, 0, 8, 16, 8, 1, ELRAIL_ELEVRAISE }, //! 3: Wire in X pitch up, pylon on the SW end only
- { SPR_WIRE_X_NE_UP, 0, 8, 16, 8, 1, ELRAIL_ELEVRAISE }, //! 4: Wire in X pitch up, pylon on the NE end
- { SPR_WIRE_X_SHORT_UP, 0, 8, 16, 8, 1, ELRAIL_ELEVRAISE }, //! 5: Wire in X pitch up, pylon on both ends
+ { SPR_WIRE_X_SW_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE }, //! 3: Wire in X pitch up, pylon on the SW end only
+ { SPR_WIRE_X_NE_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE }, //! 4: Wire in X pitch up, pylon on the NE end
+ { SPR_WIRE_X_SHORT_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE }, //! 5: Wire in X pitch up, pylon on both ends
/* "down" tiles */
/* Wires */
- { SPR_WIRE_X_SW_DOWN, 0, 8, 16, 8, 1, ELRAIL_ELEV_CORR }, //! 6: Wire in X pitch down, pylon on the SW end
- { SPR_WIRE_X_NE_DOWN, 0, 8, 16, 8, 1, ELRAIL_ELEV_CORR }, //! 7: Wire in X pitch down, pylon on the NE end
- { SPR_WIRE_X_SHORT_DOWN, 0, 8, 16, 8, 1, ELRAIL_ELEV_CORR }, //! 8: Wire in X pitch down, pylon on both ends
+ { SPR_WIRE_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 6: Wire in X pitch down, pylon on the SW end
+ { SPR_WIRE_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 7: Wire in X pitch down, pylon on the NE end
+ { SPR_WIRE_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION }, //! 8: Wire in X pitch down, pylon on both ends
/* Y direction */
/* Flat tiles: */
/* Wires */
- { SPR_WIRE_Y_SE, 8, 0, 1, 16, 1, ELRAIL_ELEVATION }, //! 9: Wire in Y direction, pylon on the SE end only
- { SPR_WIRE_Y_NW, 8, 0, 1, 16, 1, ELRAIL_ELEVATION }, //!10: Wire in Y direction, pylon on the NW end
- { SPR_WIRE_Y_SHORT, 8, 0, 1, 16, 1, ELRAIL_ELEVATION }, //!11: Wire in Y direction, pylon on both ends
+ { SPR_WIRE_Y_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! 9: Wire in Y direction, pylon on the SE end only
+ { SPR_WIRE_Y_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //!10: Wire in Y direction, pylon on the NW end
+ { SPR_WIRE_Y_SHORT, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //!11: Wire in Y direction, pylon on both ends
/* "up" tiles */
/* Wires */
- { SPR_WIRE_Y_SE_UP, 8, 0, 8, 16, 1, ELRAIL_ELEVRAISE }, //!12: Wire in Y pitch up, pylon on the SE end only
- { SPR_WIRE_Y_NW_UP, 8, 0, 8, 16, 1, ELRAIL_ELEVRAISE }, //!13: Wire in Y pitch up, pylon on the NW end
- { SPR_WIRE_Y_SHORT_UP, 8, 0, 8, 16, 1, ELRAIL_ELEVRAISE }, //!14: Wire in Y pitch up, pylon on both ends
+ { SPR_WIRE_Y_SE_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE }, //!12: Wire in Y pitch up, pylon on the SE end only
+ { SPR_WIRE_Y_NW_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE }, //!13: Wire in Y pitch up, pylon on the NW end
+ { SPR_WIRE_Y_SHORT_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE }, //!14: Wire in Y pitch up, pylon on both ends
/* "down" tiles */
/* Wires */
- { SPR_WIRE_Y_SE_DOWN, 8, 0, 8, 16, 1, ELRAIL_ELEV_CORR }, //!15: Wire in Y pitch down, pylon on the SE end
- { SPR_WIRE_Y_NW_DOWN, 8, 0, 8, 16, 1, ELRAIL_ELEV_CORR }, //!16: Wire in Y pitch down, pylon on the NW end
- { SPR_WIRE_Y_SHORT_DOWN, 8, 0, 8, 16, 1, ELRAIL_ELEV_CORR }, //!17: Wire in Y pitch down, pylon on both ends
+ { SPR_WIRE_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!15: Wire in Y pitch down, pylon on the SE end
+ { SPR_WIRE_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!16: Wire in Y pitch down, pylon on the NW end
+ { SPR_WIRE_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION }, //!17: Wire in Y pitch down, pylon on both ends
/* NS Direction */
{ SPR_WIRE_NS_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION }, //!18: LEFT trackbit wire, pylon on both ends
@@ -323,28 +314,28 @@
{ SPR_WIRE_NS_S, 0, 8, 8, 8, 1, ELRAIL_ELEVATION }, //!23: RIGHT trackbit wire, pylon on S end
/* EW Direction */
- { SPR_WIRE_EW_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION }, //!24: UPPER trackbit wire, pylon on both ends
- { SPR_WIRE_EW_SHORT, 16, 8, 8, 8, 1, ELRAIL_ELEVATION }, //!25: LOWER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_SHORT, 7, 0, 1, 1, 1, ELRAIL_ELEVATION }, //!24: UPPER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_SHORT, 15, 8, 3, 3, 1, ELRAIL_ELEVATION }, //!25: LOWER trackbit wire, pylon on both ends
- { SPR_WIRE_EW_W, 8, 0, 8, 8, 1, ELRAIL_ELEVATION }, //!28: UPPER trackbit wire, pylon on both ends
- { SPR_WIRE_EW_W, 16, 8, 8, 8, 1, ELRAIL_ELEVATION }, //!29: LOWER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_W, 7, 0, 1, 1, 1, ELRAIL_ELEVATION }, //!28: UPPER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_W, 15, 8, 3, 3, 1, ELRAIL_ELEVATION }, //!29: LOWER trackbit wire, pylon on both ends
- { SPR_WIRE_EW_E, 8, 0, 8, 8, 1, ELRAIL_ELEVATION }, //!32: UPPER trackbit wire, pylon on both ends
- { SPR_WIRE_EW_E, 16, 8, 8, 8, 1, ELRAIL_ELEVATION } //!33: LOWER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_E, 7, 0, 1, 1, 1, ELRAIL_ELEVATION }, //!32: UPPER trackbit wire, pylon on both ends
+ { SPR_WIRE_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION } //!33: LOWER trackbit wire, pylon on both ends
};
static const SortableSpriteStruct CatenarySpriteData_Depot[] = {
- { SPR_WIRE_DEPOT_NE, 0, 8, 8, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE depot exit
- { SPR_WIRE_DEPOT_SE, 8, 0, 1, 8, 1, ELRAIL_ELEVATION }, //! Wire for SE depot exit
- { SPR_WIRE_DEPOT_SW, 0, 8, 8, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW depot exit
- { SPR_WIRE_DEPOT_NW, 8, 0, 1, 8, 1, ELRAIL_ELEVATION } //! Wire for NW depot exit
+ { SPR_WIRE_DEPOT_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE depot exit
+ { SPR_WIRE_DEPOT_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE depot exit
+ { SPR_WIRE_DEPOT_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW depot exit
+ { SPR_WIRE_DEPOT_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW depot exit
};
static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = {
- { SPR_WIRE_TUNNEL_NE, 0, 8, 8, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit
- { SPR_WIRE_TUNNEL_SE, 8, 0, 1, 8, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit
- { SPR_WIRE_TUNNEL_SW, 0, 8, 8, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit
- { SPR_WIRE_TUNNEL_NW, 8, 0, 1, 8, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel exit
+ { SPR_WIRE_TUNNEL_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit
+ { SPR_WIRE_TUNNEL_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit
+ { SPR_WIRE_TUNNEL_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit
+ { SPR_WIRE_TUNNEL_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel exit
};
--- a/src/table/industry_land.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/industry_land.h Sat Oct 06 21:16:00 2007 +0000
@@ -39,7 +39,7 @@
* @param dz virtual height of the sprite
* @param p this allows to specify a special drawing procedure.
* @see DrawBuildingsTileStruct */
-#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w - 1, h - 1, dz, p }
+#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p }
/** Structure for industry tiles drawing */
static const DrawBuildingsTileStruct _industry_draw_tile_data[NEW_INDUSTRYTILEOFFSET * 4] = {
--- a/src/table/sprites.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/sprites.h Sat Oct 06 21:16:00 2007 +0000
@@ -184,8 +184,11 @@
/* One way road sprites */
SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + 113,
+ /* Not really a sprite, but an empty bounding box. Used to construct bounding boxes, that help sorting the sprites, but do not have a sprite associated. */
+ SPR_EMPTY_BOUNDING_BOX = SPR_ONEWAY_BASE + 6,
+
/* Flags sprites (in same order as enum NetworkLanguage) */
- SPR_FLAGS_BASE = SPR_ONEWAY_BASE + 6,
+ SPR_FLAGS_BASE = SPR_EMPTY_BOUNDING_BOX + 1,
/* Manager face sprites */
SPR_GRADIENT = 874, // background gradient behind manager face
--- a/src/table/town_land.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/table/town_land.h Sat Oct 06 21:16:00 2007 +0000
@@ -15,7 +15,7 @@
* @param dz the virtual height of the sprite
* @param p set to 1 if a lift is present ()
* @see DrawBuildingsTileStruct */
-#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w - 1, h - 1, dz, p}
+#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p}
/** structure of houses graphics*/
static const DrawBuildingsTileStruct _town_draw_tile_data[] = {
--- a/src/terraform_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/terraform_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -109,7 +109,7 @@
DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
break;
case DDSP_LEVEL_AREA:
- DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO);
+ DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND);
break;
case DDSP_CREATE_ROCKS:
GenerateRockyArea(end_tile, start_tile);
@@ -118,7 +118,7 @@
GenerateDesertArea(end_tile, start_tile);
break;
case DDSP_CREATE_WATER:
- DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
+ DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_BUILD_CANALS));
break;
default:
return false;
@@ -148,7 +148,7 @@
{
DoCommandP(
tile, SLOPE_N, 1, CcTerraform,
- CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)
+ CMD_TERRAFORM_LAND | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)
);
}
@@ -156,7 +156,7 @@
{
DoCommandP(
tile, SLOPE_N, 0, CcTerraform,
- CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)
+ CMD_TERRAFORM_LAND | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)
);
}
--- a/src/texteff.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/texteff.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -256,9 +256,18 @@
_chatmessage_dirty = false;
}
-/** Text Effects */
+/* Text Effects */
+/**
+ * Mark the area of the text effect as dirty.
+ *
+ * This function marks the area of a text effect as dirty for repaint.
+ *
+ * @param te The TextEffect to mark the area dirty
+ * @ingroup dirty
+ */
static void MarkTextEffectAreaDirty(TextEffect *te)
{
+ /* Width and height of the text effect are doubled, so they are correct in both zoom out levels 1x and 2x. */
MarkAllViewportsDirty(
te->x,
te->y - 1,
@@ -321,6 +330,15 @@
te->params_1 = GetDParam(0);
te->params_2 = GetDParam(4);
+ /* Update width of text effect */
+ char buffer[100];
+ GetString(buffer, msg, lastof(buffer));
+ int w = GetStringBoundingBox(buffer).width;
+
+ /* Only allow to make it broader, so it completely covers the old text. That avoids remnants of the old text. */
+ int right_new = te->x + w;
+ if (te->right < right_new) te->right = right_new;
+
MarkTextEffectAreaDirty(te);
}
--- a/src/town_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/town_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -41,6 +41,7 @@
#include "newgrf_commons.h"
#include "newgrf_townname.h"
#include "misc/autoptr.hpp"
+#include "autoslope.h"
/* Initialize the town-pool */
DEFINE_OLD_POOL_GENERIC(Town, Town)
@@ -97,6 +98,13 @@
// Local
static int _grow_town_result;
+/* Describe the possible states */
+enum TownGrowthResult {
+ GROWTH_SUCCEED = -1,
+ GROWTH_SEARCH_STOPPED = 0
+// GROWTH_SEARCH_RUNNING >= 1
+};
+
static bool BuildTownHouse(Town *t, TileIndex tile);
static void DoBuildTownHouse(Town *t, TileIndex tile);
@@ -122,6 +130,16 @@
}
/**
+ * Return a random direction
+ *
+ * @return a random direction
+ */
+static inline DiagDirection RandomDiagDir()
+{
+ return (DiagDirection)(3 & Random());
+}
+
+/**
* House Tile drawing handler.
* Part of the tile loop process
* @param ti TileInfo of the tile to draw
@@ -160,8 +178,8 @@
AddSortableSpriteToDraw(image, dcts->building.pal,
ti->x + dcts->subtile_x,
ti->y + dcts->subtile_y,
- dcts->width + 1,
- dcts->height + 1,
+ dcts->width,
+ dcts->height,
dcts->dz,
ti->z,
HASBIT(_transparent_opt, TO_HOUSES)
@@ -256,8 +274,12 @@
}
/**
- * Marks the town sign as needing a repaint
- * @param t Town requesting repaint
+ * Marks the town sign as needing a repaint.
+ *
+ * This function marks the area of the sign of a town as dirty for repaint.
+ *
+ * @param t Town requesting town sign for repaint
+ * @ingroup dirty
*/
static void MarkTownSignDirty(Town *t)
{
@@ -332,7 +354,7 @@
if (GetHouseConstructionTick(tile) != 0) return;
/* Check and/or */
- if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_CONSTRUCTION_STATE_CHANGE)) {
+ if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_HOUSE_CONSTRUCTION_STATE_CHANGE)) {
uint16 callback_res = GetHouseCallback(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(tile, callback_res);
}
@@ -520,7 +542,7 @@
}
/* Check for custom cargo acceptance */
- if (HASBIT(hs->callback_mask, CBM_CARGO_ACCEPTANCE)) {
+ if (HASBIT(hs->callback_mask, CBM_HOUSE_CARGO_ACCEPTANCE)) {
uint16 callback = GetHouseCallback(CBID_HOUSE_CARGO_ACCEPTANCE, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
if (callback != CALLBACK_FAILED) {
if (accepts[0] != CT_INVALID) ac[accepts[0]] = GB(callback, 0, 4);
@@ -563,29 +585,6 @@
/* not used */
}
-
-static const TileIndexDiffC _roadblock_tileadd[] = {
- { 0, -1},
- { 1, 0},
- { 0, 1},
- {-1, 0},
-
- /* Store the first 3 elements again.
- * Lets us rotate without using &3. */
- { 0, -1},
- { 1, 0},
- { 0, 1}
-};
-
-/**
- * Distance multiplyer
- * Defines the possible distances between 2 road tiles
- */
-enum RoadBlockTitleDistance {
- RB_TILE_DIST1 = 1, ///< 1 tile between
- RB_TILE_DIST2, ///< 2 tiles between
-};
-
static bool GrowTown(Town *t);
static void TownTickHandler(Town *t)
@@ -623,7 +622,15 @@
}
}
-static RoadBits GetTownRoadMask(TileIndex tile)
+/**
+ * Return the RoadBits of a tile
+ *
+ * @note There are many other functions doing things like that.
+ * @note Needs to be checked for needlessness.
+ * @param tile The tile we want to analyse
+ * @return The roadbits of the given tile
+ */
+static RoadBits GetTownRoadBits(TileIndex tile)
{
TrackBits b = GetAnyRoadTrackBits(tile, ROADTYPE_ROAD);
RoadBits r = ROAD_NONE;
@@ -645,22 +652,48 @@
* @param dir target direction
* @param dist_multi distance multiplyer
* @return true if one of the neighboring tiles at the
- * given distance is a road tile else
+ * given distance is a road tile else false
*/
-static bool IsNeighborRoadTile(TileIndex tile, int dir, RoadBlockTitleDistance dist_multi)
+static bool IsNeighborRoadTile(TileIndex tile, DiagDirection dir, uint dist_multi)
{
- return (HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * ToTileIndexDiff(_roadblock_tileadd[dir + 1]))), dir ^ 2) ||
- HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * ToTileIndexDiff(_roadblock_tileadd[dir + 3]))), dir ^ 2) ||
- HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * (ToTileIndexDiff(_roadblock_tileadd[dir + 1]) + ToTileIndexDiff(_roadblock_tileadd[dir + 2])))), dir) ||
- HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * (ToTileIndexDiff(_roadblock_tileadd[dir + 3]) + ToTileIndexDiff(_roadblock_tileadd[dir + 2])))), dir));
+ static TileIndexDiff tid_lt[3]; // lookup table for the used diff values
+ tid_lt[0] = TileOffsByDiagDir(ChangeDiagDir(dir, DIAGDIRDIFF_90RIGHT));
+ tid_lt[1] = TileOffsByDiagDir(ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT));
+ tid_lt[2] = TileOffsByDiagDir(ReverseDiagDir(dir));
+
+ /* We add 1 to the distance because we want to get 1 for
+ * the min distance multiplyer and not 0.
+ * Therefore we start at 4. The 4 is used because
+ * there are 4 tiles per distance step to check.
+ */
+ dist_multi = (dist_multi + 1) * 4;
+ for (uint pos = 4; pos < dist_multi; pos++) {
+ TileIndexDiff cur = 0;
+ /* For each even value of pos add the right TileIndexDiff
+ * for each uneven value the left TileIndexDiff
+ * for each with 2nd bit set (2,3,6,7,..) add the reversed TileIndexDiff
+ */
+ cur += tid_lt[(pos & 1) ? 0 : 1];
+ if (pos & 2) cur += tid_lt[2];
+
+ cur = (uint)(pos / 4) * cur; // Multiply for the fitting distance
+ if (GetTownRoadBits(TILE_ADD(tile, cur)) & DiagDirToRoadBits((pos & 2) ? dir : ReverseDiagDir(dir))) return true;
+ }
+ return false;
}
-static bool IsRoadAllowedHere(TileIndex tile, int dir)
+/**
+ * Check if a Road is allowed on a given tile
+ *
+ * @param tile The target tile
+ * @param dir The direction in which we want to extend the town
+ * @return true if it is allowed else false
+ */
+static bool IsRoadAllowedHere(TileIndex tile, DiagDirection dir)
{
if (TileX(tile) < 2 || TileY(tile) < 2 || MapMaxX() <= TileX(tile) || MapMaxY() <= TileY(tile)) return false;
- Slope k;
- Slope slope;
+ Slope cur_slope, desired_slope;
/* If this assertion fails, it might be because the world contains
* land at the edges. This is not ok. */
@@ -668,47 +701,44 @@
for (;;) {
/* Check if there already is a road at this point? */
- if (GetAnyRoadTrackBits(tile, ROADTYPE_ROAD) == 0) {
+ if (GetTownRoadBits(tile) == ROAD_NONE) {
/* No, try to build one in the direction.
* if that fails clear the land, and if that fails exit.
* This is to make sure that we can build a road here later. */
- if (CmdFailed(DoCommand(tile, (dir & ROAD_NW ? ROAD_X : ROAD_Y), 0, DC_AUTO, CMD_BUILD_ROAD)) &&
+ if (CmdFailed(DoCommand(tile, ((dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? ROAD_X : ROAD_Y), 0, DC_AUTO, CMD_BUILD_ROAD)) &&
CmdFailed(DoCommand(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR)))
return false;
}
- slope = GetTileSlope(tile, NULL);
- if (slope == SLOPE_FLAT) {
+ cur_slope = GetTileSlope(tile, NULL);
+ if (cur_slope == SLOPE_FLAT) {
no_slope:
/* Tile has no slope */
switch (_patches.town_layout) {
default: NOT_REACHED();
case TL_ORIGINAL: /* Disallow the road if any neighboring tile has a road (distance: 1) */
- return !IsNeighborRoadTile(tile, dir, RB_TILE_DIST1);
+ return !IsNeighborRoadTile(tile, dir, 1);
case TL_BETTER_ROADS: /* Disallow the road if any neighboring tile has a road (distance: 1 and 2). */
- return !(IsNeighborRoadTile(tile, dir, RB_TILE_DIST1) ||
- IsNeighborRoadTile(tile, dir, RB_TILE_DIST2));
+ return !IsNeighborRoadTile(tile, dir, 2);
}
}
/* If the tile is not a slope in the right direction, then
* maybe terraform some. */
- k = (dir & ROAD_NW) ? SLOPE_NE : SLOPE_NW;
- if (k != slope && ComplementSlope(k) != slope) {
+ desired_slope = (dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? SLOPE_NE : SLOPE_NW;
+ if (desired_slope != cur_slope && ComplementSlope(desired_slope) != cur_slope) {
uint32 r = Random();
if (CHANCE16I(1, 8, r) && !_generating_world) {
CommandCost res;
if (CHANCE16I(1, 16, r)) {
- res = DoCommand(tile, slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER,
- CMD_TERRAFORM_LAND);
+ res = DoCommand(tile, cur_slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
} else {
/* Note: Do not replace " ^ 0xF" with ComplementSlope(). The slope might be steep. */
- res = DoCommand(tile, slope ^ 0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER,
- CMD_TERRAFORM_LAND);
+ res = DoCommand(tile, cur_slope ^ 0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
}
if (CmdFailed(res) && CHANCE16I(1, 3, r)) {
/* We can consider building on the slope, though. */
@@ -755,101 +785,169 @@
*
* @param t current town
* @param tile tile in reference to the town
+ * @param dir The direction to which we are growing ATM
* @return the RoadBit of the current tile regarding
* the selected town layout
*/
-static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile)
+static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile, DiagDirection dir)
{
/* align the grid to the downtown */
- TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); ///< Vector from downtown to the tile
-
- /* lx, ly description:
- * @li lx and ly are true if the tile is a crossing tile.
- * @li lx xor ly are true if the tile is a straight road tile.
- * @li lx and ly are false if the tile is a house tile.
- */
- bool lx, ly;
+ TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); // Vector from downtown to the tile
+ RoadBits rcmd = ROAD_NONE;
switch (_patches.town_layout) {
default: NOT_REACHED();
case TL_2X2_GRID:
- lx = ((grid_pos.x % 3) == 0);
- ly = ((grid_pos.y % 3) == 0);
+ if ((grid_pos.x % 3) == 0) rcmd |= ROAD_Y;
+ if ((grid_pos.y % 3) == 0) rcmd |= ROAD_X;
break;
case TL_3X3_GRID:
- lx = ((grid_pos.x % 4) == 0);
- ly = ((grid_pos.y % 4) == 0);
+ if ((grid_pos.x % 4) == 0) rcmd |= ROAD_Y;
+ if ((grid_pos.y % 4) == 0) rcmd |= ROAD_X;
break;
}
- /* generate the basic grid structure */
- if (!lx && !ly) { ///< It is a house tile
- return ROAD_NONE;
- } else if (lx && !ly) { ///< It is a Y-dir road tile
- return ROAD_Y;
- } else if (!lx && ly) { ///< It is a X-dir road tile
- return ROAD_X;
- } else { ///< It is a crossing tile
- /* Presets for junctions on slopes
- * not nice :( */
+ /* Stop if the tile is not a part of the grid lines */
+ if (rcmd == ROAD_NONE) return rcmd;
+
+ /* Optimise only X-junctions */
+ if (COUNTBITS(rcmd) != 2) {
+ RoadBits rb_template;
+
switch (GetTileSlope(tile, NULL)) {
- case SLOPE_W:
- return ROAD_NW | ROAD_SW;
- case SLOPE_S:
- return ROAD_SE | ROAD_SW;
- case SLOPE_SW:
- return ROAD_Y | ROAD_SW;
- case SLOPE_E:
- return ROAD_NE | ROAD_SE;
- case SLOPE_SE:
- return ROAD_X | ROAD_SE;
- case SLOPE_N:
- return ROAD_NW | ROAD_NE;
- case SLOPE_NW:
- return ROAD_X | ROAD_NW;
- case SLOPE_NE:
- return ROAD_Y | ROAD_NE;
+ default: rb_template = ROAD_ALL; break;
+ case SLOPE_W: rb_template = ROAD_NW | ROAD_SW; break;
+ case SLOPE_SW: rb_template = ROAD_Y | ROAD_SW; break;
+ case SLOPE_S: rb_template = ROAD_SW | ROAD_SE; break;
+ case SLOPE_SE: rb_template = ROAD_X | ROAD_SE; break;
+ case SLOPE_E: rb_template = ROAD_SE | ROAD_NE; break;
+ case SLOPE_NE: rb_template = ROAD_Y | ROAD_NE; break;
+ case SLOPE_N: rb_template = ROAD_NE | ROAD_NW; break;
+ case SLOPE_NW: rb_template = ROAD_X | ROAD_NW; break;
case SLOPE_STEEP_W:
- case SLOPE_STEEP_N:
- return ROAD_X;
case SLOPE_STEEP_S:
case SLOPE_STEEP_E:
- return ROAD_Y;
- default:
- return ROAD_ALL;
+ case SLOPE_STEEP_N:
+ rb_template = ROAD_NONE;
+ break;
}
+
+ /* Stop if the template is compatible to the growth dir */
+ if (DiagDirToRoadBits(ReverseDiagDir(dir)) & rb_template) return rb_template;
+ /* If not generate a straight road in the direction of the growth */
+ return DiagDirToRoadBits(dir) | DiagDirToRoadBits(ReverseDiagDir(dir));
}
+
+ return rcmd;
}
/**
- * Check there are enougth neighbor house tiles next to the current tile
+ * Grows the town with an extra house.
+ * Check if there are enough neighbor house tiles
+ * next to the current tile. If there are enough
+ * add another house.
*
- * @param tile current tile
- * @return true if there are more than 2 house tiles next
- * to the current one
+ * @param t The current town
+ * @param tile The target tile for the extra house
+ * @return true if an extra house has been added
*/
-static bool AreNeighborsHouseTiles(TileIndex tile)
+static bool GrowTownWithExtraHouse(Town *t, TileIndex tile)
{
- uint counter = 0; ///< counts the house neighbor tiles
-
/* We can't look further than that. */
- if (TileX(tile) < 1 || TileY(tile) < 1) {
- return false;
+ if (TileX(tile) < 2 || TileY(tile) < 2 || MapMaxX() <= TileX(tile) || MapMaxY() <= TileY(tile)) return false;
+
+ uint counter = 0; // counts the house neighbor tiles
+
+ /* Check the tiles E,N,W and S of the current tile for houses */
+ for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
+
+ if (IsTileType(TileAddByDiagDir(tile, dir), MP_HOUSE)) counter++;
+
+ /* If there are enough neighbors stop here */
+ if (counter >= 3) {
+ if (BuildTownHouse(t, tile)) {
+ _grow_town_result = GROWTH_SUCCEED;
+ return true;
+ }
+ return false;
+ }
}
-
- /* Check the tiles E,N,W and S of the current tile. */
- for (uint i = 0; i < 4; i++) {
- if (IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i])), MP_HOUSE)) {
- counter++;
+ return false;
+}
+
+/**
+ * Grows the town with a road piece.
+ *
+ * @param t The current town
+ * @param tile The current tile
+ * @param rcmd The RoadBits we want to build on the tile
+ * @return true if the RoadBits have been added else false
+ */
+static bool GrowTownWithRoad(const Town *t, TileIndex tile, RoadBits rcmd)
+{
+ if (CmdSucceeded(DoCommand(tile, rcmd, t->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD))) {
+ _grow_town_result = GROWTH_SUCCEED;
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Grows the town with a bridge.
+ * At first we check if a bridge is reasonable.
+ * If so we check if we are able to build it.
+ *
+ * @param t The current town
+ * @param tile The current tile
+ * @param rcmd The RoadBits which are possible on this tile
+ * @return true if a bridge has been build else false
+ */
+static bool GrowTownWithBridge(const Town *t, TileIndex tile, RoadBits rcmd)
+{
+ DiagDirection bridge_dir; // The direction of a bridge we maybe want to build
+
+ /* Determine direction of slope,
+ * and build a road if not a special slope. */
+ switch (GetTileSlope(tile, NULL)) {
+ case SLOPE_SW: bridge_dir = DIAGDIR_NE; break;
+ case SLOPE_SE: bridge_dir = DIAGDIR_NW; break;
+ case SLOPE_NW: bridge_dir = DIAGDIR_SE; break;
+ case SLOPE_NE: bridge_dir = DIAGDIR_SW; break;
+
+ default: return false;
+ }
+
+ /* Check if the bridge will be compatible to the RoadBits */
+ if (!(rcmd & DiagDirToRoadBits(ReverseDiagDir(bridge_dir)))) return false;
+
+ /* We are in the right direction */
+ uint32 bridge_length = 0; // This value stores the length of the possible bridge
+ TileIndex bridge_tile = tile; // Used to store the other waterside
+
+ do {
+ if (bridge_length++ >= 11) {
+ /* Max 11 tile long bridges */
+ return false;
}
-
- /* If there are enougth neighbor's stop it here */
- if (counter >= 3) {
+ bridge_tile = TILE_MASK(bridge_tile + TileOffsByDiagDir(bridge_dir));
+ } while (IsClearWaterTile(bridge_tile));
+
+ /* no water tiles in between? */
+ if (bridge_length == 1) return false;
+
+ for (uint8 times = 0; times <= 22; times++) {
+ byte bridge_type = RandomRange(MAX_BRIDGES - 1);
+
+ /* Can we actually build the bridge? */
+ if (CmdSucceeded(DoCommand(tile, bridge_tile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE))) {
+ DoCommand(tile, bridge_tile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_EXEC | DC_AUTO, CMD_BUILD_BRIDGE);
+ _grow_town_result = GROWTH_SUCCEED;
return true;
}
}
+ /* Quit if it selecting an appropiate bridge type fails a large number of times. */
return false;
}
@@ -857,37 +955,31 @@
* Grows the given town.
* There are at the moment 3 possible way's for
* the town expansion:
- * @li Generate a random tile and check if there is a road allowed
- * @li TL_ORIGINAL
- * @li TL_BETTER_ROADS
- * @li Check if the town geometry allows a road and which one
- * @li TL_2X2_GRID
- * @li TL_3X3_GRID
- * @li Forbid roads, only build houses
- * @li TL_NO_ROADS
+ * @li Generate a random tile and check if there is a road allowed
+ * @li TL_ORIGINAL
+ * @li TL_BETTER_ROADS
+ * @li Check if the town geometry allows a road and which one
+ * @li TL_2X2_GRID
+ * @li TL_3X3_GRID
+ * @li Forbid roads, only build houses
+ * @li TL_NO_ROADS
*
- * @param tile_ptr current tile
- * @param mask current tiles RoadBits
- * @param block road block
- * @param t1 current town
+ * @param tile_ptr The current tile
+ * @param cur_rb The current tiles RoadBits
+ * @param target_dir The target road dir
+ * @param t1 The current town
*/
-static void GrowTownInTile(TileIndex* tile_ptr, RoadBits mask, int block, Town* t1)
+static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection target_dir, Town *t1)
{
- RoadBits rcmd;
- TileIndex tmptile;
- DiagDirection i;
- int j;
- TileIndex tile = *tile_ptr;
+ RoadBits rcmd = ROAD_NONE; // RoadBits for the road construction command
+ TileIndex tile = *tile_ptr; // The main tile on which we base our growth
TILE_ASSERT(tile);
- if (mask == 0) {
- int a;
- int b;
-
+ if (cur_rb == ROAD_NONE) {
/* Tile has no road. First reset the status counter
* to say that this is the last iteration. */
- _grow_town_result = 0;
+ _grow_town_result = GROWTH_SEARCH_STOPPED;
/* Remove hills etc */
LevelTownLand(tile);
@@ -901,37 +993,29 @@
case TL_3X3_GRID:
case TL_2X2_GRID:
- rcmd = GetTownRoadGridElement(t1, tile);
- if (rcmd == ROAD_NONE) {
- return;
- }
+ rcmd = GetTownRoadGridElement(t1, tile, target_dir);
+ if (rcmd == ROAD_NONE) return;
break;
case TL_BETTER_ROADS:
case TL_ORIGINAL:
- if (!IsRoadAllowedHere(tile, block)) {
- return;
- }
-
- /* Randomize new road block numbers */
- a = block;
- b = block ^ 2;
+ if (!IsRoadAllowedHere(tile, target_dir)) return;
+
+ DiagDirection source_dir = ReverseDiagDir(target_dir);
+
if (CHANCE16(1, 4)) {
- do {
- a = GB(Random(), 0, 2);
- } while (a == b);
+ /* Randomize a new target dir */
+ do target_dir = RandomDiagDir(); while (target_dir == source_dir);
}
- if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
+ if (!IsRoadAllowedHere(TileAddByDiagDir(tile, target_dir), target_dir)) {
/* A road is not allowed to continue the randomized road,
- * return if the road we're trying to build is curved. */
- if (a != (b ^ 2)) {
- return;
- }
+ * return if the road we're trying to build is curved. */
+ if (target_dir != ReverseDiagDir(source_dir)) return;
/* Return if neither side of the new road is a house */
- if (!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 1])), MP_HOUSE) &&
- !IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 3])), MP_HOUSE)) {
+ if (!IsTileType(TileAddByDiagDir(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90RIGHT)), MP_HOUSE) &&
+ !IsTileType(TileAddByDiagDir(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90LEFT)), MP_HOUSE)) {
return;
}
@@ -939,14 +1023,15 @@
* at any side of the new road. */
}
- rcmd = (RoadBits)((ROAD_NW << a) + (ROAD_NW << b));
+ rcmd = DiagDirToRoadBits(target_dir) | DiagDirToRoadBits(source_dir);
break;
}
- } else if (block < 5 && !HASBIT(mask, block ^ 2)) {
+ } else if (target_dir < DIAGDIR_END && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) {
/* Continue building on a partial road.
- * Always OK. */
- _grow_town_result = 0;
+ * Should be allways OK, so we only generate
+ * the fitting RoadBits */
+ _grow_town_result = GROWTH_SEARCH_STOPPED;
switch (_patches.town_layout) {
default: NOT_REACHED();
@@ -956,18 +1041,16 @@
case TL_3X3_GRID:
case TL_2X2_GRID:
- rcmd = GetTownRoadGridElement(t1, tile);
+ rcmd = GetTownRoadGridElement(t1, tile, target_dir);
break;
case TL_BETTER_ROADS:
case TL_ORIGINAL:
- rcmd = (RoadBits)(ROAD_NW << (block ^ 2));
+ rcmd = DiagDirToRoadBits(ReverseDiagDir(target_dir));
break;
}
} else {
- int i;
- bool allow_house = false;
- TileIndex tmptile2;
+ bool allow_house = false; // Value which decides if we want to construct a house
/* Reached a tunnel/bridge? Then continue at the other side of it. */
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
@@ -981,14 +1064,14 @@
/* Possibly extend the road in a direction.
* Randomize a direction and if it has a road, bail out. */
- i = GB(Random(), 0, 2);
- if (HASBIT(mask, i)) return;
+ target_dir = RandomDiagDir();
+ if (cur_rb & DiagDirToRoadBits(target_dir)) return;
/* This is the tile we will reach if we extend to this direction. */
- tmptile = TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i]));
-
- /* Don't do it if it reaches to water. */
- if (IsClearWaterTile(tmptile)) return;
+ TileIndex house_tile = TileAddByDiagDir(tile, target_dir); // position of a possible house
+
+ /* Don't walk into water. */
+ if (IsClearWaterTile(house_tile)) return;
switch (_patches.town_layout) {
default: NOT_REACHED();
@@ -998,103 +1081,54 @@
break;
case TL_3X3_GRID: /* Use 2x2 grid afterwards! */
- /* Fill gap if house has enougth neighbors */
- tmptile2 = TILE_ADD(tmptile, ToTileIndexDiff(_roadblock_tileadd[i]));
- if (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
- _grow_town_result = -1;
- }
+ GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
+ /* FALL THROUGH */
case TL_2X2_GRID:
- rcmd = GetTownRoadGridElement(t1, tmptile);
+ rcmd = GetTownRoadGridElement(t1, house_tile, target_dir);
allow_house = (rcmd == ROAD_NONE);
break;
case TL_BETTER_ROADS: /* Use original afterwards! */
- /* Fill gap if house has enougth neighbors */
- tmptile2 = TILE_ADD(tmptile, ToTileIndexDiff(_roadblock_tileadd[i]));
- if (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
- _grow_town_result = -1;
- }
+ GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
+ /* FALL THROUGH */
case TL_ORIGINAL:
/* Allow a house at the edge. 60% chance or
* always ok if no road allowed. */
- allow_house = (!IsRoadAllowedHere(tmptile, i) || CHANCE16(6, 10));
+ rcmd = DiagDirToRoadBits(target_dir);
+ allow_house = (!IsRoadAllowedHere(house_tile, target_dir) || CHANCE16(6, 10));
break;
}
-
if (allow_house) {
/* Build a house, but not if there already is a house there. */
- if (!IsTileType(tmptile, MP_HOUSE)) {
+ if (!IsTileType(house_tile, MP_HOUSE)) {
/* Level the land if possible */
- LevelTownLand(tmptile);
+ LevelTownLand(house_tile);
/* And build a house.
* Set result to -1 if we managed to build it. */
- if (BuildTownHouse(t1, tmptile)) {
- _grow_town_result = -1;
+ if (BuildTownHouse(t1, house_tile)) {
+ _grow_town_result = GROWTH_SUCCEED;
}
}
return;
}
- _grow_town_result = 0;
- rcmd = (RoadBits)(ROAD_NW << i);
+ _grow_town_result = GROWTH_SEARCH_STOPPED;
}
/* Return if a water tile */
if (IsClearWaterTile(tile)) return;
- /* Determine direction of slope,
- * and build a road if not a special slope. */
- switch (GetTileSlope(tile, NULL)) {
- case SLOPE_SW: i = DIAGDIR_NE; break;
- case SLOPE_SE: i = DIAGDIR_NW; break;
- case SLOPE_NW: i = DIAGDIR_SE; break;
- case SLOPE_NE: i = DIAGDIR_SW; break;
-
- default:
-build_road_and_exit:
- if (CmdSucceeded(DoCommand(tile, rcmd, t1->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD))) {
- _grow_town_result = -1;
- }
- return;
- }
-
- /* Check if the bridge is in the right direction */
- if ((rcmd == ROAD_X && (i == DIAGDIR_NW || i == DIAGDIR_SE)) ||
- (rcmd == ROAD_Y && (i == DIAGDIR_NE || i == DIAGDIR_SW))) {
- goto build_road_and_exit;
- }
-
- tmptile = tile;
-
- /* Now it contains the direction of the slope */
- j = -11; // max 11 tile long bridges
- do {
- if (++j == 0)
- goto build_road_and_exit;
- tmptile = TILE_MASK(tmptile + TileOffsByDiagDir(i));
- } while (IsClearWaterTile(tmptile));
-
- /* no water tiles in between? */
- if (j == -10)
- goto build_road_and_exit;
-
- /* Quit if it selecting an appropiate bridge type fails a large number of times. */
- j = 22;
- do {
- byte bridge_type = RandomRange(MAX_BRIDGES - 1);
- /* Can we actually build the bridge? */
- if (CmdSucceeded(DoCommand(tile, tmptile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_AUTO, CMD_BUILD_BRIDGE))) {
- DoCommand(tile, tmptile, bridge_type | ((0x80 | ROADTYPES_ROAD) << 8), DC_EXEC | DC_AUTO, CMD_BUILD_BRIDGE);
- _grow_town_result = -1;
-
- /* obviously, if building any bridge would fail, there is no need to try other bridge-types */
- return;
- }
- } while (--j != 0);
+ /* Make the roads look nicer */
+ rcmd = CleanUpRoadBits(tile, rcmd);
+ if (rcmd == ROAD_NONE) return;
+
+ if (GrowTownWithBridge(t1, tile, rcmd)) return;
+
+ GrowTownWithRoad(t1, tile, rcmd);
}
/** Returns "growth" if a house was built, or no if the build failed.
@@ -1104,7 +1138,10 @@
*/
static int GrowTownAtRoad(Town *t, TileIndex tile)
{
- int block = 5; // special case
+ /* Special case.
+ * @see GrowTownInTile Check the else if
+ */
+ DiagDirection target_dir = DIAGDIR_END; // The direction in which we want to extend the town
TILE_ASSERT(tile);
@@ -1127,27 +1164,26 @@
}
do {
- /* Get a bitmask of the road blocks on a tile */
- RoadBits mask = GetTownRoadMask(tile);
+ RoadBits cur_rb = GetTownRoadBits(tile); // The RoadBits of the current tile
/* Try to grow the town from this point */
- GrowTownInTile(&tile, mask, block, t);
+ GrowTownInTile(&tile, cur_rb, target_dir, t);
/* Exclude the source position from the bitmask
* and return if no more road blocks available */
- ClrBitT(mask, (block ^ 2));
- if (mask == ROAD_NONE)
+ cur_rb &= ~DiagDirToRoadBits(ReverseDiagDir(target_dir));
+ if (cur_rb == ROAD_NONE)
return _grow_town_result;
/* Select a random bit from the blockmask, walk a step
* and continue the search from there. */
- do block = Random() & 3; while (!HASBIT(mask, block));
- tile += ToTileIndexDiff(_roadblock_tileadd[block]);
+ do target_dir = RandomDiagDir(); while (!(cur_rb & DiagDirToRoadBits(target_dir)));
+ tile = TileAddByDiagDir(tile, target_dir);
if (IsTileType(tile, MP_ROAD)) {
/* Don't allow building over roads of other cities */
if (IsTileOwner(tile, OWNER_TOWN) && GetTownByTile(tile) != t) {
- _grow_town_result = -1;
+ _grow_town_result = GROWTH_SUCCEED;
} else if (_game_mode == GM_EDITOR) {
/* If we are in the SE, and this road-piece has no town owner yet, it just found an
* owner :) (happy happy happy road now) */
@@ -1162,25 +1198,33 @@
return (_grow_town_result == -2);
}
-/** Generate a random road block
+/**
+ * Generate a random road block.
* The probability of a straight road
- * is somewhat higher than a curved. */
+ * is somewhat higher than a curved.
+ *
+ * @return A RoadBits value with 2 bits set
+ */
static RoadBits GenRandomRoadBits()
{
uint32 r = Random();
uint a = GB(r, 0, 2);
uint b = GB(r, 8, 2);
if (a == b) b ^= 2;
- return (RoadBits)((1 << a) + (1 << b));
+ return (RoadBits)((ROAD_NW << a) + (ROAD_NW << b));
}
/** Grow the town
* @Return true if a house was built, or no if the build failed. */
static bool GrowTown(Town *t)
{
- TileIndex tile;
- const TileIndexDiffC *ptr;
- PlayerID old_player;
+
+ /* Let the town be a ghost town
+ * The player wanted it in such a way. Thus there he has it. ;)
+ * Never reached in editor mode. */
+ if (_patches.town_layout == TL_NO_ROADS && _generating_world) {
+ return false;
+ }
static const TileIndexDiffC _town_coord_mod[] = {
{-1, 0},
@@ -1197,22 +1241,17 @@
{ 2, -2},
{ 0, 0}
};
-
- /* Let the town be a ghost town
- * The player wanted it in such a way. Thus there he has it. ;)
- * Never reached in editor mode. */
- if (_patches.town_layout == TL_NO_ROADS && _generating_world) {
- return false;
- }
+ const TileIndexDiffC *ptr;
/* Current player is a town */
- old_player = _current_player;
+ PlayerID old_player = _current_player;
_current_player = OWNER_TOWN;
+ TileIndex tile = t->xy; // The tile we are working with ATM
+
/* Find a road that we can base the construction on. */
- tile = t->xy;
for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
- if (GetAnyRoadTrackBits(tile, ROADTYPE_ROAD) != 0) {
+ if (GetTownRoadBits(tile) != ROAD_NONE) {
int r = GrowTownAtRoad(t, tile);
_current_player = old_player;
return r != 0;
@@ -1924,7 +1963,8 @@
PlayerID old;
CommandCost r;
- if (GetTileSlope(tile, NULL) != SLOPE_FLAT) return false;
+ /* Statues can be build on slopes, just like houses. Only the steep slopes is a no go. */
+ if (IsSteepSlope(GetTileSlope(tile, NULL))) return false;
if (!IsTileType(tile, MP_HOUSE) &&
!IsTileType(tile, MP_CLEAR) &&
@@ -1981,6 +2021,9 @@
static void TownActionBuyRights(Town* t)
{
+ /* Check if it's allowed to by the rights */
+ if (!_patches.exclusive_rights) return;
+
t->exclusive_counter = 12;
t->exclusivity = _current_player;
@@ -2097,8 +2140,8 @@
/** Towns are processed every TOWN_GROWTH_FREQUENCY ticks, and this is the
* number of times towns are processed before a new building is built. */
static const uint16 _grow_count_values[2][6] = {
- { 120, 120, 120, 100, 80, 60 }, ///< Fund new buildings has been activated
- { 320, 420, 300, 220, 160, 100 } ///< Normal values
+ { 120, 120, 120, 100, 80, 60 }, // Fund new buildings has been activated
+ { 320, 420, 300, 220, 160, 100 } // Normal values
};
if (t->fund_buildings_months != 0) {
@@ -2239,9 +2282,9 @@
/* penalty for removing town-owned stuff */
static const int _default_rating_settings [3][3] = {
/* ROAD_REMOVE, TUNNELBRIDGE_REMOVE, INDUSTRY_REMOVE */
- { 0, 128, 384}, ///< Permissive
- { 48, 192, 480}, ///< Neutral
- { 96, 384, 768}, ///< Hostile
+ { 0, 128, 384}, // Permissive
+ { 48, 192, 480}, // Neutral
+ { 96, 384, 768}, // Hostile
};
bool CheckforTownRating(uint32 flags, Town *t, byte type)
@@ -2303,6 +2346,15 @@
static CommandCost TerraformTile_Town(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
+ if (AutoslopeEnabled()) {
+ HouseID house = GetHouseType(tile);
+ HouseSpec *hs = GetHouseSpecs(house);
+
+ /* Here we differ from TTDP by checking TILE_NOT_SLOPED */
+ if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) &&
+ (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) return _price.terraform;
+ }
+
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
@@ -2477,4 +2529,7 @@
{
memset(&_house_specs, 0, sizeof(_house_specs));
memcpy(&_house_specs, &_original_house_specs, sizeof(_original_house_specs));
+
+ /* Reset any overrides that have been set. */
+ _house_mngr.ResetOverride();
}
--- a/src/town_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/town_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -20,19 +20,49 @@
#include "variables.h"
#include "helpers.hpp"
+enum TownAuthorityWidget {
+ TWA_CLOSEBOX = 0,
+ TWA_CAPTION,
+ TWA_RATING_INFO,
+ TWA_COMMAND_LIST,
+ TWA_SCROLLBAR,
+ TWA_ACTION_INFO,
+ TWA_EXECUTE,
+};
+
static const Widget _town_authority_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 13, 11, 316, 0, 13, STR_2022_LOCAL_AUTHORITY, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PANEL, RESIZE_NONE, 13, 0, 316, 14, 105, 0x0, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 13, 0, 304, 106, 157, 0x0, STR_2043_LIST_OF_THINGS_TO_DO_AT},
-{ WWT_SCROLLBAR, RESIZE_NONE, 13, 305, 316, 106, 157, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
-{ WWT_PANEL, RESIZE_NONE, 13, 0, 316, 158, 209, 0x0, STR_NULL},
-{ WWT_PUSHTXTBTN, RESIZE_NONE, 13, 0, 316, 210, 221, STR_2042_DO_IT, STR_2044_CARRY_OUT_THE_HIGHLIGHTED},
+{ WWT_CLOSEBOX, RESIZE_NONE, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // TWA_CLOSEBOX
+{ WWT_CAPTION, RESIZE_NONE, 13, 11, 316, 0, 13, STR_2022_LOCAL_AUTHORITY, STR_018C_WINDOW_TITLE_DRAG_THIS}, // TWA_CAPTION
+{ WWT_PANEL, RESIZE_NONE, 13, 0, 316, 14, 105, 0x0, STR_NULL}, // TWA_RATING_INFO
+{ WWT_PANEL, RESIZE_NONE, 13, 0, 304, 106, 157, 0x0, STR_2043_LIST_OF_THINGS_TO_DO_AT}, // TWA_COMMAND_LIST
+{ WWT_SCROLLBAR, RESIZE_NONE, 13, 305, 316, 106, 157, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // TWA_SCROLLBAR
+{ WWT_PANEL, RESIZE_NONE, 13, 0, 316, 158, 209, 0x0, STR_NULL}, // TWA_ACTION_INFO
+{ WWT_PUSHTXTBTN, RESIZE_NONE, 13, 0, 316, 210, 221, STR_2042_DO_IT, STR_2044_CARRY_OUT_THE_HIGHLIGHTED}, // TWA_EXECUTE
{ WIDGETS_END},
};
extern const byte _town_action_costs[8];
+enum TownActions {
+ TACT_NONE = 0x00,
+
+ TACT_ADVERTISE_SMALL = 0x01,
+ TACT_ADVERTISE_MEDIUM = 0x02,
+ TACT_ADVERTISE_LARGE = 0x04,
+ TACT_ROAD_REBUILD = 0x08,
+ TACT_BUILD_STATUE = 0x10,
+ TACT_FOUND_BUILDINGS = 0x20,
+ TACT_BUY_RIGHTS = 0x40,
+ TACT_BRIBE = 0x80,
+
+ TACT_ADVERTISE = TACT_ADVERTISE_SMALL | TACT_ADVERTISE_MEDIUM | TACT_ADVERTISE_LARGE,
+ TACT_CONSTRUCTION = TACT_ROAD_REBUILD | TACT_BUILD_STATUE | TACT_FOUND_BUILDINGS,
+ TACT_FUNDS = TACT_BUY_RIGHTS | TACT_BRIBE,
+ TACT_ALL = TACT_ADVERTISE | TACT_CONSTRUCTION | TACT_FUNDS,
+};
+
+DECLARE_ENUM_AS_BIT_SET(TownActions);
+
/** Get a list of available actions to do at a town.
* @param nump if not NULL add put the number of available actions in it
* @param pid the player that is querying the town
@@ -41,41 +71,38 @@
*/
uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
{
- Money avail, ref;
int num = 0;
- uint avail_buttons = 0x7F; // by default all buttons except bribe are enabled.
- uint buttons = 0;
-
- if (pid != PLAYER_SPECTATOR) {
- uint i;
+ TownActions buttons = TACT_NONE;
- /* bribe option enabled? */
- if (_patches.bribe) {
- /* if unwanted, disable everything. */
- if (t->unwanted[pid]) {
- avail_buttons = 0;
- } else if (t->ratings[pid] < RATING_BRIBE_MAXIMUM) {
- SETBIT(avail_buttons, 7); // Allow bribing
- }
- }
+ /* Spectators and unwanted have no options */
+ if (pid != PLAYER_SPECTATOR && !(_patches.bribe && t->unwanted[pid])) {
/* Things worth more than this are not shown */
- avail = GetPlayer(pid)->player_money + _price.station_value * 200;
- ref = _price.build_industry >> 8;
+ Money avail = GetPlayer(pid)->player_money + _price.station_value * 200;
+ Money ref = _price.build_industry >> 8;
- for (i = 0; i != lengthof(_town_action_costs); i++, avail_buttons >>= 1) {
- if (HASBIT(avail_buttons, 0) && avail >= _town_action_costs[i] * ref) {
- SETBIT(buttons, i);
+ /* Check the action bits for validity and
+ * if they are valid add them */
+ for (uint i = 0; i != lengthof(_town_action_costs); i++) {
+ const TownActions cur = (TownActions)(1 << i);
+
+ /* Is the player not able to bribe ? */
+ if (cur == TACT_BRIBE && (!_patches.bribe || t->ratings[pid] >= RATING_BRIBE_MAXIMUM))
+ continue;
+
+ /* Is the player not able to buy exclusive rights ? */
+ if (cur == TACT_BUY_RIGHTS && !_patches.exclusive_rights)
+ continue;
+
+ /* Is the player not able to build a statue ? */
+ if (cur == TACT_BUILD_STATUE && HASBIT(t->statues, pid))
+ continue;
+
+ if (avail >= _town_action_costs[i] * ref) {
+ buttons |= cur;
num++;
}
}
-
- /* Disable build statue if already built */
- if (HASBIT(t->statues, pid)) {
- CLRBIT(buttons, 4);
- num--;
- }
-
}
if (nump != NULL) *nump = num;
@@ -161,9 +188,9 @@
y += 10;
}
for (i = 0; buttons; i++, buttons >>= 1) {
- if (pos <= -5) break;
+ if (pos <= -5) break; ///< Draw only the 5 fitting lines
- if (buttons&1 && --pos < 0) {
+ if ((buttons & 1) && --pos < 0) {
DrawString(3, y, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i, 6);
y += 10;
}
@@ -185,7 +212,7 @@
case WE_DOUBLE_CLICK:
case WE_CLICK:
switch (e->we.click.widget) {
- case 3: { /* listbox */
+ case TWA_COMMAND_LIST: {
const Town *t = GetTown(w->window_number);
int y = (e->we.click.pt.y - 0x6B) / 10;
@@ -200,7 +227,7 @@
if (e->event != WE_DOUBLE_CLICK || y < 0) break;
}
- case 6: { /* carry out the action */
+ case TWA_EXECUTE: {
DoCommandP(GetTown(w->window_number)->xy, w->window_number, WP(w,def_d).data_1, NULL, CMD_DO_TOWN_ACTION | CMD_MSG(STR_00B4_CAN_T_DO_THIS));
break;
}
--- a/src/train.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train.h Sat Oct 06 21:16:00 2007 +0000
@@ -225,6 +225,16 @@
return v;
}
+/** Tell if we are dealing with the rear end of a multiheaded engine.
+ * @param v Vehicle.
+ * @return True if the engine is the rear part of a dualheaded engine.
+ */
+static inline bool IsRearDualheaded(const Vehicle *v)
+{
+ assert(v->type == VEH_TRAIN);
+ return (IsMultiheaded(v) && !IsTrainEngine(v));
+}
+
/** Get the next real (non-articulated part) vehicle in the consist.
* @param v Vehicle.
* @return Next vehicle in the consist.
@@ -238,6 +248,19 @@
return v->Next();
}
+/** Get the next real (non-articulated part and non rear part of dualheaded engine) vehicle in the consist.
+ * @param v Vehicle.
+ * @return Next vehicle in the consist.
+ */
+static inline Vehicle *GetNextUnit(Vehicle *v)
+{
+ assert(v->type == VEH_TRAIN);
+ v = GetNextVehicle(v);
+ if (v != NULL && IsRearDualheaded(v)) v = v->Next();
+
+ return v;
+}
+
void ConvertOldMultiheadToNew();
void ConnectMultiheadedTrains();
uint CountArticulatedParts(EngineID engine_type);
@@ -273,9 +296,8 @@
WindowClass GetVehicleListWindowClass() const { return WC_TRAINS_LIST; }
void PlayLeaveStationSound() const;
bool IsPrimaryVehicle() const { return IsFrontEngine(this); }
- bool HasFront() const { return true; }
int GetImage(Direction direction) const;
- int GetDisplaySpeed() const { return this->cur_speed * 10 / 16; }
+ int GetDisplaySpeed() const { return this->u.rail.last_speed * 10 / 16; }
int GetDisplayMaxSpeed() const { return this->u.rail.cached_max_speed * 10 / 16; }
Money GetRunningCost() const;
bool IsInDepot() const { return CheckTrainInDepot(this, false) != -1; }
--- a/src/train_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -95,6 +95,9 @@
}
if (v->u.rail.cached_power != total_power || v->u.rail.cached_max_te != max_te) {
+ /* If it has no power (no catenary), stop the train */
+ if (total_power == 0) v->vehstatus |= VS_STOPPED;
+
v->u.rail.cached_power = total_power;
v->u.rail.cached_max_te = max_te;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
@@ -190,7 +193,7 @@
if (!IsArticulatedPart(u)) {
/* Check powered wagon / visual effect callback */
- if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_WAGON_POWER)) {
+ if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_TRAIN_WAGON_POWER)) {
uint16 callback = GetVehicleCallback(CBID_TRAIN_WAGON_POWER, 0, 0, u->engine_type, u);
if (callback != CALLBACK_FAILED) u->u.rail.cached_vis_effect = callback;
@@ -301,7 +304,7 @@
static int GetTrainAcceleration(Vehicle *v, bool mode)
{
int max_speed = 2000;
- int speed = v->GetDisplaySpeed(); //[mph]
+ int speed = v->cur_speed * 10 / 16; // km-ish/h -> mp/h
int curvecount[2] = {0, 0};
/*first find the curve speed limit */
@@ -511,12 +514,12 @@
const RailVehicleInfo *rvi = RailVehInfo(engine);
CommandCost value((GetEngineProperty(engine, 0x17, rvi->base_cost) * _price.build_railwagon) >> 8);
- uint num_vehicles = 1 + CountArticulatedParts(engine);
+ uint num_vehicles = 1 + CountArticulatedParts(engine, false);
if (!(flags & DC_QUERY_COST)) {
- Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts.
-
- memset(&vl, 0, sizeof(vl));
+ /* Allow for the wagon and the articulated parts, plus one to "terminate" the list. */
+ Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+ memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
if (!Vehicle::AllocateList(vl, num_vehicles))
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -679,12 +682,12 @@
uint num_vehicles =
(rvi->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) +
- CountArticulatedParts(p1);
+ CountArticulatedParts(p1, false);
if (!(flags & DC_QUERY_COST)) {
- Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads
-
- memset(&vl, 0, sizeof(vl));
+ /* Allow for the dual-heads and the articulated parts, plus one to "terminate" the list. */
+ Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
+ memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
if (!Vehicle::AllocateList(vl, num_vehicles))
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@@ -798,7 +801,7 @@
* engines with more articulated parts than before works correctly.
*
* Also skip counting rear ends of multiheaded engines */
- if (!IsArticulatedPart(v) && !(!IsTrainEngine(v) && IsMultiheaded(v))) count++;
+ if (!IsArticulatedPart(v) && !IsRearDualheaded(v)) count++;
if (v->u.rail.track != TRACK_BIT_DEPOT || v->tile != tile ||
(IsFrontEngine(v) && needs_to_be_stopped && !(v->vehstatus & VS_STOPPED))) {
return -1;
@@ -953,7 +956,7 @@
dst_head = NULL;
}
- if (IsMultiheaded(src) && !IsTrainEngine(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+ if (IsRearDualheaded(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
/* when moving all wagons, we can't have the same src_head and dst_head */
if (HASBIT(p2, 0) && src_head == dst_head) return CommandCost();
@@ -1025,10 +1028,11 @@
/* If we move the front Engine and if the second vehicle is not an engine
add the whole vehicle to the DEFAULT_GROUP */
if (IsFrontEngine(src) && !IsDefaultGroupID(src->group_id)) {
- const Vehicle *v = GetNextVehicle(src);
-
- if (v != NULL && !IsTrainEngine(v)) {
- DoCommand(tile, DEFAULT_GROUP, v->index, flags, CMD_ADD_VEHICLE_GROUP);
+ Vehicle *v = GetNextVehicle(src);
+
+ if (v != NULL && IsTrainEngine(v)) {
+ v->group_id = src->group_id;
+ src->group_id = DEFAULT_GROUP;
}
}
@@ -1079,6 +1083,7 @@
/* the vehicle was previously a loco. need to free the order list and delete vehicle windows etc. */
DeleteWindowById(WC_VEHICLE_VIEW, src->index);
DeleteVehicleOrders(src);
+ RemoveVehicleFromGroup(src);
}
if (IsFrontEngine(src) || IsFreeWagon(src)) {
@@ -1221,7 +1226,7 @@
return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
}
- if (IsMultiheaded(v) && !IsTrainEngine(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+ if (IsRearDualheaded(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
if (flags & DC_EXEC) {
if (v == first && IsFrontEngine(first)) {
@@ -1268,6 +1273,7 @@
new_f->cur_order_index = first->cur_order_index;
new_f->orders = first->orders;
new_f->num_orders = first->num_orders;
+ new_f->group_id = first->group_id;
if (first->prev_shared != NULL) {
first->prev_shared->next_shared = new_f;
@@ -1277,8 +1283,6 @@
if (first->next_shared != NULL) {
first->next_shared->prev_shared = new_f;
new_f->next_shared = first->next_shared;
- } else {
- RemoveVehicleFromGroup(v);
}
/*
@@ -1289,6 +1293,7 @@
first->orders = NULL;
first->prev_shared = NULL;
first->next_shared = NULL;
+ first->group_id = DEFAULT_GROUP;
/* If we deleted a window then open a new one for the 'new' train */
if (IsLocalPlayer() && w != NULL) ShowVehicleViewWindow(new_f);
@@ -1373,7 +1378,6 @@
first = UnlinkWagon(v, first);
DeleteDepotHighlightOfVehicle(v);
delete v;
- RemoveVehicleFromGroup(v);
}
}
@@ -1621,7 +1625,7 @@
if (p2) {
/* turn a single unit around */
- if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) {
+ if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) {
return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
}
@@ -1712,7 +1716,7 @@
if (v->cargo_cap != 0) {
uint16 amount = CALLBACK_FAILED;
- if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
+ if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
/* Back up the vehicle's cargo type */
CargoID temp_cid = v->cargo_type;
byte temp_subtype = v->cargo_subtype;
@@ -1888,6 +1892,7 @@
* Now we change the setting to apply the new one and let the vehicle head for the same depot.
* Note: the if is (true for requesting service == true for ordered to stop in depot) */
if (flags & DC_EXEC) {
+ CLRBIT(v->current_order.flags, OFB_PART_OF_ORDERS);
TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
}
--- a/src/train_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/train_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -54,7 +54,7 @@
v = GetVehicle(_new_vehicle_id);
if (tile == _backup_orders_tile) {
_backup_orders_tile = 0;
- RestoreVehicleOrders(v, _backup_orders_data);
+ RestoreVehicleOrders(v);
}
ShowVehicleViewWindow(v);
}
@@ -152,32 +152,21 @@
}
}
-
-static void DrawTrainDetailsWindow(Window *w)
+int GetTrainDetailsWndVScroll(VehicleID veh_id, byte det_tab)
{
- byte det_tab = WP(w, traindetails_d).tab;
- const Vehicle *v;
- const Vehicle *u;
AcceptedCargo act_cargo;
AcceptedCargo max_cargo;
- int num;
- int x;
- int y;
- int sel;
+ int num = 0;
- num = 0;
- u = v = GetVehicle(w->window_number);
if (det_tab == 3) { // Total cargo tab
- for (CargoID i = 0; i < lengthof(act_cargo); i++) {
- act_cargo[i] = 0;
- max_cargo[i] = 0;
+ memset(max_cargo, 0, sizeof(max_cargo));
+ memset(act_cargo, 0, sizeof(act_cargo));
+
+ for (const Vehicle *v = GetVehicle(veh_id) ; v != NULL ; v = v->Next()) {
+ act_cargo[v->cargo_type] += v->cargo.Count();
+ max_cargo[v->cargo_type] += v->cargo_cap;
}
- do {
- act_cargo[u->cargo_type] += u->cargo.Count();
- max_cargo[u->cargo_type] += u->cargo_cap;
- } while ((u = u->Next()) != NULL);
-
/* Set scroll-amount seperately from counting, as to not compute num double
* for more carriages of the same type
*/
@@ -186,60 +175,22 @@
}
num++; // needs one more because first line is description string
} else {
- do {
- if (!IsArticulatedPart(u) || u->cargo_cap != 0) num++;
- } while ((u = u->Next()) != NULL);
+ for (const Vehicle *v = GetVehicle(veh_id) ; v != NULL ; v = v->Next()) {
+ if (!IsArticulatedPart(v) || v->cargo_cap != 0) num++;
+ }
}
- SetVScrollCount(w, num);
-
- DisableWindowWidget(w, det_tab + 9);
- SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-
- /* disable service-scroller when interval is set to disabled */
- SetWindowWidgetDisabledState(w, 6, !_patches.servint_trains);
- SetWindowWidgetDisabledState(w, 7, !_patches.servint_trains);
-
- SetDParam(0, v->index);
- DrawWindowWidgets(w);
-
- SetDParam(1, v->age / 366);
-
- x = 2;
-
- SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
- SetDParam(2, v->max_age / 366);
- SetDParam(3, v->GetDisplayRunningCost());
- DrawString(x, 15, STR_885D_AGE_RUNNING_COST_YR, 0);
+ return num;
+}
- SetDParam(2, v->GetDisplayMaxSpeed());
- SetDParam(1, v->u.rail.cached_power);
- SetDParam(0, v->u.rail.cached_weight);
- SetDParam(3, v->u.rail.cached_max_te / 1000);
- DrawString(x, 25, (_patches.realistic_acceleration && v->u.rail.railtype != RAILTYPE_MAGLEV) ?
- STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :
- STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, 0);
-
- SetDParam(0, v->profit_this_year);
- SetDParam(1, v->profit_last_year);
- DrawString(x, 35, STR_885F_PROFIT_THIS_YEAR_LAST_YEAR, 0);
-
- SetDParam(0, 100 * (v->reliability>>8) >> 8);
- SetDParam(1, v->breakdowns_since_last_service);
- DrawString(x, 45, STR_8860_RELIABILITY_BREAKDOWNS, 0);
-
- SetDParam(0, v->service_interval);
- SetDParam(1, v->date_of_last_service);
- DrawString(x + 11, 57 + (w->vscroll.cap * 14), _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
-
- y = 57;
- sel = w->vscroll.pos;
-
+void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vscroll_cap, byte det_tab)
+{
/* draw the first 3 details tabs */
if (det_tab != 3) {
+ const Vehicle *u = v;
x = 1;
for (;;) {
- if (--sel < 0 && sel >= -w->vscroll.cap) {
+ if (--vscroll_pos < 0 && vscroll_pos >= -vscroll_cap) {
int dx = 0;
int px;
int py;
@@ -277,10 +228,21 @@
if (v == NULL) return;
}
} else {
+ AcceptedCargo act_cargo;
+ AcceptedCargo max_cargo;
+
+ memset(max_cargo, 0, sizeof(max_cargo));
+ memset(act_cargo, 0, sizeof(act_cargo));
+
+ for (const Vehicle *u = v; u != NULL ; u = u->Next()) {
+ act_cargo[u->cargo_type] += u->cargo.Count();
+ max_cargo[u->cargo_type] += u->cargo_cap;
+ }
+
/* draw total cargo tab */
DrawString(x, y + 2, STR_013F_TOTAL_CAPACITY_TEXT, 0);
for (CargoID i = 0; i < NUM_CARGO; i++) {
- if (max_cargo[i] > 0 && --sel < 0 && sel > -w->vscroll.cap) {
+ if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
y += 14;
SetDParam(0, i); // {CARGO} #1
SetDParam(1, act_cargo[i]); // {CARGO} #2
@@ -294,114 +256,3 @@
DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, 0);
}
}
-
-static void TrainDetailsWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT:
- DrawTrainDetailsWindow(w);
- break;
- case WE_CLICK: {
- int mod;
- const Vehicle *v;
- switch (e->we.click.widget) {
- case 2: /* name train */
- v = GetVehicle(w->window_number);
- SetDParam(0, v->index);
- ShowQueryString(STR_VEHICLE_NAME, STR_8865_NAME_TRAIN, 31, 150, w, CS_ALPHANUMERAL);
- break;
- case 6: /* inc serv interval */
- mod = _ctrl_pressed? 5 : 10;
- goto do_change_service_int;
-
- case 7: /* dec serv interval */
- mod = _ctrl_pressed? -5 : -10;
-do_change_service_int:
- v = GetVehicle(w->window_number);
-
- mod = GetServiceIntervalClamped(mod + v->service_interval);
- if (mod == v->service_interval) return;
-
- DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
- break;
- /* details buttons*/
- case 9: // Cargo
- case 10: // Information
- case 11: // Capacities
- case 12: // Total cargo
- EnableWindowWidget(w, 9);
- EnableWindowWidget(w, 10);
- EnableWindowWidget(w, 11);
- EnableWindowWidget(w, 12);
- EnableWindowWidget(w, e->we.click.widget);
- WP(w,traindetails_d).tab = e->we.click.widget - 9;
- SetWindowDirty(w);
- break;
- }
- } break;
-
- case WE_ON_EDIT_TEXT:
- if (e->we.edittext.str[0] != '\0') {
- _cmd_text = e->we.edittext.str;
- DoCommandP(0, w->window_number, 0, NULL,
- CMD_NAME_VEHICLE | CMD_MSG(STR_8866_CAN_T_NAME_TRAIN));
- }
- break;
-
- case WE_RESIZE:
- if (e->we.sizing.diff.x != 0) ResizeButtons(w, 9, 12);
- if (e->we.sizing.diff.y == 0) break;
-
- w->vscroll.cap += e->we.sizing.diff.y / 14;
- w->widget[4].data = (w->vscroll.cap << 8) + 1;
- break;
- }
-}
-
-static const Widget _train_details_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_RIGHT, 14, 11, 329, 0, 13, STR_8802_DETAILS, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_PUSHTXTBTN, RESIZE_LR, 14, 330, 369, 0, 13, STR_01AA_NAME, STR_8867_NAME_TRAIN},
-{ WWT_PANEL, RESIZE_RIGHT, 14, 0, 369, 14, 55, 0x0, STR_NULL},
-{ WWT_MATRIX, RESIZE_RB, 14, 0, 357, 56, 139, 0x601, STR_NULL},
-{ WWT_SCROLLBAR, RESIZE_LRB, 14, 358, 369, 56, 139, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 140, 145, STR_0188, STR_884D_INCREASE_SERVICING_INTERVAL},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 146, 151, STR_0189, STR_884E_DECREASE_SERVICING_INTERVAL},
-{ WWT_PANEL, RESIZE_RTB, 14, 11, 369, 140, 151, 0x0, STR_NULL},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 89, 152, 163, STR_013C_CARGO, STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 90, 178, 152, 163, STR_013D_INFORMATION, STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES},
-{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 179, 268, 152, 163, STR_013E_CAPACITIES, STR_8851_SHOW_CAPACITIES_OF_EACH},
-{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 269, 357, 152, 163, STR_013E_TOTAL_CARGO, STR_8852_SHOW_TOTAL_CARGO},
-{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 358, 369, 152, 163, 0x0, STR_RESIZE_BUTTON},
-{ WIDGETS_END},
-};
-
-
-static const WindowDesc _train_details_desc = {
- WDP_AUTO, WDP_AUTO, 370, 164, 370, 164,
- WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW,
- WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
- _train_details_widgets,
- TrainDetailsWndProc
-};
-
-
-void ShowTrainDetailsWindow(const Vehicle *v)
-{
- Window *w;
- VehicleID veh = v->index;
-
- DeleteWindowById(WC_VEHICLE_ORDERS, veh);
- DeleteWindowById(WC_VEHICLE_DETAILS, veh);
-
- w = AllocateWindowDescFront(&_train_details_desc, veh);
-
- w->caption_color = v->owner;
- w->vscroll.cap = 6;
- w->widget[4].data = (w->vscroll.cap << 8) + 1;
-
- w->resize.step_height = 14;
- w->resize.height = w->height - 14 * 2; /* Minimum of 4 wagons in the display */
-
- WP(w,traindetails_d).tab = 0;
-}
--- a/src/tree_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tree_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -21,12 +21,28 @@
#include "variables.h"
#include "genworld.h"
+/**
+ * List of tree placer algorithm.
+ *
+ * This enumeration defines all possible tree placer algorithm in the game.
+ */
enum TreePlacer {
- TP_NONE,
- TP_ORIGINAL,
- TP_IMPROVED,
+ TP_NONE, ///< No tree placer algorithm
+ TP_ORIGINAL, ///< The original algorithm
+ TP_IMPROVED, ///< A 'improved' algorithm
};
+/**
+ * Get a random TreeType for the given tile based on a given seed
+ *
+ * This function returns a random TreeType which can be placed on the given tile.
+ * The seed for randomness must be less or equal 256, use #GB on the value of Random()
+ * to get such a value.
+ *
+ * @param tile The tile to get a random TreeType from
+ * @param seed The seed for randomness, must be less or equal 256
+ * @return The random tree type
+ */
static TreeType GetRandomTreeType(TileIndex tile, uint seed)
{
switch (_opt.landscape) {
@@ -48,6 +64,15 @@
}
}
+/**
+ * Make a random tree tile of the given tile
+ *
+ * Create a new tree-tile for the given tile. The second parameter is used for
+ * randomness like type and number of trees.
+ *
+ * @param tile The tile to make a tree-tile from
+ * @param r The randomness value from a Random() value
+ */
static void PlaceTree(TileIndex tile, uint32 r)
{
TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8));
@@ -66,6 +91,15 @@
}
}
+/**
+ * Place some amount of trees around a given tile.
+ *
+ * This function adds some trees around a given tile. As this function use
+ * the Random() call it depends on the random how many trees are actually placed
+ * around the given tile.
+ *
+ * @param tile The center of the trees to add
+ */
static void DoPlaceMoreTrees(TileIndex tile)
{
uint i;
@@ -87,6 +121,11 @@
}
}
+/**
+ * Place more trees on the map.
+ *
+ * This function add more trees to the map.
+ */
static void PlaceMoreTrees()
{
uint i = ScaleByMapSize(GB(Random(), 0, 5) + 25);
@@ -97,7 +136,12 @@
/**
* Place a tree at the same height as an existing tree.
- * This gives cool effects to the map.
+ *
+ * Add a new tree around the given tile which is at the same
+ * height or at some offset (2 units) of it.
+ *
+ * @param tile The base tile to add a new tree somewhere around
+ * @param height The height (like the one from the tile)
*/
void PlaceTreeAtSameHeight(TileIndex tile, uint height)
{
@@ -127,6 +171,11 @@
}
}
+/**
+ * Place some trees randomly
+ *
+ * This function just place some trees randomly on the map.
+ */
void PlaceTreesRandomly()
{
uint i, j, ht;
@@ -183,6 +232,12 @@
}
}
+/**
+ * Place new trees.
+ *
+ * This function takes care of the selected tree placer algorithm and
+ * place randomly the trees for a new game.
+ */
void GenerateTrees()
{
uint i, total;
@@ -404,7 +459,7 @@
if (tep == NULL) break;
- AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 5, 5, 0x10, z, HASBIT(_transparent_opt, TO_TREES));
+ AddSortableSpriteToDraw(tep->image, tep->pal, ti->x + tep->x, ti->y + tep->y, 16 - tep->x, 16 - tep->y, 0x30, z, HASBIT(_transparent_opt, TO_TREES), -tep->x, -tep->y);
tep->image = 0;
}
}
--- a/src/tree_map.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tree_map.h Sat Oct 06 21:16:00 2007 +0000
@@ -7,54 +7,123 @@
#include "macros.h"
+/**
+ * List of tree types along all landscape types.
+ *
+ * This enumeration contains a list of the different tree types along
+ * all landscape types. The values for the enumerations may be used for
+ * offsets from the grfs files. These points to the start of
+ * the tree list for a landscape. See the TREE_COUNT_* enumerations
+ * for the amount of different trees for a specific landscape.
+ *
+ * @note TREE_INVALID may be 0xFF according to the coding style, not -1 (Progman)
+ */
enum TreeType {
- TREE_INVALID = -1,
- TREE_TEMPERATE = 0,
- TREE_SUB_ARCTIC = 12,
- TREE_RAINFOREST = 20,
- TREE_CACTUS = 27,
- TREE_SUB_TROPICAL = 28,
- TREE_TOYLAND = 32
+ TREE_INVALID = -1, ///< An invalid tree
+ TREE_TEMPERATE = 0x00, ///< temperate tree
+ TREE_SUB_ARCTIC = 0x0C, ///< tree on a sub_arctic landscape
+ TREE_RAINFOREST = 0x14, ///< tree on the 'green part' on a sub-tropical map
+ TREE_CACTUS = 0x1B, ///< a catus for the 'desert part' on a sub-tropical map
+ TREE_SUB_TROPICAL = 0x1C, ///< tree on a sub-tropical map, non-rainforest, non-desert
+ TREE_TOYLAND = 0x20, ///< tree on a toyland map
};
+/**
+ * Counts the number of treetypes for each landscape.
+ *
+ * This list contains the counts of different treetypes for each landscape. This list contains
+ * 5 entries instead of 4 (as there are only 4 landscape types) as the sub tropic landscape
+ * got two types of area, one for normal trees and one only for cacti.
+ */
enum {
- TREE_COUNT_TEMPERATE = TREE_SUB_ARCTIC - TREE_TEMPERATE,
- TREE_COUNT_SUB_ARCTIC = TREE_RAINFOREST - TREE_SUB_ARCTIC,
- TREE_COUNT_RAINFOREST = TREE_CACTUS - TREE_RAINFOREST,
- TREE_COUNT_SUB_TROPICAL = TREE_SUB_TROPICAL - TREE_CACTUS,
- TREE_COUNT_TOYLAND = 9
+ TREE_COUNT_TEMPERATE = TREE_SUB_ARCTIC - TREE_TEMPERATE, ///< number of treetypes on a temperate map
+ TREE_COUNT_SUB_ARCTIC = TREE_RAINFOREST - TREE_SUB_ARCTIC, ///< number of treetypes on a sub arctic map
+ TREE_COUNT_RAINFOREST = TREE_CACTUS - TREE_RAINFOREST, ///< number of treetypes for the 'green part' of a sub tropic map
+ TREE_COUNT_SUB_TROPICAL = TREE_SUB_TROPICAL - TREE_CACTUS, ///< number of treetypes for the 'desert part' of a sub tropic map
+ TREE_COUNT_TOYLAND = 9 ///< number of treetypes on a toyland map
};
-/* ground type, m2 bits 4...5
- * valid densities (bits 6...7) in comments after the enum */
+/**
+ * Enumeration for ground types of tiles with trees.
+ *
+ * This enumeration defines the ground types for tiles with trees on it.
+ */
enum TreeGround {
- TREE_GROUND_GRASS = 0, ///< 0
- TREE_GROUND_ROUGH = 1, ///< 0
- TREE_GROUND_SNOW_DESERT = 2 ///< 0-3 for snow, 3 for desert
+ TREE_GROUND_GRASS = 0, ///< normal grass
+ TREE_GROUND_ROUGH = 1, ///< some rough tile
+ TREE_GROUND_SNOW_DESERT = 2 ///< a desert or snow tile, depend on landscape
};
+/**
+ * Returns the treetype of a tile.
+ *
+ * This function returns the treetype of a given tile. As there are more
+ * possible treetypes for a tile in a game as the enumeration #TreeType defines
+ * this function may be return a value which isn't catch by an entry of the
+ * enumeration #TreeType. But there is no problem known about it.
+ *
+ * @param t The tile to get the treetype from
+ * @return The treetype of the given tile with trees
+ * @pre Tile t must be of type MP_TREES
+ */
static inline TreeType GetTreeType(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return (TreeType)_m[t].m3;
}
-
+/**
+ * Returns the groundtype for tree tiles.
+ *
+ * This function returns the groundtype of a tile with trees.
+ *
+ * @param t The tile to get the groundtype from
+ * @return The groundtype of the tile
+ * @pre Tile must be of type MP_TREES
+ */
static inline TreeGround GetTreeGround(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return (TreeGround)GB(_m[t].m2, 4, 2);
}
-
+/**
+ * Returns the 'density' of a tile with trees.
+ *
+ * This function returns the density of a tile which got trees. Note
+ * that this value doesn't count the number of trees on a tile, use
+ * #GetTreeCount instead. This function instead returns some kind of
+ * groundtype of the tile. As the map-array is finite in size and
+ * the informations about the trees must be saved somehow other
+ * informations about a tile must be saved somewhere encoded in the
+ * tile. So this function returns the density of a tile for sub arctic
+ * and sub tropical games. This means for sub arctic the type of snowline
+ * (0 to 3 for all 4 types of snowtiles) and for sub tropical the value
+ * 3 for a desert (and 0 for non-desert). The functionname is not read as
+ * "get the tree density of a tile" but "get the density of a tile which got trees".
+ *
+ * @param t The tile to get the 'density'
+ * @pre Tile must be of type MP_TREES
+ * @see GetTreeCount
+ */
static inline uint GetTreeDensity(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return GB(_m[t].m2, 6, 2);
}
-
+/**
+ * Set the density and ground type of a tile with trees.
+ *
+ * This functions saves the ground type and the density which belongs to it
+ * for a given tile.
+ *
+ * @param t The tile to set the density and ground type
+ * @param g The ground type to save
+ * @param d The density to save with
+ * @pre Tile must be of type MP_TREES
+ */
static inline void SetTreeGroundDensity(TileIndex t, TreeGround g, uint d)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
@@ -62,64 +131,157 @@
SB(_m[t].m2, 6, 2, d);
}
-
+/**
+ * Returns the number of trees on a tile.
+ *
+ * This function returns the number of trees of a tile (1-4).
+ * The tile must be contains at least one tree or be more specific: it must be
+ * of type MP_TREES.
+ *
+ * @param t The index to get the number of trees
+ * @return The number of trees (1-4)
+ * @pre Tile must be of type MP_TREES
+ */
static inline uint GetTreeCount(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return GB(_m[t].m5, 6, 2);
}
+/**
+ * Add a amount to the tree-count value of a tile with trees.
+ *
+ * This function add a value to the tree-count value of a tile. This
+ * value may be negative to reduce the tree-counter. If the resulting
+ * value reach 0 it doesn't get converted to a "normal" tile.
+ *
+ * @param t The tile to change the tree amount
+ * @param c The value to add (or reduce) on the tree-count value
+ * @pre Tile must be of type MP_TREES
+ */
static inline void AddTreeCount(TileIndex t, int c)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
_m[t].m5 += c << 6;
}
+/**
+ * Sets the tree amount of a tile.
+ *
+ * This function directly sets the amount of trees of a tile.
+ *
+ * @param t The tile to set the amount of trees
+ * @param c The number of trees
+ * @pre Tile must be of type MP_TREES
+ */
static inline void SetTreeCount(TileIndex t, uint c)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
SB(_m[t].m5, 6, 2, c);
}
-
+/**
+ * Returns the tree growth status.
+ *
+ * This function returns the tree growth status of a tile with trees.
+ *
+ * @param t The tile to get the tree growth status
+ * @return The tree growth status
+ * @pre Tile must be of type MP_TREES
+ */
static inline uint GetTreeGrowth(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return GB(_m[t].m5, 0, 3);
}
+/**
+ * Add a value to the tree growth status.
+ *
+ * This function adds a value to the tree grow status of a tile.
+ *
+ * @param t The tile to add the value on
+ * @param a The value to add on the tree growth status
+ * @pre Tile must be of type MP_TREES
+ */
static inline void AddTreeGrowth(TileIndex t, int a)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
_m[t].m5 += a;
}
+/**
+ * Sets the tree growth status of a tile.
+ *
+ * This function sets the tree growth status of a tile directly with
+ * the given value.
+ *
+ * @param t The tile to change the tree growth status
+ * @param g The new value
+ * @pre Tile must be of type MP_TREES
+ */
static inline void SetTreeGrowth(TileIndex t, uint g)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
SB(_m[t].m5, 0, 3, g);
}
-
+/**
+ * Get the tick counter of a tree tile.
+ *
+ * Returns the saved tick counter of a given tile.
+ *
+ * @param t The tile to get the counter value from
+ * @pre Tile must be of type MP_TREES
+ */
static inline uint GetTreeCounter(TileIndex t)
{
assert(IsTileType(t, MP_TREES));
return GB(_m[t].m2, 0, 4);
}
+/**
+ * Add a value on the tick counter of a tree-tile
+ *
+ * This function adds a value on the tick counter of a tree-tile.
+ *
+ * @param t The tile to add the value on
+ * @param a The value to add on the tick counter
+ * @pre Tile must be of type MP_TREES
+ */
static inline void AddTreeCounter(TileIndex t, int a)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
_m[t].m2 += a;
}
+/**
+ * Set the tick counter for a tree-tile
+ *
+ * This function sets directly the tick counter for a tree-tile.
+ *
+ * @param t The tile to set the tick counter
+ * @param c The new tick counter value
+ * @pre Tile must be of type MP_TREES
+ */
static inline void SetTreeCounter(TileIndex t, uint c)
{
assert(IsTileType(t, MP_TREES)); // XXX incomplete
SB(_m[t].m2, 0, 4, c);
}
-
+/**
+ * Make a tree-tile.
+ *
+ * This functions change the tile to a tile with trees and all informations which belongs to it.
+ *
+ * @param t The tile to make a tree-tile from
+ * @param type The type of the tree
+ * @param set the number of trees
+ * @param growth the growth status
+ * @param ground the ground type
+ * @param density the density (not the number of trees)
+ */
static inline void MakeTree(TileIndex t, TreeType type, uint count, uint growth, TreeGround ground, uint density)
{
SetTileType(t, MP_TREES);
--- a/src/tunnelbridge_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -32,6 +32,7 @@
#include "yapf/yapf.h"
#include "date.h"
#include "newgrf_sound.h"
+#include "autoslope.h"
#include "table/bridge_land.h"
@@ -255,7 +256,7 @@
if (IsSteepSlope(tileh_end)) z_end += TILE_HEIGHT;
if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh_end)) z_end += TILE_HEIGHT;
- if (z_start != z_end) return_cmd_error(STR_5009_LEVEL_LAND_OR_WATER_REQUIRED);
+ if (z_start != z_end) return_cmd_error(STR_BRIDGEHEADS_NOT_SAME_HEIGHT);
/* Towns are not allowed to use bridges on slopes. */
allow_on_slopes = (!_is_old_ai_player
@@ -366,7 +367,7 @@
for (tile = tile_start + delta; tile != tile_end; tile += delta) {
uint z;
- if (GetTileSlope(tile, &z) != SLOPE_FLAT && z >= z_start) return_cmd_error(STR_5009_LEVEL_LAND_OR_WATER_REQUIRED);
+ if (GetTileSlope(tile, &z) != SLOPE_FLAT && z >= z_start) return_cmd_error(STR_BRIDGE_TOO_LOW_FOR_TERRAIN);
if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) && !replace_bridge) {
/* Disallow crossing bridges for the time being */
@@ -531,14 +532,9 @@
/* slope of end tile must be complementary to the slope of the start tile */
if (end_tileh != ComplementSlope(start_tileh)) {
- /* Some (rail) track bits might be terraformed into the correct direction,
- * but that would still leave tracks on foundation. Therefor excavation will
- * always fail for rail tiles. On the other hand, for road tiles it might
- * succeed when there is only one road bit on the tile, but then that road
- * bit is removed leaving a clear tile.
- * This therefor preserves the behaviour that half road tiles are always removable.
- */
- if (IsTileType(end_tile, MP_RAILWAY)) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
+ /* Check if there is a structure on the terraformed tile. Do not add the cost, that will be done by the terraforming */
+ ret = DoCommand(end_tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR);
+ if (CmdFailed(ret)) return_cmd_error(STR_5005_UNABLE_TO_EXCAVATE_LAND);
ret = DoCommand(end_tile, end_tileh & start_tileh, 0, flags, CMD_TERRAFORM_LAND);
if (CmdFailed(ret)) return_cmd_error(STR_5005_UNABLE_TO_EXCAVATE_LAND);
@@ -749,68 +745,67 @@
*/
CommandCost DoConvertTunnelBridgeRail(TileIndex tile, RailType totype, bool exec)
{
- TileIndex endtile;
-
if (IsTunnel(tile) && GetTunnelTransportType(tile) == TRANSPORT_RAIL) {
uint length;
-
- if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
- if (GetRailType(tile) == totype) return CMD_ERROR;
+ TileIndex endtile;
- /* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
- if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
-
- endtile = CheckTunnelBusy(tile, &length);
- if (endtile == INVALID_TILE) return CMD_ERROR;
+ /* If not coverting rail <-> el. rail, any vehicle cannot be in tunnel */
+ if (!IsCompatibleRail(GetRailType(tile), totype)) {
+ endtile = CheckTunnelBusy(tile, &length);
+ if (endtile == INVALID_TILE) return CMD_ERROR;
+ } else {
+ endtile = GetOtherTunnelEnd(tile);
+ length = DistanceManhattan(tile, endtile);
+ }
if (exec) {
- Track track;
SetRailType(tile, totype);
SetRailType(endtile, totype);
MarkTileDirtyByTile(tile);
MarkTileDirtyByTile(endtile);
- track = AxisToTrack(DiagDirToAxis(GetTunnelDirection(tile)));
+ Track track = AxisToTrack(DiagDirToAxis(GetTunnelDirection(tile)));
+
YapfNotifyTrackLayoutChange(tile, track);
YapfNotifyTrackLayoutChange(endtile, track);
+
+ VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
+ VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
}
- return CommandCost((length + 1) * (_price.build_rail / 2));
+
+ return CommandCost((length + 1) * (_price.build_rail >> 1));
} else if (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
-
- if (!CheckTileOwnership(tile)) return CMD_ERROR;
-
- endtile = GetOtherBridgeEnd(tile);
+ TileIndex endtile = GetOtherBridgeEnd(tile);
byte bridge_height = GetBridgeHeight(tile);
- if (FindVehicleOnTileZ(tile, bridge_height) != NULL ||
+ if (!IsCompatibleRail(GetRailType(tile), totype) &&
+ (FindVehicleOnTileZ(tile, bridge_height) != NULL ||
FindVehicleOnTileZ(endtile, bridge_height) != NULL ||
- IsVehicleOnBridge(tile, endtile, bridge_height)) {
+ IsVehicleOnBridge(tile, endtile, bridge_height))) {
return CMD_ERROR;
}
- if (GetRailType(tile) == totype) return CMD_ERROR;
-
if (exec) {
- TileIndexDiff delta;
- Track track;
-
SetRailType(tile, totype);
SetRailType(endtile, totype);
MarkTileDirtyByTile(tile);
MarkTileDirtyByTile(endtile);
- track = AxisToTrack(DiagDirToAxis(GetBridgeRampDirection(tile)));
+ Track track = AxisToTrack(DiagDirToAxis(GetBridgeRampDirection(tile)));
+ TileIndexDiff delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+
YapfNotifyTrackLayoutChange(tile, track);
YapfNotifyTrackLayoutChange(endtile, track);
- delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+ VehicleFromPos(tile, &tile, UpdateTrainPowerProc);
+ VehicleFromPos(endtile, &endtile, UpdateTrainPowerProc);
+
for (tile += delta; tile != endtile; tile += delta) {
MarkTileDirtyByTile(tile); // TODO encapsulate this into a function
}
}
- return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail / 2));
+ return CommandCost((DistanceManhattan(tile, endtile) + 1) * (_price.build_rail >> 1));
} else {
return CMD_ERROR;
}
@@ -847,11 +842,11 @@
* sprites is at the top
*/
if (z >= front_height) { // front facing pillar
- AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ AddSortableSpriteToDraw(image, psid->pal, x, y, p[4], p[5], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
}
if (drawfarpillar && z >= back_height && z < i - TILE_HEIGHT) { // back facing pillar
- AddSortableSpriteToDraw(image, psid->pal, x - p[6], y - p[7], p[4], p[5], 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ AddSortableSpriteToDraw(image, psid->pal, x - p[6], y - p[7], p[4], p[5], BB_HEIGHT_UNDER_BRIDGE - 5, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, -5);
}
}
}
@@ -878,14 +873,23 @@
static const SpriteID back_offsets[6] = { 95, 96, 99, 102, 100, 101 };
static const SpriteID front_offsets[6] = { 97, 98, 103, 106, 104, 105 };
- static const uint size_x[6] = { 11, 16, 16, 16, 16, 16 };
- static const uint size_y[6] = { 16, 11, 16, 16, 16, 16 };
+ static const uint size_x[6] = { 1, 16, 16, 1, 16, 1 };
+ static const uint size_y[6] = { 16, 1, 1, 16, 1, 16 };
+ static const uint front_bb_offset_x[6] = { 15, 0, 0, 15, 0, 15 };
+ static const uint front_bb_offset_y[6] = { 0, 15, 15, 0, 15, 0 };
- AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 1 : 0, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ /* The sprites under the vehicles are drawn as SpriteCombine. StartSpriteCombine() has already been called
+ * The bounding boxes here are the same as for bridge front/roof */
+ AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
- AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+ AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+
+ /* Start a new SpriteCombine for the front part */
+ EndSpriteCombine();
+ StartSpriteCombine();
+
/* For sloped sprites the bounding box needs to be higher, as the pylons stop on a higher point */
- AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 0x30 : 0x10, z, HASBIT(_transparent_opt, TO_BUILDINGS));
+ AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset] + front_bb_offset_x[offset], size_y[offset] + front_bb_offset_y[offset], 0x28, z, HASBIT(_transparent_opt, TO_BUILDINGS), front_bb_offset_x[offset], front_bb_offset_y[offset]);
}
/**
@@ -906,6 +910,27 @@
SpriteID image;
if (IsTunnel(ti->tile)) {
+ /* Front view of tunnel bounding boxes:
+ *
+ * 122223 <- BB_Z_SEPARATOR
+ * 1 3
+ * 1 3 1,3 = empty helper BB
+ * 1 3 2 = SpriteCombine of tunnel-roof and catenary (tram & elrail)
+ *
+ */
+
+ static const int _tunnel_BB[4][12] = {
+ /* tunnnel-roof | Z-separator | tram-catenary
+ * w h bb_x bb_y| x y w h |bb_x bb_y w h */
+ { 1, 0, -15, -14, 0, 15, 16, 1, 0, 1, 16, 15 }, // NE
+ { 0, 1, -14, -15, 15, 0, 1, 16, 1, 0, 15, 16 }, // SE
+ { 1, 0, -15, -14, 0, 15, 16, 1, 0, 1, 16, 15 }, // SW
+ { 0, 1, -14, -15, 15, 0, 1, 16, 1, 0, 15, 16 }, // NW
+ };
+ static const int *BB_data = _tunnel_BB[GetTunnelDirection(ti->tile)];
+
+ bool catenary = false;
+
if (GetTunnelTransportType(ti->tile) == TRANSPORT_RAIL) {
image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.tunnel;
} else {
@@ -924,13 +949,27 @@
static const SpriteID tunnel_sprites[2][4] = { { 28, 78, 79, 27 }, { 5, 76, 77, 4 } };
DrawGroundSprite(SPR_TRAMWAY_BASE + tunnel_sprites[rts - ROADTYPES_TRAM][dir], PAL_NONE);
- AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + dir, PAL_NONE, ti->x, ti->y, 16, 16, 16, (byte)ti->z, HASBIT(_transparent_opt, TO_BUILDINGS));
+
+ catenary = true;
+ StartSpriteCombine();
+ AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + dir, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, HASBIT(_transparent_opt, TO_BUILDINGS), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
}
} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
DrawCatenary(ti);
+
+ catenary = true;
+ StartSpriteCombine();
+ DrawCatenaryOnTunnel(ti);
}
- AddSortableSpriteToDraw(image + 1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, 1, 1, 8, (byte)ti->z);
+ AddSortableSpriteToDraw(image + 1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, BB_data[0], BB_data[1], TILE_HEIGHT, ti->z, false, BB_data[2], BB_data[3], BB_Z_SEPARATOR);
+
+ if (catenary) EndSpriteCombine();
+
+ /* Add helper BB for sprite sorting, that separate the tunnel from things beside of it */
+ AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x , ti->y , BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
+ AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, ti->x + BB_data[4], ti->y + BB_data[5], BB_data[6], BB_data[7], TILE_HEIGHT, ti->z);
+
DrawBridgeMiddle(ti);
} else if (IsBridge(ti->tile)) { // XXX is this necessary?
const PalSpriteID *psid;
@@ -965,6 +1004,9 @@
/* draw ramp */
+ /* Draw Trambits as SpriteCombine */
+ if (GetBridgeTransportType(ti->tile) == TRANSPORT_ROAD) StartSpriteCombine();
+
/* HACK set the height of the BB of a sloped ramp to 1 so a vehicle on
* it doesn't disappear behind it
*/
@@ -984,8 +1026,10 @@
} else {
offset += 2;
}
+ /* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
DrawBridgeTramBits(ti->x, ti->y, z, offset, HASBIT(rts, ROADTYPE_ROAD));
}
+ EndSpriteCombine();
} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
DrawCatenary(ti);
}
@@ -1031,6 +1075,25 @@
void DrawBridgeMiddle(const TileInfo* ti)
{
+ /* Sectional view of bridge bounding boxes:
+ *
+ * 1 2 1,2 = SpriteCombine of Bridge front/(back&floor) and TramCatenary
+ * 1 2 3 = empty helper BB
+ * 1 7 2 4,5 = pillars under higher bridges
+ * 1 6 88888 6 2 6 = elrail-pylons
+ * 1 6 88888 6 2 7 = elrail-wire
+ * 1 6 88888 6 2 <- TILE_HEIGHT 8 = rail-vehicle on bridge
+ * 3333333333333 <- BB_Z_SEPARATOR
+ * <- unused
+ * 4 5 <- BB_HEIGHT_UNDER_BRIDGE
+ * 4 5
+ * 4 5
+ *
+ */
+
+ /* Z position of the bridge sprites relative to bridge height (downwards) */
+ static const int BRIDGE_Z_START = 3;
+
const PalSpriteID* psid;
uint base_offset;
TileIndex rampnorth;
@@ -1066,12 +1129,19 @@
x = ti->x;
y = ti->y;
uint bridge_z = GetBridgeHeight(rampsouth);
- z = bridge_z - 3;
+ z = bridge_z - BRIDGE_Z_START;
+ /* Add a bounding box, that separates the bridge from things below it. */
+ AddSortableSpriteToDraw(SPR_EMPTY_BOUNDING_BOX, PAL_NONE, x, y, 16, 16, 1, bridge_z - TILE_HEIGHT + BB_Z_SEPARATOR);
+
+ /* Draw Trambits as SpriteCombine */
+ if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) StartSpriteCombine();
+
+ /* Draw floor and far part of bridge*/
if (axis == AXIS_X) {
- AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 11, 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
} else {
- AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 11, 16, 1, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 0, BRIDGE_Z_START);
}
psid++;
@@ -1080,7 +1150,11 @@
RoadTypes rts = GetRoadTypes(rampsouth);
if (HASBIT(rts, ROADTYPE_TRAM)) {
+ /* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HASBIT(rts, ROADTYPE_ROAD));
+ } else {
+ EndSpriteCombine();
+ StartSpriteCombine();
}
} else if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) {
DrawCatenary(ti);
@@ -1089,12 +1163,15 @@
/* draw roof, the component of the bridge which is logically between the vehicle and the camera */
if (axis == AXIS_X) {
y += 12;
- if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 4, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 0, 3, BRIDGE_Z_START);
} else {
x += 12;
- if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES));
+ if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 4, 16, 0x28, z, HASBIT(_transparent_opt, TO_BRIDGES), 3, 0, BRIDGE_Z_START);
}
+ /* Draw TramFront as SpriteCombine */
+ if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) EndSpriteCombine();
+
psid++;
if (ti->z + 5 == z) {
/* draw poles below for small bridges */
@@ -1370,7 +1447,7 @@
} else if (IsBridge(tile)) { // XXX is this necessary?
DiagDirection dir;
- if (v->HasFront() && v->IsPrimaryVehicle()) {
+ if (v->IsPrimaryVehicle()) {
/* modify speed of vehicle */
uint16 spd = _bridge[GetBridgeType(tile)].speed;
@@ -1417,6 +1494,30 @@
static CommandCost TerraformTile_TunnelBridge(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
{
+ if (_patches.build_on_slopes && AutoslopeEnabled() && IsBridge(tile)) {
+ DiagDirection direction = GetBridgeRampDirection(tile);
+ Axis axis = DiagDirToAxis(direction);
+ CommandCost res;
+
+ /* Check if new slope is valid for bridges in general (so we can savely call GetBridgeFoundation()) */
+ if ((direction == DIAGDIR_NW) || (direction == DIAGDIR_NE)) {
+ res = CheckBridgeSlopeSouth(axis, tileh_new);
+ } else {
+ res = CheckBridgeSlopeNorth(axis, tileh_new);
+ }
+
+ if (!CmdFailed(res)) {
+ uint z_old;
+ Slope tileh_old = GetTileSlope(tile, &z_old);
+
+ z_old += ApplyFoundationToSlope(GetBridgeFoundation(tileh_old, axis), &tileh_old);
+ z_new += ApplyFoundationToSlope(GetBridgeFoundation(tileh_new, axis), &tileh_new);
+
+ /* Surface slope remains unchanged? */
+ if ((z_old == z_new) && (tileh_old == tileh_new)) return _price.terraform;
+ }
+ }
+
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
--- a/src/unmovable_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/unmovable_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -24,6 +24,7 @@
#include "table/unmovable_land.h"
#include "genworld.h"
#include "bridge.h"
+#include "autoslope.h"
/** Destroy a HQ.
* During normal gameplay you can only implicitely destroy a HQ when you are
@@ -110,6 +111,8 @@
return cost;
}
+static Foundation GetFoundation_Unmovable(TileIndex tile, Slope tileh);
+
static void DrawTile_Unmovable(TileInfo *ti)
{
@@ -132,6 +135,9 @@
}
case UNMOVABLE_STATUE:
+ /* This should prevent statues from sinking into the ground when on a slope. */
+ if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, GetFoundation_Unmovable(ti->tile, ti->tileh));
+
DrawGroundSprite(SPR_CONCRETE_GROUND, PAL_NONE);
AddSortableSpriteToDraw(SPR_STATUE_COMPANY, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x, ti->y, 16, 16, 25, ti->z, HASBIT(_transparent_opt, TO_STRUCTURES));
@@ -142,7 +148,7 @@
AddSortableSpriteToDraw(
SPR_BOUGHT_LAND, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)),
- ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 10, GetSlopeZ(ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2)
+ ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, BB_HEIGHT_UNDER_BRIDGE, GetSlopeZ(ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2)
);
DrawBridgeMiddle(ti);
break;
@@ -403,6 +409,10 @@
/* Owned land remains unsold */
if (IsOwnedLand(tile) && CheckTileOwnership(tile)) return CommandCost();
+ if (AutoslopeEnabled() && (IsStatue(tile) || IsCompanyHQ(tile))) {
+ if (!IsSteepSlope(tileh_new) && (z_new + GetSlopeMaxZ(tileh_new) == GetTileMaxZ(tile))) return _price.terraform;
+ }
+
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
}
--- a/src/variables.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/variables.h Sat Oct 06 21:16:00 2007 +0000
@@ -129,8 +129,8 @@
bool measure_tooltip; // Show a permanent tooltip when dragging tools
byte liveries; // Options for displaying company liveries, 0=none, 1=self, 2=all
bool prefer_teamchat; // Choose the chat message target with <ENTER>, true=all players, false=your team
- bool advanced_vehicle_list; // Use the "advanced" vehicle list
- bool loading_indicators; // Show loading indicators
+ uint8 advanced_vehicle_list; // Use the "advanced" vehicle list
+ uint8 loading_indicators; // Show loading indicators
uint8 default_rail_type; ///< The default rail type for the rail GUI
uint8 toolbar_pos; // position of toolbars, 0=left, 1=center, 2=right
@@ -240,6 +240,13 @@
bool timetabling; ///< Whether to allow timetabling.
bool timetable_in_ticks; ///< Whether to show the timetable in ticks rather than days.
+
+ bool autoslope; ///< Allow terraforming under things.
+
+ bool mod_road_rebuild; ///< Roadworks remove unneccesary RoadBits
+
+ bool exclusive_rights; ///< allow buying exclusive rights
+ bool give_money; ///< allow giving other players money
};
VARDEF Patches _patches;
@@ -315,7 +322,7 @@
VARDEF Vehicle *_place_clicked_vehicle;
-VARDEF char _ini_videodriver[32], _ini_musicdriver[32], _ini_sounddriver[32];
+VARDEF char _ini_videodriver[32], _ini_musicdriver[32], _ini_sounddriver[32], _ini_blitter[32];
VARDEF int _num_resolutions;
VARDEF uint16 _resolutions[32][2];
@@ -335,6 +342,8 @@
extern const TileTypeProcs * const _tile_type_procs[16];
+extern bool _draw_bounding_boxes;
+
/* misc */
VARDEF char _screenshot_name[128];
VARDEF byte _vehicle_design_names;
--- a/src/vehicle.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -92,9 +92,11 @@
bool VehicleNeedsService(const Vehicle *v)
{
if (v->vehstatus & (VS_STOPPED | VS_CRASHED)) return false;
- if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
- if (v->current_order.type == OT_LOADING) return false;
- if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OF_HALT_IN_DEPOT) return false;
+ if (v->current_order.type != OT_GOTO_DEPOT || !(v->current_order.flags & OF_PART_OF_ORDERS)) { // Don't interfere with a depot visit by the order list
+ if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
+ if (v->current_order.type == OT_LOADING) return false;
+ if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OF_HALT_IN_DEPOT) return false;
+ }
if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id); /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */
@@ -500,7 +502,7 @@
case VEH_AIRCRAFT: return IsNormalAircraft(v); // don't count plane shadows and helicopter rotors
case VEH_TRAIN:
return !IsArticulatedPart(v) && // tenders and other articulated parts
- (!IsMultiheaded(v) || IsTrainEngine(v)); // rear parts of multiheaded engines
+ !IsRearDualheaded(v); // rear parts of multiheaded engines
case VEH_ROAD: return IsRoadVehFront(v);
case VEH_SHIP: return true;
default: return false; // Only count player buildable vehicles
@@ -1468,8 +1470,8 @@
{
if (v->owner != _local_player) return;
- /* Do not show getting-old message if autorenew is active */
- if (GetPlayer(v->owner)->engine_renew) return;
+ /* Do not show getting-old message if autorenew is active (and it can replace the vehicle) */
+ if (GetPlayer(v->owner)->engine_renew && GetEngine(v->engine_type)->player_avail != 0) return;
SetDParam(0, _vehicle_type_names[v->type]);
SetDParam(1, v->unitnumber);
@@ -1478,14 +1480,10 @@
void AgeVehicle(Vehicle *v)
{
- int age;
-
- if (v->age < 65535)
- v->age++;
-
- age = v->age - v->max_age;
- if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4)
- v->reliability_spd_dec <<= 1;
+ if (v->age < 65535) v->age++;
+
+ int age = v->age - v->max_age;
+ if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4) v->reliability_spd_dec <<= 1;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
@@ -1493,7 +1491,7 @@
ShowVehicleGettingOld(v, STR_01A0_IS_GETTING_OLD);
} else if (age == 0) {
ShowVehicleGettingOld(v, STR_01A1_IS_GETTING_VERY_OLD);
- } else if (age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4 || age == 366*5) {
+ } else if (age > 0 && (age % 366) == 0) {
ShowVehicleGettingOld(v, STR_01A2_IS_GETTING_VERY_OLD_AND);
}
}
@@ -1733,7 +1731,7 @@
v = v_front;
do {
- if (v->type == VEH_TRAIN && IsMultiheaded(v) && !IsTrainEngine(v)) {
+ if (v->type == VEH_TRAIN && IsRearDualheaded(v)) {
/* we build the rear ends of multiheaded trains with the front ones */
continue;
}
@@ -2621,7 +2619,7 @@
SpriteID map = PAL_NONE;
/* Check if we should use the colour map callback */
- if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_COLOUR_REMAP)) {
+ if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_VEHICLE_COLOUR_REMAP)) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_COLOUR_MAPPING, 0, 0, engine_type, v);
/* A return value of 0xC000 is stated to "use the default two-color
* maps" which happens to be the failure action too... */
--- a/src/vehicle.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle.h Sat Oct 06 21:16:00 2007 +0000
@@ -220,9 +220,12 @@
struct Vehicle;
DECLARE_OLD_POOL(Vehicle, Vehicle, 9, 125)
+/* Some declarations of functions, so we can make them friendly */
struct SaveLoad;
-const SaveLoad *GetVehicleDescription(VehicleType vt);
-void AfterLoadVehicles();
+extern const SaveLoad *GetVehicleDescription(VehicleType vt);
+extern void AfterLoadVehicles();
+struct LoadgameState;
+extern bool LoadOldVehicle(LoadgameState *ls, int num);
struct Vehicle : PoolItem<Vehicle, VehicleID, &_Vehicle_pool> {
VehicleTypeByte type; ///< Type of vehicle
@@ -234,7 +237,8 @@
Vehicle *first; // NOSAVE: pointer to the first vehicle in the chain
public:
friend const SaveLoad *GetVehicleDescription(VehicleType vt); // So we can use private/protected variables in the saveload code
- friend void AfterLoadVehicles();
+ friend void AfterLoadVehicles(); // So we can set the previous and first pointers while loading
+ friend bool LoadOldVehicle(LoadgameState *ls, int num); // So we can set the proper next pointer while loading
Vehicle *depot_list; // NOSAVE: linked list to tell what vehicles entered a depot during the last tick. Used by autoreplace
@@ -382,6 +386,11 @@
/**
* Marks the vehicles to be redrawn and updates cached variables
+ *
+ * This method marks the area of the vehicle on the screen as dirty.
+ * It can be use to repaint the vehicle.
+ *
+ * @ingroup dirty
*/
virtual void MarkDirty() {}
@@ -414,12 +423,6 @@
virtual bool IsPrimaryVehicle() const { return false; }
/**
- * Whether this vehicle understands the concept of a front engine, so
- * basically, if GetFirstVehicleInChain() can be called for it.
- */
- virtual bool HasFront() const { return false; }
-
- /**
* Gets the sprite to show for the given direction
* @param direction the direction the vehicle is facing
* @return the sprite for the given vehicle in the given direction
--- a/src/vehicle_gui.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/vehicle_gui.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -208,7 +208,7 @@
if (!HASBIT(cmask, cid)) continue;
/* Check the vehicle's callback mask for cargo suffixes */
- if (HASBIT(callbackmask, CBM_CARGO_SUFFIX)) {
+ if (HASBIT(callbackmask, CBM_VEHICLE_CARGO_SUFFIX)) {
/* Make a note of the original cargo type. It has to be
* changed to test the cargo & subtype... */
CargoID temp_cargo = u->cargo_type;
@@ -1240,7 +1240,12 @@
void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type)
{
- if (player == _local_player && _patches.advanced_vehicle_list) {
+ /* If _patches.advanced_vehicle_list > 1, display the Advanced list
+ * if _patches.advanced_vehicle_list == 1, display Advanced list only for local player
+ * if _ctrl_pressed, do the opposite action (Advanced list x Normal list)
+ */
+
+ if ((_patches.advanced_vehicle_list > (uint)(player != _local_player)) != _ctrl_pressed) {
ShowPlayerGroup(player, vehicle_type);
} else {
ShowVehicleListWindowLocal(player, VLW_STANDARD, vehicle_type, 0);
@@ -1273,6 +1278,374 @@
}
+/* Unified vehicle GUI - Vehicle Details Window */
+
+/** Constants of vehicle details widget indices */
+enum VehicleDetailsWindowWidgets {
+ VLD_WIDGET_CLOSEBOX = 0,
+ VLD_WIDGET_CAPTION,
+ VLD_WIDGET_RENAME_VEHICLE,
+ VLD_WIDGET_TOP_DETAILS,
+ VLD_WIDGET_INCREASE_SERVICING_INTERVAL,
+ VLD_WIDGET_DECREASE_SERVICING_INTERVAL,
+ VLD_WIDGET_BOTTOM_RIGHT,
+ VLD_WIDGET_MIDDLE_DETAILS,
+ VLD_WIDGET_SCROLLBAR,
+ VLD_WIDGET_DETAILS_CARGO_CARRIED,
+ VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+ VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+ VLD_WIDGET_DETAILS_TOTAL_CARGO,
+ VLD_WIDGET_RESIZE,
+};
+
+/** Vehicle details widgets. */
+static const Widget _vehicle_details_widgets[] = {
+ { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // VLD_WIDGET_CLOSEBOX
+ { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 364, 0, 13, 0x0, STR_018C_WINDOW_TITLE_DRAG_THIS}, // VLD_WIDGET_CAPTION
+ { WWT_PUSHTXTBTN, RESIZE_LR, 14, 365, 404, 0, 13, STR_01AA_NAME, STR_NULL /* filled in later */}, // VLD_WIDGET_RENAME_VEHICLE
+ { WWT_PANEL, RESIZE_RIGHT, 14, 0, 404, 14, 55, 0x0, STR_NULL}, // VLD_WIDGET_TOP_DETAILS
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 101, 106, STR_0188, STR_884D_INCREASE_SERVICING_INTERVAL}, // VLD_WIDGET_INCREASE_SERVICING_INTERVAL
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 10, 107, 112, STR_0189, STR_884E_DECREASE_SERVICING_INTERVAL}, // VLD_WIDGET_DECREASE_SERVICING_INTERVAL
+ { WWT_PANEL, RESIZE_RTB, 14, 11, 404, 101, 112, 0x0, STR_NULL}, // VLD_WIDGET_BOTTOM_RIGHT
+ { WWT_MATRIX, RESIZE_RB, 14, 0, 392, 56, 100, 0x701, STR_NULL}, // VLD_WIDGET_MIDDLE_DETAILS
+ { WWT_SCROLLBAR, RESIZE_LRB, 14, 393, 404, 56, 100, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // VLD_WIDGET_SCROLLBAR
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 95, 113, 124, STR_013C_CARGO, STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED}, // VLD_WIDGET_DETAILS_CARGO_CARRIED
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 96, 194, 113, 124, STR_013D_INFORMATION, STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES},// VLD_WIDGET_DETAILS_TRAIN_VEHICLES
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 195, 293, 113, 124, STR_013E_CAPACITIES, STR_8851_SHOW_CAPACITIES_OF_EACH}, // VLD_WIDGET_DETAILS_CAPACITY_OF_EACH
+ { WWT_PUSHTXTBTN, RESIZE_RTB, 14, 294, 392, 113, 124, STR_013E_TOTAL_CARGO, STR_8852_SHOW_TOTAL_CARGO}, // VLD_WIDGET_DETAILS_TOTAL_CARGO
+ { WWT_RESIZEBOX, RESIZE_LRTB, 14, 393, 404, 113, 124, 0x0, STR_RESIZE_BUTTON}, // VLD_RESIZE
+ { WIDGETS_END},
+};
+
+
+/** Command indices for the _vehicle_command_translation_table. */
+enum VehicleStringTranslation {
+ VST_VEHICLE_AGE_RUNNING_COST_YR,
+ VST_VEHICLE_MAX_SPEED,
+ VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR,
+ VST_VEHICLE_RELIABILITY_BREAKDOWNS,
+};
+
+/** Command codes for the shared buttons indexed by VehicleCommandTranslation and vehicle type. */
+static const StringID _vehicle_translation_table[][4] = {
+ { // VST_VEHICLE_AGE_RUNNING_COST_YR
+ STR_885D_AGE_RUNNING_COST_YR,
+ STR_900D_AGE_RUNNING_COST_YR,
+ STR_9812_AGE_RUNNING_COST_YR,
+ STR_A00D_AGE_RUNNING_COST_YR,
+ },
+ { // VST_VEHICLE_MAX_SPEED
+ STR_NULL,
+ STR_900E_MAX_SPEED,
+ STR_9813_MAX_SPEED,
+ STR_A00E_MAX_SPEED,
+ },
+ { // VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR
+ STR_885F_PROFIT_THIS_YEAR_LAST_YEAR,
+ STR_900F_PROFIT_THIS_YEAR_LAST_YEAR,
+ STR_9814_PROFIT_THIS_YEAR_LAST_YEAR,
+ STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR,
+ },
+ { // VST_VEHICLE_RELIABILITY_BREAKDOWNS
+ STR_8860_RELIABILITY_BREAKDOWNS,
+ STR_9010_RELIABILITY_BREAKDOWNS,
+ STR_9815_RELIABILITY_BREAKDOWNS,
+ STR_A010_RELIABILITY_BREAKDOWNS,
+ },
+};
+
+/** Initialize a newly created vehicle details window */
+void CreateVehicleDetailsWindow(Window *w)
+{
+ const Vehicle *v = GetVehicle(w->window_number);
+
+ switch (v->type) {
+ case VEH_TRAIN:
+ ResizeWindow(w, 0, 39);
+
+ w->vscroll.cap = 6;
+ w->height += 12;
+ w->resize.step_height = 14;
+ w->resize.height = w->height - 14 * 2; // Minimum of 4 wagons in the display
+
+ w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_8867_NAME_TRAIN;
+ w->widget[VLD_WIDGET_CAPTION].data = STR_8802_DETAILS;
+ break;
+
+ case VEH_ROAD: {
+ w->widget[VLD_WIDGET_CAPTION].data = STR_900C_DETAILS;
+ w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_902E_NAME_ROAD_VEHICLE;
+
+ if (!RoadVehHasArticPart(v)) break;
+
+ /* Draw the text under the vehicle instead of next to it, minus the
+ * height already allocated for the cargo of the first vehicle. */
+ uint height_extension = 15 - 11;
+
+ /* Add space for the cargo amount for each part. */
+ for (const Vehicle *u = v; u != NULL; u = u->Next()) {
+ height_extension += 11;
+ }
+
+ ResizeWindow(w, 0, height_extension);
+ } break;
+
+ case VEH_SHIP:
+ w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_982F_NAME_SHIP;
+ w->widget[VLD_WIDGET_CAPTION].data = STR_9811_DETAILS;
+ break;
+
+ case VEH_AIRCRAFT:
+ ResizeWindow(w, 0, 11);
+ w->widget[VLD_WIDGET_RENAME_VEHICLE].tooltips = STR_A032_NAME_AIRCRAFT;
+ w->widget[VLD_WIDGET_CAPTION].data = STR_A00C_DETAILS;
+ break;
+ default: NOT_REACHED();
+ }
+
+ if (v->type != VEH_TRAIN) {
+ w->vscroll.cap = 1;
+ w->widget[VLD_WIDGET_MIDDLE_DETAILS].right += 12;
+ }
+
+ w->widget[VLD_WIDGET_MIDDLE_DETAILS].data = (w->vscroll.cap << 8) + 1;
+ w->caption_color = v->owner;
+
+ WP(w, vehicledetails_d).tab = 0;
+}
+
+/** Checks whether service interval is enabled for the vehicle. */
+static bool inline IsVehicleServiceIntervalEnabled(const VehicleType vehicle_type)
+{
+ switch (vehicle_type) {
+ case VEH_TRAIN: return _patches.servint_trains != 0; break;
+ case VEH_ROAD: return _patches.servint_roadveh != 0; break;
+ case VEH_SHIP: return _patches.servint_ships != 0; break;
+ case VEH_AIRCRAFT: return _patches.servint_aircraft != 0; break;
+ default: NOT_REACHED();
+ }
+}
+
+extern int GetTrainDetailsWndVScroll(VehicleID veh_id, byte det_tab);
+extern void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vscroll_cap, byte det_tab);
+extern void DrawRoadVehDetails(const Vehicle *v, int x, int y);
+extern void DrawShipDetails(const Vehicle *v, int x, int y);
+extern void DrawAircraftDetails(const Vehicle *v, int x, int y);
+
+/**
+* Draw the details for the given vehicle at the position (x,y) of the Details windows
+*
+* @param v current vehicle
+* @param x The x coordinate
+* @param y The y coordinate
+* @param vscroll_pos (train only)
+* @param vscroll_cap (train only)
+* @param det_tab (train only)
+*/
+static inline void DrawVehicleDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint vscroll_cap, byte det_tab)
+{
+ switch (v->type) {
+ case VEH_TRAIN: DrawTrainDetails(v, x, y, vscroll_pos, vscroll_cap, det_tab); break;
+ case VEH_ROAD: DrawRoadVehDetails(v, x, y); break;
+ case VEH_SHIP: DrawShipDetails(v, x, y); break;
+ case VEH_AIRCRAFT: DrawAircraftDetails(v, x, y); break;
+ default: NOT_REACHED();
+ }
+}
+
+/** Repaint vehicle details window. */
+static void DrawVehicleDetailsWindow(Window *w)
+{
+ const Vehicle *v = GetVehicle(w->window_number);
+ byte det_tab = WP(w, vehicledetails_d).tab;
+
+ SetWindowWidgetDisabledState(w, VLD_WIDGET_RENAME_VEHICLE, v->owner != _local_player);
+
+ if (v->type == VEH_TRAIN) {
+ DisableWindowWidget(w, det_tab + VLD_WIDGET_DETAILS_CARGO_CARRIED);
+ SetVScrollCount(w, GetTrainDetailsWndVScroll(v->index, det_tab));
+ }
+
+ SetWindowWidgetsHiddenState(w, v->type != VEH_TRAIN,
+ VLD_WIDGET_SCROLLBAR,
+ VLD_WIDGET_DETAILS_CARGO_CARRIED,
+ VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+ VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+ VLD_WIDGET_DETAILS_TOTAL_CARGO,
+ VLD_WIDGET_RESIZE,
+ WIDGET_LIST_END);
+
+ /* Disable service-scroller when interval is set to disabled */
+ SetWindowWidgetsDisabledState(w, !IsVehicleServiceIntervalEnabled(v->type),
+ VLD_WIDGET_INCREASE_SERVICING_INTERVAL,
+ VLD_WIDGET_DECREASE_SERVICING_INTERVAL,
+ WIDGET_LIST_END);
+
+
+ SetDParam(0, v->index);
+ DrawWindowWidgets(w);
+
+ /* Draw running cost */
+ SetDParam(1, v->age / 366);
+ SetDParam(0, (v->age + 365 < v->max_age) ? STR_AGE : STR_AGE_RED);
+ SetDParam(2, v->max_age / 366);
+ SetDParam(3, v->GetDisplayRunningCost());
+ DrawString(2, 15, _vehicle_translation_table[VST_VEHICLE_AGE_RUNNING_COST_YR][v->type], 0);
+
+ /* Draw max speed */
+ switch (v->type) {
+ case VEH_TRAIN:
+ SetDParam(2, v->GetDisplayMaxSpeed());
+ SetDParam(1, v->u.rail.cached_power);
+ SetDParam(0, v->u.rail.cached_weight);
+ SetDParam(3, v->u.rail.cached_max_te / 1000);
+ DrawString(2, 25, (_patches.realistic_acceleration && v->u.rail.railtype != RAILTYPE_MAGLEV) ?
+ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :
+ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, 0);
+ break;
+
+ case VEH_ROAD:
+ case VEH_SHIP:
+ case VEH_AIRCRAFT:
+ SetDParam(0, v->GetDisplayMaxSpeed());
+ DrawString(2, 25, _vehicle_translation_table[VST_VEHICLE_MAX_SPEED][v->type], 0);
+ break;
+
+ default: NOT_REACHED();
+ }
+
+ /* Draw profit */
+ SetDParam(0, v->profit_this_year);
+ SetDParam(1, v->profit_last_year);
+ DrawString(2, 35, _vehicle_translation_table[VST_VEHICLE_PROFIT_THIS_YEAR_LAST_YEAR][v->type], 0);
+
+ /* Draw breakdown & reliability */
+ SetDParam(0, v->reliability * 100 >> 16);
+ SetDParam(1, v->breakdowns_since_last_service);
+ DrawString(2, 45, _vehicle_translation_table[VST_VEHICLE_RELIABILITY_BREAKDOWNS][v->type], 0);
+
+ /* Draw service interval text */
+ SetDParam(0, v->service_interval);
+ SetDParam(1, v->date_of_last_service);
+ DrawString(13, w->height - (v->type != VEH_TRAIN ? 11 : 23), _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
+
+ switch (v->type) {
+ case VEH_TRAIN:
+ DrawVehicleDetails(v, 2, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
+ break;
+
+ case VEH_ROAD:
+ case VEH_SHIP:
+ case VEH_AIRCRAFT:
+ DrawVehicleImage(v, 3, 57, 0, 0, INVALID_VEHICLE);
+ DrawVehicleDetails(v, 75, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
+ break;
+
+ default: NOT_REACHED();
+ }
+}
+
+/** Message strings for renaming vehicles indexed by vehicle type. */
+static const StringID _name_vehicle_title[] = {
+ STR_8865_NAME_TRAIN,
+ STR_902C_NAME_ROAD_VEHICLE,
+ STR_9831_NAME_SHIP,
+ STR_A030_NAME_AIRCRAFT
+};
+
+/** Message strings for error while renaming indexed by vehicle type. */
+static const StringID _name_vehicle_error[] = {
+ STR_8866_CAN_T_NAME_TRAIN,
+ STR_902D_CAN_T_NAME_ROAD_VEHICLE,
+ STR_9832_CAN_T_NAME_SHIP,
+ STR_A031_CAN_T_NAME_AIRCRAFT
+};
+
+/** Window event hook for vehicle details. */
+static void VehicleDetailsWndProc(Window *w, WindowEvent *e)
+{
+ switch (e->event) {
+ case WE_CREATE:
+ CreateVehicleDetailsWindow(w);
+ break;
+
+ case WE_PAINT:
+ DrawVehicleDetailsWindow(w);
+ break;
+
+ case WE_CLICK: {
+ switch (e->we.click.widget) {
+ case VLD_WIDGET_RENAME_VEHICLE: {// rename
+ const Vehicle *v = GetVehicle(w->window_number);
+ SetDParam(0, v->index);
+ ShowQueryString(STR_VEHICLE_NAME, _name_vehicle_title[v->type], 31, 150, w, CS_ALPHANUMERAL);
+ } break;
+
+ case VLD_WIDGET_INCREASE_SERVICING_INTERVAL: // increase int
+ case VLD_WIDGET_DECREASE_SERVICING_INTERVAL: { // decrease int
+ int mod = _ctrl_pressed ? 5 : 10;
+ const Vehicle *v = GetVehicle(w->window_number);
+
+ mod = (e->we.click.widget == VLD_WIDGET_DECREASE_SERVICING_INTERVAL) ? -mod : mod;
+ mod = GetServiceIntervalClamped(mod + v->service_interval);
+ if (mod == v->service_interval) return;
+
+ DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
+ } break;
+
+ case VLD_WIDGET_DETAILS_CARGO_CARRIED:
+ case VLD_WIDGET_DETAILS_TRAIN_VEHICLES:
+ case VLD_WIDGET_DETAILS_CAPACITY_OF_EACH:
+ case VLD_WIDGET_DETAILS_TOTAL_CARGO:
+ SetWindowWidgetsDisabledState(w, false,
+ VLD_WIDGET_DETAILS_CARGO_CARRIED,
+ VLD_WIDGET_DETAILS_TRAIN_VEHICLES,
+ VLD_WIDGET_DETAILS_CAPACITY_OF_EACH,
+ VLD_WIDGET_DETAILS_TOTAL_CARGO,
+ e->we.click.widget,
+ WIDGET_LIST_END);
+
+ WP(w, vehicledetails_d).tab = e->we.click.widget - VLD_WIDGET_DETAILS_CARGO_CARRIED;
+ SetWindowDirty(w);
+ break;
+ }
+ } break;
+
+ case WE_ON_EDIT_TEXT:
+ if (!StrEmpty(e->we.edittext.str)) {
+ _cmd_text = e->we.edittext.str;
+ DoCommandP(0, w->window_number, 0, NULL, CMD_NAME_VEHICLE | CMD_MSG(_name_vehicle_error[GetVehicle(w->window_number)->type]));
+ }
+ break;
+
+ case WE_RESIZE:
+ if (e->we.sizing.diff.x != 0) ResizeButtons(w, VLD_WIDGET_DETAILS_CARGO_CARRIED, VLD_WIDGET_DETAILS_TOTAL_CARGO);
+ if (e->we.sizing.diff.y == 0) break;
+
+ w->vscroll.cap += e->we.sizing.diff.y / 14;
+ w->widget[VLD_WIDGET_MIDDLE_DETAILS].data = (w->vscroll.cap << 8) + 1;
+ break;
+ }
+}
+
+/** Vehicle details window descriptor. */
+static const WindowDesc _vehicle_details_desc = {
+ WDP_AUTO, WDP_AUTO, 405, 113, 405, 113,
+ WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
+ WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
+ _vehicle_details_widgets,
+ VehicleDetailsWndProc
+};
+
+/** Shows the vehicle details window of the given vehicle. */
+static void ShowVehicleDetailsWindow(const Vehicle *v)
+{
+ DeleteWindowById(WC_VEHICLE_ORDERS, v->index);
+ DeleteWindowById(WC_VEHICLE_DETAILS, v->index);
+ AllocateWindowDescFront(&_vehicle_details_desc, v->index);
+}
+
+
/* Unified vehicle GUI - Vehicle View Window */
/** Constants of vehicle view widget indices */
@@ -1509,27 +1882,6 @@
}
}
-
-/* When unified GUI is complete these functions will also be unified to one
- * function in this module */
-void ShowAircraftDetailsWindow(const Vehicle *v);
-void ShowShipDetailsWindow(const Vehicle *v);
-void ShowRoadVehDetailsWindow(const Vehicle *v);
-void ShowTrainDetailsWindow(const Vehicle *v);
-
-
-/** Provisional dispatch to vehicle-specific detail window functions. */
-static void ShowVehicleDetailsWindow(const Vehicle *v)
-{
- switch (v->type) {
- case VEH_TRAIN: ShowTrainDetailsWindow(v); break;
- case VEH_ROAD: ShowRoadVehDetailsWindow(v); break;
- case VEH_SHIP: ShowShipDetailsWindow(v); break;
- case VEH_AIRCRAFT: ShowAircraftDetailsWindow(v); break;
- default: NOT_REACHED();
- }
-}
-
/** Checks whether the vehicle may be refitted at the moment.*/
static bool IsVehicleRefitable(const Vehicle *v)
{
--- a/src/video/win32_v.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/video/win32_v.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -494,6 +494,9 @@
* WM_KEYDOWN only handles CTRL+ commands and special keys like VK_LEFT, etc. */
if (keycode == 0 || (keycode > WKC_PAUSE && GB(keycode, 13, 4) == 0)) return 0;
+ /* Keys handled in WM_CHAR */
+ if ((uint)(GB(keycode, 0, 12) - WKC_NUM_DIV) <= WKC_MINUS - WKC_NUM_DIV) return 0;
+
HandleKeypress(0 | (keycode << 16));
return 0;
}
--- a/src/viewport.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/viewport.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -67,6 +67,7 @@
struct TileSpriteToDraw {
SpriteID image;
SpriteID pal;
+ const SubSprite *sub; ///< only draw a rectangular part of the sprite
TileSpriteToDraw *next;
int32 x;
int32 y;
@@ -76,31 +77,41 @@
struct ChildScreenSpriteToDraw {
SpriteID image;
SpriteID pal;
+ const SubSprite *sub; ///< only draw a rectangular part of the sprite
int32 x;
int32 y;
ChildScreenSpriteToDraw *next;
};
struct ParentSpriteToDraw {
- SpriteID image;
- SpriteID pal;
- int32 left;
- int32 top;
- int32 right;
- int32 bottom;
- int32 xmin;
- int32 ymin;
- int32 xmax;
- int32 ymax;
- ChildScreenSpriteToDraw *child;
- byte unk16;
- byte zmin;
- byte zmax;
+ SpriteID image; ///< sprite to draw
+ SpriteID pal; ///< palette to use
+ const SubSprite *sub; ///< only draw a rectangular part of the sprite
+
+ int32 x; ///< screen X coordinate of sprite
+ int32 y; ///< screen Y coordinate of sprite
+
+ int32 left; ///< minimal screen X coordinate of sprite (= x + sprite->x_offs), reference point for child sprites
+ int32 top; ///< minimal screen Y coordinate of sprite (= y + sprite->y_offs), reference point for child sprites
+
+ int32 xmin; ///< minimal world X coordinate of bounding box
+ int32 xmax; ///< maximal world X coordinate of bounding box
+ int32 ymin; ///< minimal world Y coordinate of bounding box
+ int32 ymax; ///< maximal world Y coordinate of bounding box
+ int zmin; ///< minimal world Z coordinate of bounding box
+ int zmax; ///< maximal world Z coordinate of bounding box
+
+ ChildScreenSpriteToDraw *child; ///< head of child list;
+ bool comparison_done; ///< Used during sprite sorting: true if sprite has been compared with all other sprites
};
/* Quick hack to know how much memory to reserve when allocating from the spritelist
* to prevent a buffer overflow. */
#define LARGEST_SPRITELIST_STRUCT ParentSpriteToDraw
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(StringSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(TileSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ChildScreenSpriteToDraw));
+assert_compile(sizeof(LARGEST_SPRITELIST_STRUCT) >= sizeof(ParentSpriteToDraw));
struct ViewportDrawer {
DrawPixelInfo dpi;
@@ -421,7 +432,18 @@
InvalidateWidget(w, widget_zoom_out);
}
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z)
+/**
+ * Draws a ground sprite at a specific world-coordinate.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x position x of the sprite.
+ * @param y position y of the sprite.
+ * @param z position z of the sprite.
+ * @param sub Only draw a part of the sprite.
+ *
+ */
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub)
{
ViewportDrawer *vd = _cur_vd;
TileSpriteToDraw *ts;
@@ -438,6 +460,7 @@
ts->image = image;
ts->pal = pal;
+ ts->sub = sub;
ts->next = NULL;
ts->x = x;
ts->y = y;
@@ -446,14 +469,22 @@
vd->last_tile = &ts->next;
}
-void DrawGroundSprite(SpriteID image, SpriteID pal)
+/**
+ * Draws a ground sprite for the current tile.
+ * If the current tile is drawn on top of a foundation the sprite is added as child sprite to the "foundation"-ParentSprite.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param sub Only draw a part of the sprite.
+ */
+void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub)
{
if (_offset_ground_sprites) {
/* offset ground sprite because of foundation? */
- AddChildSpriteScreen(image, pal, _cur_vd->offs_x, _cur_vd->offs_y);
+ AddChildSpriteScreen(image, pal, _cur_vd->offs_x, _cur_vd->offs_y, false, sub);
} else {
_added_tile_sprite = true;
- DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z);
+ DrawGroundSpriteAt(image, pal, _cur_ti->x, _cur_ti->y, _cur_ti->z, sub);
}
}
@@ -465,7 +496,18 @@
_offset_ground_sprites = true;
}
-static void AddCombinedSprite(SpriteID image, SpriteID pal, int x, int y, byte z)
+/**
+ * Adds a child sprite to a parent sprite.
+ * In contrast to "AddChildSpriteScreen()" the sprite position is in world coordinates
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x position x of the sprite.
+ * @param y position y of the sprite.
+ * @param z position z of the sprite.
+ * @param sub Only draw a part of the sprite.
+ */
+static void AddCombinedSprite(SpriteID image, SpriteID pal, int x, int y, byte z, const SubSprite *sub)
{
const ViewportDrawer *vd = _cur_vd;
Point pt = RemapCoords(x, y, z);
@@ -477,26 +519,39 @@
pt.y + spr->y_offs + spr->height <= vd->dpi.top)
return;
- AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top);
+ AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top, false, sub);
}
-/** Draw a (transparent) sprite at given coordinates
+/** Draw a (transparent) sprite at given coordinates with a given bounding box.
+ * The bounding box extends from (x + bb_offset_x, y + bb_offset_y, z + bb_offset_z) to (x + w - 1, y + h - 1, z + dz - 1), both corners included.
+ * Bounding boxes with bb_offset_x == w or bb_offset_y == h or bb_offset_z == dz are allowed and produce thin slices.
+ *
+ * @note Bounding boxes are normally specified with bb_offset_x = bb_offset_y = bb_offset_z = 0. The extent of the bounding box in negative direction is
+ * defined by the sprite offset in the grf file.
+ * However if modifying the sprite offsets is not suitable (e.g. when using existing graphics), the bounding box can be tuned by bb_offset.
+ *
+ * @pre w >= bb_offset_x, h >= bb_offset_y, dz >= bb_offset_z. Else w, h or dz are ignored.
+ *
* @param image the image to combine and draw,
* @param pal the provided palette,
- * @param x position x of the sprite,
- * @param y position y of the sprite,
- * @param w width of the sprite,
- * @param h height of the sprite,
- * @param dz delta z, difference of elevation between sprite and parent sprite,
- * @param z elevation of the sprite,
- * @param transparent if true, switch the palette between the provided palette and the transparent palette
+ * @param x position X (world) of the sprite,
+ * @param y position Y (world) of the sprite,
+ * @param w bounding box extent towards positive X (world),
+ * @param h bounding box extent towards positive Y (world),
+ * @param dz bounding box extent towards positive Z (world),
+ * @param z position Z (world) of the sprite,
+ * @param transparent if true, switch the palette between the provided palette and the transparent palette,
+ * @param bb_offset_x bounding box extent towards negative X (world),
+ * @param bb_offset_y bounding box extent towards negative Y (world),
+ * @param bb_offset_z bounding box extent towards negative Z (world)
+ * @param sub Only draw a part of the sprite.
*/
-void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent)
+void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
{
ViewportDrawer *vd = _cur_vd;
ParentSpriteToDraw *ps;
- const Sprite *spr;
Point pt;
+ int32 left, right, top, bottom;
assert((image & SPRITE_MASK) < MAX_SPRITES);
@@ -507,7 +562,7 @@
}
if (vd->combine_sprites == 2) {
- AddCombinedSprite(image, pal, x, y, z);
+ AddCombinedSprite(image, pal, x, y, z, sub);
return;
}
@@ -531,11 +586,34 @@
}
pt = RemapCoords(x, y, z);
- spr = GetSprite(image & SPRITE_MASK);
- if ((ps->left = (pt.x += spr->x_offs)) >= vd->dpi.left + vd->dpi.width ||
- (ps->right = (pt.x + spr->width )) <= vd->dpi.left ||
- (ps->top = (pt.y += spr->y_offs)) >= vd->dpi.top + vd->dpi.height ||
- (ps->bottom = (pt.y + spr->height)) <= vd->dpi.top) {
+ ps->x = pt.x;
+ ps->y = pt.y;
+
+ /* Compute screen extents of sprite */
+ if (image == SPR_EMPTY_BOUNDING_BOX) {
+ left = ps->left = RemapCoords(x + w , y + bb_offset_y, z + bb_offset_z).x;
+ right = RemapCoords(x + bb_offset_x, y + h , z + bb_offset_z).x + 1;
+ top = ps->top = RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz ).y;
+ bottom = RemapCoords(x + w , y + h , z + bb_offset_z).y + 1;
+ } else {
+ const Sprite *spr = GetSprite(image & SPRITE_MASK);
+ left = ps->left = (pt.x += spr->x_offs);
+ right = (pt.x + spr->width );
+ top = ps->top = (pt.y += spr->y_offs);
+ bottom = (pt.y + spr->height);
+ }
+ if (_draw_bounding_boxes && (image != SPR_EMPTY_BOUNDING_BOX)) {
+ /* Compute maximal extents of sprite and it's bounding box */
+ left = min(left , RemapCoords(x + w , y + bb_offset_y, z + bb_offset_z).x);
+ right = max(right , RemapCoords(x + bb_offset_x, y + h , z + bb_offset_z).x + 1);
+ top = min(top , RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz ).y);
+ bottom = max(bottom, RemapCoords(x + w , y + h , z + bb_offset_z).y + 1);
+ }
+ /* Do not add the sprite to the viewport, if it is outside */
+ if (left >= vd->dpi.left + vd->dpi.width ||
+ right <= vd->dpi.left ||
+ top >= vd->dpi.top + vd->dpi.height ||
+ bottom <= vd->dpi.top) {
return;
}
@@ -543,16 +621,17 @@
ps->image = image;
ps->pal = pal;
- ps->xmin = x;
- ps->xmax = x + w - 1;
-
- ps->ymin = y;
- ps->ymax = y + h - 1;
-
- ps->zmin = z;
- ps->zmax = z + dz - 1;
-
- ps->unk16 = 0;
+ ps->sub = sub;
+ ps->xmin = x + bb_offset_x;
+ ps->xmax = x + max(bb_offset_x, w) - 1;
+
+ ps->ymin = y + bb_offset_y;
+ ps->ymax = y + max(bb_offset_y, h) - 1;
+
+ ps->zmin = z + bb_offset_z;
+ ps->zmax = z + max(bb_offset_z, dz) - 1;
+
+ ps->comparison_done = false;
ps->child = NULL;
vd->last_child = &ps->child;
@@ -571,19 +650,36 @@
_cur_vd->combine_sprites = 0;
}
-void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y)
+/**
+ * Add a child sprite to a parent sprite.
+ *
+ * @param image the image to draw.
+ * @param pal the provided palette.
+ * @param x sprite x-offset (screen coordinates) relative to parent sprite.
+ * @param y sprite y-offset (screen coordinates) relative to parent sprite.
+ * @param transparent if true, switch the palette between the provided palette and the transparent palette,
+ * @param sub Only draw a part of the sprite.
+ */
+void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent, const SubSprite *sub)
{
ViewportDrawer *vd = _cur_vd;
ChildScreenSpriteToDraw *cs;
assert((image & SPRITE_MASK) < MAX_SPRITES);
+ /* make the sprites transparent with the right palette */
+ if (transparent) {
+ SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
+ pal = PALETTE_TO_TRANSPARENT;
+ }
+
if (vd->spritelist_mem >= vd->eof_spritelist_mem) {
DEBUG(sprite, 0, "Out of sprite memory");
return;
}
cs = (ChildScreenSpriteToDraw*)vd->spritelist_mem;
+ /* If the ParentSprite was clipped by the viewport bounds, do not draw the ChildSprites either */
if (vd->last_child == NULL) return;
vd->spritelist_mem += sizeof(ChildScreenSpriteToDraw);
@@ -593,6 +689,7 @@
cs->image = image;
cs->pal = pal;
+ cs->sub = sub;
cs->x = x;
cs->y = y;
cs->next = NULL;
@@ -636,6 +733,17 @@
}
}
+/**
+ * Draws a selection rectangle on a tile.
+ *
+ * @param ti TileInfo Tile that is being drawn
+ * @param pal Palette to apply.
+ */
+static void DrawTileSelectionRect(const TileInfo *ti, SpriteID pal)
+{
+ DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], pal, ti);
+}
+
static bool IsPartOfAutoLine(int px, int py)
{
px -= _thd.selstart.x;
@@ -669,17 +777,38 @@
#include "table/autorail.h"
/**
+ * Draws autorail highlights.
+ *
+ * @param *ti TileInfo Tile that is being drawn
+ * @param autorail_type Offset into _AutorailTilehSprite[][]
+ */
+static void DrawAutorailSelection(const TileInfo *ti, uint autorail_type)
+{
+ SpriteID image;
+ SpriteID pal;
+ int offset;
+
+ offset = _AutorailTilehSprite[ti->tileh][autorail_type];
+ if (offset >= 0) {
+ image = SPR_AUTORAIL_BASE + offset;
+ pal = PAL_NONE;
+ } else {
+ image = SPR_AUTORAIL_BASE - offset;
+ pal = PALETTE_SEL_TILE_RED;
+ }
+
+ DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+}
+
+/**
* Checks if the specified tile is selected and if so draws selection using correct selectionstyle.
* @param *ti TileInfo Tile that is being drawn
*/
static void DrawTileSelection(const TileInfo *ti)
{
- SpriteID image;
- SpriteID pal;
-
/* Draw a red error square? */
if (_thd.redsq != 0 && _thd.redsq == ti->tile) {
- DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], PALETTE_TILE_RED_PULSATING, ti);
+ DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
return;
}
@@ -705,17 +834,15 @@
if (_thd.FSMportMask != NULL) m++;
}
if (*b != 255) {
- image = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
if (_thd.FSMportMask != NULL) {
- DrawSelectionSprite(image, *m & 0x80 ? PALETTE_SEL_TILE_BLUE : (SpriteID)PALETTE_SEL_TILE_GREEN, ti);
+ DrawTileSelectionRect(ti, *m & 0x80 ? PALETTE_SEL_TILE_BLUE : PALETTE_SEL_TILE_GREEN);
} else {
- DrawSelectionSprite(image, PAL_NONE, ti);
+ DrawTileSelectionRect(ti, PAL_NONE);
}
}
}
if (_thd.FSMportLayout == NULL) {
- image = SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh];
- DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE, ti);
+ DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
}
} else if (_thd.drawstyle & HT_POINT) {
/* Figure out the Z coordinate for the single dot. */
@@ -728,25 +855,12 @@
} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
/* autorail highlight piece under cursor */
uint type = _thd.drawstyle & 0xF;
- int offset;
-
assert(type <= 5);
-
- offset = _AutorailTilehSprite[ti->tileh][_AutorailType[type][0]];
- if (offset >= 0) {
- image = SPR_AUTORAIL_BASE + offset;
- pal = PAL_NONE;
- } else {
- image = SPR_AUTORAIL_BASE - offset;
- pal = PALETTE_TO_RED;
- }
-
- DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+ DrawAutorailSelection(ti, _AutorailType[type][0]);
} else if (IsPartOfAutoLine(ti->x, ti->y)) {
/* autorail highlighting long line */
int dir = _thd.drawstyle & ~0xF0;
- int offset;
uint side;
if (dir < 2) {
@@ -756,16 +870,7 @@
side = delta(delta(TileX(start), TileX(ti->tile)), delta(TileY(start), TileY(ti->tile)));
}
- offset = _AutorailTilehSprite[ti->tileh][_AutorailType[dir][side]];
- if (offset >= 0) {
- image = SPR_AUTORAIL_BASE + offset;
- pal = PAL_NONE;
- } else {
- image = SPR_AUTORAIL_BASE - offset;
- pal = PALETTE_TO_RED;
- }
-
- DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
+ DrawAutorailSelection(ti, _AutorailType[dir][side]);
}
return;
}
@@ -776,7 +881,7 @@
IS_INSIDE_1D(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
IS_INSIDE_1D(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
/* Draw a blue rect. */
- DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], PALETTE_SEL_TILE_BLUE, ti);
+ DrawTileSelectionRect(ti, PALETTE_SEL_TILE_BLUE);
return;
}
}
@@ -1146,7 +1251,7 @@
{
do {
Point pt = RemapCoords(ts->x, ts->y, ts->z);
- DrawSprite(ts->image, ts->pal, pt.x, pt.y);
+ DrawSprite(ts->image, ts->pal, pt.x, pt.y, ts->sub);
ts = ts->next;
} while (ts != NULL);
}
@@ -1156,23 +1261,23 @@
while (*psd != NULL) {
ParentSpriteToDraw* ps = *psd;
- if (!(ps->unk16 & 1)) {
+ if (!ps->comparison_done) {
ParentSpriteToDraw** psd2 = psd;
- ps->unk16 |= 1;
+ ps->comparison_done = true;
while (*++psd2 != NULL) {
ParentSpriteToDraw* ps2 = *psd2;
ParentSpriteToDraw** psd3;
- if (ps2->unk16 & 1) continue;
+ if (ps2->comparison_done) continue;
/* Decide which comparator to use, based on whether the bounding
* boxes overlap
*/
- if (ps->xmax > ps2->xmin && ps->xmin < ps2->xmax && // overlap in X?
- ps->ymax > ps2->ymin && ps->ymin < ps2->ymax && // overlap in Y?
- ps->zmax > ps2->zmin && ps->zmin < ps2->zmax) { // overlap in Z?
+ if (ps->xmax >= ps2->xmin && ps->xmin <= ps2->xmax && // overlap in X?
+ ps->ymax >= ps2->ymin && ps->ymin <= ps2->ymax && // overlap in Y?
+ ps->zmax >= ps2->zmin && ps->zmin <= ps2->zmax) { // overlap in Z?
/* Use X+Y+Z as the sorting order, so sprites closer to the bottom of
* the screen and with higher Z elevation, are drawn in front.
* Here X,Y,Z are the coordinates of the "center of mass" of the sprite,
@@ -1184,13 +1289,13 @@
continue;
}
} else {
+ /* We only change the order, if it is definite.
+ * I.e. every single order of X, Y, Z says ps2 is behind ps or they overlap.
+ * That is: If one partial order says ps behind ps2, do not change the order.
+ */
if (ps->xmax < ps2->xmin ||
ps->ymax < ps2->ymin ||
- ps->zmax < ps2->zmin || (
- ps->xmin < ps2->xmax &&
- ps->ymin < ps2->ymax &&
- ps->zmin < ps2->zmax
- )) {
+ ps->zmax < ps2->zmin) {
continue;
}
}
@@ -1215,17 +1320,36 @@
{
for (; *psd != NULL; psd++) {
const ParentSpriteToDraw* ps = *psd;
- Point pt = RemapCoords(ps->xmin, ps->ymin, ps->zmin);
const ChildScreenSpriteToDraw* cs;
- DrawSprite(ps->image, ps->pal, pt.x, pt.y);
+ if (ps->image != SPR_EMPTY_BOUNDING_BOX) DrawSprite(ps->image, ps->pal, ps->x, ps->y, ps->sub);
for (cs = ps->child; cs != NULL; cs = cs->next) {
- DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y);
+ DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub);
}
}
}
+/**
+ * Draws the bounding boxes of all ParentSprites
+ * @param psd Array of ParentSprites
+ */
+static void ViewportDrawBoundingBoxes(ParentSpriteToDraw *psd[])
+{
+ for (; *psd != NULL; psd++) {
+ const ParentSpriteToDraw* ps = *psd;
+ Point pt1 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmax + 1); // top front corner
+ Point pt2 = RemapCoords(ps->xmin , ps->ymax + 1, ps->zmax + 1); // top left corner
+ Point pt3 = RemapCoords(ps->xmax + 1, ps->ymin , ps->zmax + 1); // top right corner
+ Point pt4 = RemapCoords(ps->xmax + 1, ps->ymax + 1, ps->zmin ); // bottom front corner
+
+ DrawBox( pt1.x, pt1.y,
+ pt2.x - pt1.x, pt2.y - pt1.y,
+ pt3.x - pt1.x, pt3.y - pt1.y,
+ pt4.x - pt1.x, pt4.y - pt1.y);
+ }
+}
+
static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDraw *ss)
{
DrawPixelInfo dp;
@@ -1349,6 +1473,7 @@
ViewportSortParentSprites(parent_list);
ViewportDrawParentSprites(parent_list);
+ if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(parent_list);
if (vd.first_string != NULL) ViewportDrawStrings(&vd.dpi, vd.first_string);
@@ -1466,6 +1591,14 @@
}
}
+/**
+ * Marks a viewport as dirty for repaint.
+ *
+ * @param vp The viewport to mark as dirty
+ * @todo documents the missing parameters @c left, @c top, @c right and @c bottom
+ * @todo detailed description missing
+ * @ingroup dirty
+ */
static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, int bottom)
{
right -= vp->virtual_left;
@@ -1531,6 +1664,14 @@
);
}
+/**
+ * Marks the selected tiles as dirty.
+ *
+ * This function marks the selected tiles as dirty for repaint
+ *
+ * @note Documentation may be wrong (Progman)
+ * @ingroup dirty
+ */
static void SetSelectionTilesDirty()
{
int y_size, x_size;
--- a/src/viewport.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/viewport.h Sat Oct 06 21:16:00 2007 +0000
@@ -45,13 +45,24 @@
while (DoZoomInOutWindow(how, w)) {};
}
+/**
+ * Some values for constructing bounding boxes (BB). The Z positions under bridges are:
+ * z=0..5 Everything that can be built under low bridges.
+ * z=6 reserved, currently unused.
+ * z=7 Z separator between bridge/tunnel and the things under/above it.
+ */
+enum {
+ BB_HEIGHT_UNDER_BRIDGE = 6, ///< Everything that can be built under low bridges, must not exceed this Z height.
+ BB_Z_SEPARATOR = 7, ///< Separates the bridge/tunnel from the things under/above it.
+};
+
void OffsetGroundSprite(int x, int y);
-void DrawGroundSprite(SpriteID image, SpriteID pal);
-void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z);
-void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, byte dz, byte z, bool transparent = false);
+void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub = NULL);
+void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub = NULL);
+void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = NULL);
void *AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2);
-void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y);
+void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent = false, const SubSprite *sub = NULL);
void StartSpriteCombine();
--- a/src/water_cmd.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/water_cmd.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -183,6 +183,15 @@
return CommandCost(_price.clear_water * 2);
}
+/**
+ * Marks the tiles around a tile as dirty.
+ *
+ * This functions marks the tiles around a given tile as dirty for repaint.
+ *
+ * @param tile The center of the tile where all other tiles are marked as dirty
+ * @ingroup dirty
+ * @see TerraformAddDirtyTileAround
+ */
static void MarkTilesAroundDirty(TileIndex tile)
{
MarkTileDirtyByTile(TILE_ADDXY(tile, 0, 1));
--- a/src/win32.cpp Thu Sep 06 19:42:48 2007 +0000
+++ b/src/win32.cpp Sat Oct 06 21:16:00 2007 +0000
@@ -1031,6 +1031,7 @@
void DetermineBasePaths(const char *exe)
{
+ extern void ScanForTarFiles();
char tmp[MAX_PATH];
TCHAR path[MAX_PATH];
#ifdef WITH_PERSONAL_DIR
@@ -1076,6 +1077,8 @@
_searchpaths[SP_INSTALLATION_DIR] = NULL;
_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL;
+
+ ScanForTarFiles();
}
/**
--- a/src/window.h Thu Sep 06 19:42:48 2007 +0000
+++ b/src/window.h Sat Oct 06 21:16:00 2007 +0000
@@ -378,10 +378,10 @@
};
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(order_d));
-struct traindetails_d {
+struct vehicledetails_d {
byte tab;
};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(traindetails_d));
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehicledetails_d));
struct smallmap_d {
int32 scroll_x;
@@ -565,6 +565,12 @@
/* window.cpp */
void CallWindowEventNP(Window *w, int event);
void CallWindowTickEvent();
+
+/**
+ * Marks the window as dirty for repaint.
+ *
+ * @ingroup dirty
+ */
void SetWindowDirty(const Window *w);
void SendWindowMessage(WindowClass wnd_class, WindowNumber wnd_num, int msg, int wparam, int lparam);
void SendWindowMessageClass(WindowClass wnd_class, int msg, int wparam, int lparam);