# HG changeset patch # User rubidium # Date 1190533058 0 # Node ID d2a6acdbd665a1696eb0a5aaa716e40c09d9b44b # Parent e782b59f1f6a4ca0755f573223ff73222a3f7f2b (svn r11146) [NoAI] -Sync: with trunk r11035:11045. diff -r e782b59f1f6a -r d2a6acdbd665 Doxyfile --- a/Doxyfile Sun Sep 09 21:14:29 2007 +0000 +++ b/Doxyfile Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 Makefile.src.in --- a/Makefile.src.in Sun Sep 09 21:14:29 2007 +0000 +++ b/Makefile.src.in Sun Sep 23 07:37:38 2007 +0000 @@ -249,15 +249,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 +275,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 +287,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]' diff -r e782b59f1f6a -r d2a6acdbd665 changelog.txt --- a/changelog.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/changelog.txt Sun Sep 23 07:37:38 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) diff -r e782b59f1f6a -r d2a6acdbd665 config.lib --- a/config.lib Sun Sep 09 21:14:29 2007 +0000 +++ b/config.lib Sun Sep 23 07:37:38 2007 +0000 @@ -745,7 +745,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 diff -r e782b59f1f6a -r d2a6acdbd665 docs/openttd.6 --- a/docs/openttd.6 Sun Sep 09 21:14:29 2007 +0000 +++ b/docs/openttd.6 Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 known-bugs.txt --- a/known-bugs.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/known-bugs.txt Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 os/debian/changelog --- a/os/debian/changelog Sun Sep 09 21:14:29 2007 +0000 +++ b/os/debian/changelog Sun Sep 23 07:37:38 2007 +0000 @@ -4,6 +4,24 @@ -- Matthijs Kooijman Mon, 26 Feb 2007 21:07:05 +0100 +openttd (0.5.3-1) unstable; urgency=low + + * New upstream release. + + -- Matthijs Kooijman Sat, 15 Sep 2007 13:30:00 +0100 + +openttd (0.5.3~rc3-1) unstable; urgency=low + + * New upstream release. + + -- Matthijs Kooijman Thu, 30 Aug 2007 23:30:00 +0100 + +openttd (0.5.3~rc2-1) unstable; urgency=low + + * New upstream release. + + -- Matthijs Kooijman Sat, 7 Jul 2007 20:05:00 +0100 + openttd (0.5.3~rc1-1) unstable; urgency=low * New upstream release. diff -r e782b59f1f6a -r d2a6acdbd665 os/win32/installer/install.nsi --- a/os/win32/installer/install.nsi Sun Sep 09 21:14:29 2007 +0000 +++ b/os/win32/installer/install.nsi Sun Sep 23 07:37:38 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}" diff -r e782b59f1f6a -r d2a6acdbd665 projects/determineversion.vbs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/projects/determineversion.vbs Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 projects/openttd.vcproj --- a/projects/openttd.vcproj Sun Sep 09 21:14:29 2007 +0000 +++ b/projects/openttd.vcproj Sun Sep 23 07:37:38 2007 +0000 @@ -73,7 +73,9 @@ + Name="VCPreBuildEventTool" + Description="Determining version number" + CommandLine=""$(InputDir)/determineversion.vbs""/> + Name="VCPreBuildEventTool" + Description="Determining version number" + CommandLine=""$(InputDir)/determineversion.vbs""/> + + + + + + + + + + + + + Name="VCPreBuildEventTool" + Description="Determining version number" + CommandLine=""$(InputDir)/determineversion.vbs""/> + Name="VCPreBuildEventTool" + Description="Determining version number" + CommandLine=""$(InputDir)/determineversion.vbs""/> + + @@ -764,6 +776,10 @@ > + + @@ -984,6 +1000,10 @@ > + + @@ -1976,6 +1996,14 @@ > + + + + @@ -2124,6 +2152,10 @@ > + + diff -r e782b59f1f6a -r d2a6acdbd665 projects/openttd_vs80.vcproj.in --- a/projects/openttd_vs80.vcproj.in Sun Sep 09 21:14:29 2007 +0000 +++ b/projects/openttd_vs80.vcproj.in Sun Sep 23 07:37:38 2007 +0000 @@ -33,6 +33,8 @@ > current_order.flags, OFB_PART_OF_ORDERS); TOGGLEBIT(v->current_order.flags, OFB_HALT_IN_DEPOT); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); } diff -r e782b59f1f6a -r d2a6acdbd665 src/aircraft_gui.cpp --- a/src/aircraft_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/aircraft_gui.cpp Sun Sep 23 07:37:38 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); @@ -56,172 +100,3 @@ 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; -} diff -r e782b59f1f6a -r d2a6acdbd665 src/airport_gui.cpp --- a/src/airport_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/airport_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -34,7 +34,7 @@ static void PlaceAirport(TileIndex tile) { - DoCommandP(tile, _selected_airport_type, _ctrl_pressed, CcBuildAirport, CMD_BUILD_AIRPORT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE)); + DoCommandP(tile, _selected_airport_type, _ctrl_pressed, CcBuildAirport, CMD_BUILD_AIRPORT | CMD_NO_WATER | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE)); } static void PlaceAir_DemolishArea(TileIndex tile) diff -r e782b59f1f6a -r d2a6acdbd665 src/articulated_vehicles.cpp --- a/src/articulated_vehicles.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/articulated_vehicles.cpp Sun Sep 23 07:37:38 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; + 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; } @@ -35,14 +43,13 @@ if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_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); diff -r e782b59f1f6a -r d2a6acdbd665 src/articulated_vehicles.h --- a/src/articulated_vehicles.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/articulated_vehicles.h Sun Sep 23 07:37:38 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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/autoreplace_cmd.cpp --- a/src/autoreplace_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/autoreplace_cmd.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/autoslope.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/autoslope.h Sun Sep 23 07:37:38 2007 +0000 @@ -0,0 +1,42 @@ +/* $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. + * + * @return true iff autoslope is enabled. + */ +static inline bool AutoslopeEnabled() +{ + return (_patches.autoslope && IsValidPlayer(_current_player)); +} + +#endif /* AUTOSLOPE_H */ diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_anim.cpp --- a/src/blitter/32bpp_anim.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/blitter/32bpp_anim.cpp Sun Sep 23 07:37:38 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++; diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_anim.hpp --- a/src/blitter/32bpp_anim.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/blitter/32bpp_anim.hpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_base.hpp --- a/src/blitter/32bpp_base.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/blitter/32bpp_base.hpp Sun Sep 23 07:37:38 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); } /** diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_optimized.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/blitter/32bpp_optimized.cpp Sun Sep 23 07:37:38 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; +} diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_optimized.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/blitter/32bpp_optimized.hpp Sun Sep 23 07:37:38 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 { +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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/32bpp_simple.cpp --- a/src/blitter/32bpp_simple.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/blitter/32bpp_simple.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/blitter/factory.hpp --- a/src/blitter/factory.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/blitter/factory.hpp Sun Sep 23 07:37:38 2007 +0000 @@ -4,6 +4,8 @@ #define BLITTER_FACTORY_HPP #include "base.hpp" +#include "../string.h" +#include "../debug.h" #include #include @@ -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; } } diff -r e782b59f1f6a -r d2a6acdbd665 src/bridge_gui.cpp --- a/src/bridge_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/bridge_gui.cpp Sun Sep 23 07:37:38 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) diff -r e782b59f1f6a -r d2a6acdbd665 src/build_vehicle_gui.cpp --- a/src/build_vehicle_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/build_vehicle_gui.cpp Sun Sep 23 07:37:38 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/clear_cmd.cpp --- a/src/clear_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/clear_cmd.cpp Sun Sep 23 07:37:38 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) { diff -r e782b59f1f6a -r d2a6acdbd665 src/command.cpp --- a/src/command.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/command.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/command.h --- a/src/command.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/command.h Sun Sep 23 07:37:38 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 @@ -168,50 +183,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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/depot_gui.cpp --- a/src/depot_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/depot_gui.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/dock_gui.cpp --- a/src/dock_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/dock_gui.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/economy.cpp --- a/src/economy.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/economy.cpp Sun Sep 23 07:37:38 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; } @@ -1692,8 +1689,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) { diff -r e782b59f1f6a -r d2a6acdbd665 src/elrail.cpp --- a/src/elrail.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/elrail.cpp Sun Sep 23 07:37:38 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, diff -r e782b59f1f6a -r d2a6acdbd665 src/fileio.cpp --- a/src/fileio.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/fileio.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -16,8 +16,8 @@ #else #include #include +#endif #include -#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 @@ -292,11 +303,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 +331,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 +407,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(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 +656,8 @@ #else _searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL; #endif + + ScanForTarFiles(); } #endif /* defined(WIN32) || defined(WINCE) */ diff -r e782b59f1f6a -r d2a6acdbd665 src/fileio.h --- a/src/fileio.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/fileio.h Sun Sep 23 07:37:38 2007 +0000 @@ -6,9 +6,11 @@ #define FILEIO_H #include "helpers.hpp" +#include +#include 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 TarList; +typedef std::map 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/functions.h --- a/src/functions.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/functions.h Sun Sep 23 07:37:38 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); @@ -124,6 +135,12 @@ 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/gfx.cpp --- a/src/gfx.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/gfx.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -48,6 +48,14 @@ 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]; @@ -269,7 +277,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 +293,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; @@ -919,6 +929,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 +1018,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 +1070,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); diff -r e782b59f1f6a -r d2a6acdbd665 src/gfx.h --- a/src/gfx.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/gfx.h Sun Sep 23 07:37:38 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 { @@ -247,8 +274,26 @@ 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(); diff -r e782b59f1f6a -r d2a6acdbd665 src/gfxinit.cpp --- a/src/gfxinit.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/gfxinit.cpp Sun Sep 23 07:37:38 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++); diff -r e782b59f1f6a -r d2a6acdbd665 src/graph_gui.cpp --- a/src/graph_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/graph_gui.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/group_cmd.cpp --- a/src/group_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/group_cmd.cpp Sun Sep 23 07:37:38 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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/group_gui.cpp --- a/src/group_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/group_gui.cpp Sun Sep 23 07:37:38 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)) { diff -r e782b59f1f6a -r d2a6acdbd665 src/industry.h --- a/src/industry.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/industry.h Sun Sep 23 07:37:38 2007 +0000 @@ -7,6 +7,7 @@ #include "oldpool.h" #include "helpers.hpp" +#include "newgrf_storage.h" typedef byte IndustryGfx; typedef uint8 IndustryType; @@ -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,6 +99,8 @@ * Defines the internal data of a functionnal industry */ struct Industry : PoolItem { + typedef PersistentStorageArray PersistentStorage; + TileIndex xy; ///< coordinates of the primary tile the industry is built one byte width; byte height; @@ -120,6 +128,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(); diff -r e782b59f1f6a -r d2a6acdbd665 src/industry_cmd.cpp --- a/src/industry_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/industry_cmd.cpp Sun Sep 23 07:37:38 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); @@ -299,8 +301,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)); @@ -1196,7 +1198,8 @@ 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)) { @@ -1692,76 +1695,6 @@ } } -/** 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; @@ -1786,14 +1719,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 +1780,158 @@ 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; + 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 != _patches.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 (_patches.smooth_economy) { + closeit = true; + for (byte 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) && !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(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 + ); + } + } + } 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, _patches.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 +1943,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,6 +1994,30 @@ static CommandCost TerraformTile_Industry(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new) { + 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); // funny magic bulldozer } @@ -2020,12 +2065,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), diff -r e782b59f1f6a -r d2a6acdbd665 src/industry_gui.cpp --- a/src/industry_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/industry_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -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(); } } } diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/american.txt --- a/src/lang/american.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/american.txt Sun Sep 23 07:37:38 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 @@ -3339,7 +3362,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/brazilian_portuguese.txt --- a/src/lang/brazilian_portuguese.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/brazilian_portuguese.txt Sun Sep 23 07:37:38 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,11 @@ 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 +2697,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 +2810,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 +2874,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 +2964,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/bulgarian.txt --- a/src/lang/bulgarian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/bulgarian.txt Sun Sep 23 07:37:38 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}Железопътната гара трÑбва да бъде премахната първо @@ -2759,6 +2775,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/catalan.txt --- a/src/lang/catalan.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/catalan.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/croatian.txt --- a/src/lang/croatian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/croatian.txt Sun Sep 23 07:37:38 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 :{ORANGE}{STRING} -STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Funkcija kotaÄića: {ORANGE}{STRING} +STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Preferiraj ekipni razgovor s :{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,11 @@ 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 +2031,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 +2054,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 +2131,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 +2177,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 +2194,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 +2216,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 +2227,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 +2247,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 +2269,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 +2293,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 +2335,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 +2347,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 +2539,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 +2604,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 +2625,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 +2643,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 +2657,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 +2690,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 +2755,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 +2883,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 +2951,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 +2991,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 +3034,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 +3045,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 +3072,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 +3114,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 +3160,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 +3175,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 +3208,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 +3281,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 +3317,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 +3332,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 +3344,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 +3382,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/czech.txt --- a/src/lang/czech.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/czech.txt Sun Sep 23 07:37:38 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} @@ -3240,7 +3253,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/danish.txt --- a/src/lang/danish.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/danish.txt Sun Sep 23 07:37:38 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 @@ -3339,7 +3362,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/dutch.txt --- a/src/lang/dutch.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/dutch.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/english.txt --- a/src/lang/english.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/english.txt Sun Sep 23 07:37:38 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} @@ -1111,7 +1112,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/estonian.txt --- a/src/lang/estonian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/estonian.txt Sun Sep 23 07:37:38 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 @@ -2162,7 +2175,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 +2353,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 +2701,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 +2718,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 +2821,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 +2836,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 +2863,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 +3235,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 +3321,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: diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/finnish.txt --- a/src/lang/finnish.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/finnish.txt Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/french.txt --- a/src/lang/french.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/french.txt Sun Sep 23 07:37:38 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} @@ -2790,7 +2803,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 +2879,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 +2947,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... diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/german.txt --- a/src/lang/german.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/german.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/hungarian.txt --- a/src/lang/hungarian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/hungarian.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/italian.txt --- a/src/lang/italian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/italian.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/japanese.txt --- a/src/lang/japanese.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/japanese.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/korean.txt --- a/src/lang/korean.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/korean.txt Sun Sep 23 07:37:38 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ë°°ì˜ ì¶”ê°€ ë³´ì¡°ê¸ˆì„ ë‚´ë…„ê¹Œì§€ 받게 ë©ë‹ˆë‹¤! @@ -2060,7 +2076,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 +2810,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 +3294,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 +3356,6 @@ STR_GROUP_RENAME_TIP :{BLACK}ì„ íƒí•œ 그룹 ì´ë¦„ 바꾸기 STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}ì „ì²´ ìžë™ êµì²´ë¡œë¶€í„° ì´ ê·¸ë£¹ 보호 - STR_COMPANY_NAME :{COMPANY} STR_ENGINE_NAME :{ENGINE} STR_GROUP_NAME :{GROUP} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/norwegian_nynorsk.txt --- a/src/lang/norwegian_nynorsk.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/norwegian_nynorsk.txt Sun Sep 23 07:37:38 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 @@ -3340,7 +3362,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/piglatin.txt --- a/src/lang/piglatin.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/piglatin.txt Sun Sep 23 07:37:38 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 @@ -3339,7 +3361,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/romanian.txt --- a/src/lang/romanian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/romanian.txt Sun Sep 23 07:37:38 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 @@ -3339,7 +3362,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/russian.txt --- a/src/lang/russian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/russian.txt Sun Sep 23 07:37:38 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}Сначала удалите ЖД Ñтанцию diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/slovak.txt --- a/src/lang/slovak.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/slovak.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/slovenian.txt --- a/src/lang/slovenian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/slovenian.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/spanish.txt --- a/src/lang/spanish.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/spanish.txt Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/swedish.txt --- a/src/lang/swedish.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/swedish.txt Sun Sep 23 07:37:38 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 @@ -3311,6 +3333,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 +3361,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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/traditional_chinese.txt --- a/src/lang/traditional_chinese.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/traditional_chinese.txt Sun Sep 23 07:37:38 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}必須先移除ç«è»Šç«™ @@ -3339,7 +3362,6 @@ STR_GROUP_RENAME_TIP :{BLACK}ç‚ºç¾¤çµ„é‡æ–°å‘½å STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}點此å¯é¿å…æ­¤ç¾¤çµ„å…§çš„è¨­å‚™è¢«ä¾†è‡ªå…¨åŸŸçš„è¨­å®šæ›¿æ› - STR_COMPANY_NAME :{COMPANY} STR_ENGINE_NAME :{ENGINE} STR_GROUP_NAME :{GROUP} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/turkish.txt --- a/src/lang/turkish.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/turkish.txt Sun Sep 23 07:37:38 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) @@ -2704,7 +2744,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 +2796,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 +3324,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 +3352,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 +3366,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/ukrainian.txt --- a/src/lang/ukrainian.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/ukrainian.txt Sun Sep 23 07:37:38 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} diff -r e782b59f1f6a -r d2a6acdbd665 src/lang/unfinished/afrikaans.txt --- a/src/lang/unfinished/afrikaans.txt Sun Sep 09 21:14:29 2007 +0000 +++ b/src/lang/unfinished/afrikaans.txt Sun Sep 23 07:37:38 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 : {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,11 @@ 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_5009_LEVEL_LAND_OR_WATER_REQUIRED :{WHITE}Platte land of water benooding 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 +1846,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 +1886,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 +2002,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 +2066,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 +2076,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 +2088,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 +2317,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 +2410,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 +2442,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 +2466,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 +2486,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 +2501,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 +2524,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 +2570,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 +2578,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 +2659,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 +2731,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 +2746,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 +2833,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 +2911,20 @@ ############ Date formatting ######## + + + + +##### Mass Order + + + + +STR_COMPANY_NAME :{COMPANY} + + +#### Improved sign GUI + +######## + +STR_BUILD_NEW_INDUSTRY :{BLACK}Bou diff -r e782b59f1f6a -r d2a6acdbd665 src/main_gui.cpp --- a/src/main_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/main_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -1086,7 +1086,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 +1113,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) } diff -r e782b59f1f6a -r d2a6acdbd665 src/map.cpp --- a/src/map.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/map.cpp Sun Sep 23 07:37:38 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, diff -r e782b59f1f6a -r d2a6acdbd665 src/map.h --- a/src/map.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/map.h Sun Sep 23 07:37:38 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,24 @@ return ToTileIndexDiff(_tileoffs_by_dir[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! diff -r e782b59f1f6a -r d2a6acdbd665 src/misc_gui.cpp --- a/src/misc_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/misc_gui.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/network/network.cpp --- a/src/network/network.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/network/network.cpp Sun Sep 23 07:37:38 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) diff -r e782b59f1f6a -r d2a6acdbd665 src/network/network.h --- a/src/network/network.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/network/network.h Sun Sep 23 07:37:38 2007 +0000 @@ -3,8 +3,6 @@ #ifndef NETWORK_H #define NETWORK_H -#define NOREV_STRING "norev000" - #ifdef ENABLE_NETWORK #include "../player.h" diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf.cpp --- a/src/newgrf.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -244,7 +244,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). @@ -253,17 +253,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; } @@ -4506,9 +4515,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; diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_callbacks.h --- a/src/newgrf_callbacks.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_callbacks.h Sun Sep 23 07:37:38 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__ + * + * @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. */ @@ -100,7 +103,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 +141,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,7 +163,7 @@ 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, diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_canal.cpp --- a/src/newgrf_canal.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_canal.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -42,7 +42,7 @@ switch (variable) { case 0x80: - return TileHeight(tile); + return GetTileZ(tile) / TILE_HEIGHT; case 0x81: return GetTerrainType(tile); diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_commons.cpp --- a/src/newgrf_commons.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_commons.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -252,7 +252,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; } } diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_config.cpp --- a/src/newgrf_config.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_config.cpp Sun Sep 23 07:37:38 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; } @@ -270,12 +271,54 @@ return res; } +static bool ScanPathAddGrf(const char *filename) +{ + GRFConfig *c = CallocT(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; @@ -304,40 +347,7 @@ if (ext == NULL) continue; if (strcasecmp(ext, ".grf") != 0) continue; - GRFConfig *c = CallocT(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++; } } @@ -346,12 +356,27 @@ 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; +} /* Scan for all NewGRFs */ void ScanNewGRFFiles() { Searchpath sp; char path[MAX_PATH]; + TarFileList::iterator tar; uint num = 0; ClearGRFConfigList(&_all_grfs); @@ -361,6 +386,9 @@ 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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_engine.cpp --- a/src/newgrf_engine.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_engine.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -509,8 +509,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; @@ -550,7 +548,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]++; } @@ -799,15 +797,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; @@ -832,7 +825,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; @@ -1033,7 +1026,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: diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_house.cpp --- a/src/newgrf_house.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_house.cpp Sun Sep 23 07:37:38 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; } /** diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_industries.cpp --- a/src/newgrf_industries.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_industries.cpp Sun Sep 23 07:37:38 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,7 +73,7 @@ } } - return best_dist; + return min(best_dist, water ? 0x7F : 0x1FF); } /** Make an analysis of a tile and check for its belonging to the same @@ -242,6 +243,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); @@ -322,6 +326,7 @@ 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; @@ -457,13 +462,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); diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_industrytiles.cpp --- a/src/newgrf_industrytiles.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_industrytiles.cpp Sun Sep 23 07:37:38 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. @@ -138,6 +140,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; diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_spritegroup.cpp --- a/src/newgrf_spritegroup.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_spritegroup.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -76,7 +76,7 @@ _spritegroup_count = 0; } -uint32 _temp_store[0x110]; +TemporaryStorageArray _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 -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(adjust, last_value, value); break; - case DSG_SIZE_WORD: value = EvalAdjustT(adjust, last_value, value); break; - case DSG_SIZE_DWORD: value = EvalAdjustT(adjust, last_value, value); break; + case DSG_SIZE_BYTE: value = EvalAdjustT (adjust, object, last_value, value); break; + case DSG_SIZE_WORD: value = EvalAdjustT(adjust, object, last_value, value); break; + case DSG_SIZE_DWORD: value = EvalAdjustT(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_BUILDING_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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_spritegroup.h --- a/src/newgrf_spritegroup.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_spritegroup.h Sun Sep 23 07:37:38 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 _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; diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_storage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/newgrf_storage.cpp Sun Sep 23 07:37:38 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 + +/** The changed storage arrays */ +static std::set _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::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(); +} diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_storage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/newgrf_storage.h Sun Sep 23 07:37:38 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 +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(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 +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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_text.cpp --- a/src/newgrf_text.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_text.cpp Sun Sep 23 07:37:38 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 _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; + } +} diff -r e782b59f1f6a -r d2a6acdbd665 src/newgrf_text.h --- a/src/newgrf_text.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/newgrf_text.h Sun Sep 23 07:37:38 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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/news.h --- a/src/news.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/news.h Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 src/news_gui.cpp --- a/src/news_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/news_gui.cpp Sun Sep 23 07:37:38 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. diff -r e782b59f1f6a -r d2a6acdbd665 src/oldloader.cpp --- a/src/oldloader.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/oldloader.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -1028,7 +1028,7 @@ OCL_END() }; -static bool LoadOldVehicle(LoadgameState *ls, int num) +bool LoadOldVehicle(LoadgameState *ls, int num) { uint i; @@ -1059,7 +1059,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); diff -r e782b59f1f6a -r d2a6acdbd665 src/openttd.cpp --- a/src/openttd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/openttd.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -62,6 +62,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 */ @@ -482,7 +481,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 (!StrEmpty(ai)) AI_ForceAI(ai); if (resolution[0] != 0) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; } if (startyear != INVALID_YEAR) _patches_newgame.starting_year = startyear; @@ -528,9 +527,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..."); @@ -986,6 +987,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; diff -r e782b59f1f6a -r d2a6acdbd665 src/order_gui.cpp --- a/src/order_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/order_gui.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/ottdres.rc --- a/src/ottdres.rc Sun Sep 09 21:14:29 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 -///////////////////////////////////////////////////////////////////////////// diff -r e782b59f1f6a -r d2a6acdbd665 src/ottdres.rc.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ottdres.rc.in Sun Sep 23 07:37:38 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 +///////////////////////////////////////////////////////////////////////////// diff -r e782b59f1f6a -r d2a6acdbd665 src/player_gui.cpp --- a/src/player_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/player_gui.cpp Sun Sep 23 07:37:38 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/rail.h --- a/src/rail.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/rail.h Sun Sep 23 07:37:38 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/rail_cmd.cpp --- a/src/rail_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/rail_cmd.cpp Sun Sep 23 07:37:38 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; @@ -1023,6 +1028,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 @@ -1035,15 +1052,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); @@ -1056,18 +1064,12 @@ } if (IsTileDepotType(tile, TRANSPORT_RAIL)) { - Vehicle *v; - /* Update build vehicle window related to this depot */ 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); @@ -1110,7 +1112,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; @@ -1120,7 +1123,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) { @@ -1129,7 +1147,7 @@ _additional_cash_required = ret.GetCost(); return cost; } - proc(tile, (RailType)p2, true); + proc(tile, totype, true); } cost.AddCost(ret); } @@ -1243,7 +1261,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; @@ -2174,15 +2192,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) { @@ -2190,7 +2255,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); @@ -2206,28 +2271,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(); } @@ -2237,6 +2302,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/rail_gui.cpp --- a/src/rail_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/rail_gui.cpp Sun Sep 23 07:37:38 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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/rev.cpp.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rev.cpp.in Sun Sep 23 07:37:38 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 diff -r e782b59f1f6a -r d2a6acdbd665 src/road.h --- a/src/road.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/road.h Sun Sep 23 07:37:38 2007 +0000 @@ -126,7 +126,7 @@ */ static inline RoadBits DiagDirToRoadBits(DiagDirection d) { - return (RoadBits)(1U << (3 ^ d)); + return (RoadBits)(ROAD_NW << (3 ^ d)); } /** diff -r e782b59f1f6a -r d2a6acdbd665 src/road_cmd.cpp --- a/src/road_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/road_cmd.cpp Sun Sep 23 07:37:38 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 @@ -403,12 +411,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 +547,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); @@ -912,8 +911,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)); } /** @@ -1374,6 +1373,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/road_gui.cpp --- a/src/road_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/road_gui.cpp Sun Sep 23 07:37:38 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; } } diff -r e782b59f1f6a -r d2a6acdbd665 src/roadveh.h --- a/src/roadveh.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/roadveh.h Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/roadveh_cmd.cpp --- a/src/roadveh_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/roadveh_cmd.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -180,11 +180,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); @@ -478,6 +478,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/roadveh_gui.cpp --- a/src/roadveh_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/roadveh_gui.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/saveload.cpp --- a/src/saveload.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/saveload.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -29,7 +29,7 @@ #include "strings.h" #include -extern const uint16 SAVEGAME_VERSION = 74; +extern const uint16 SAVEGAME_VERSION = 76; uint16 _sl_version; ///< the major savegame version identifier byte _sl_minor_version; ///< the minor savegame version, DO NOT USE! diff -r e782b59f1f6a -r d2a6acdbd665 src/saveload.h --- a/src/saveload.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/saveload.h Sun Sep 23 07:37:38 2007 +0000 @@ -212,15 +212,16 @@ #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, param1, param2) {false, cmd, type, 0, param1, param2, (void*)(offset)} -#define SLE_CONDVARX(offset, type, from, to) SLE_GENERALX(SL_VAR, offset, type, from, to) -#define SLE_CONDREFX(offset, type, from, to) SLE_GENERALX(SL_REF, offset, type, from, to) +#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_VARX(offset, type) SLE_CONDVARX(offset, type, 0, SL_MAX_VERSION) #define SLE_REFX(offset, type) SLE_CONDREFX(offset, type, 0, SL_MAX_VERSION) -#define SLE_WRITEBYTEX(offset, something) SLE_GENERALX(SL_WRITEBYTE, offset, 0, something, 0) -#define SLE_VEH_INCLUDEX() SLE_GENERALX(SL_VEH_INCLUDE, 0, 0, 0, SL_MAX_VERSION) +#define SLE_WRITEBYTEX(offset, something) SLE_GENERALX(SL_WRITEBYTE, offset, 0, 0, something, 0) +#define SLE_VEH_INCLUDEX() SLE_GENERALX(SL_VEH_INCLUDE, 0, 0, 0, 0, SL_MAX_VERSION) /* End marker */ #define SLE_END() {false, SL_END, 0, 0, 0, 0, NULL} diff -r e782b59f1f6a -r d2a6acdbd665 src/settings.cpp --- a/src/settings.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/settings.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -1239,6 +1239,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), @@ -1347,14 +1348,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), diff -r e782b59f1f6a -r d2a6acdbd665 src/settings_gui.cpp --- a/src/settings_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/settings_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -664,6 +664,7 @@ static const char *_patches_construction[] = { "build_on_slopes", + "autoslope", "extra_dynamite", "longbridges", "signal_side", diff -r e782b59f1f6a -r d2a6acdbd665 src/ship_cmd.cpp --- a/src/ship_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/ship_cmd.cpp Sun Sep 23 07:37:38 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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/ship_gui.cpp --- a/src/ship_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/ship_gui.cpp Sun Sep 23 07:37:38 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; @@ -186,3 +39,35 @@ } 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); +} diff -r e782b59f1f6a -r d2a6acdbd665 src/signs.cpp --- a/src/signs.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/signs.cpp Sun Sep 23 07:37:38 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) { diff -r e782b59f1f6a -r d2a6acdbd665 src/slope.h --- a/src/slope.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/slope.h Sun Sep 23 07:37:38 2007 +0000 @@ -90,6 +90,19 @@ } } +/** + * 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; +} + /** * Enumeration for Foundations. diff -r e782b59f1f6a -r d2a6acdbd665 src/sound.cpp --- a/src/sound.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/sound.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -30,6 +30,7 @@ uint i; FioOpenFile(SOUND_SLOT, filename); + uint pos = FioGetPos(); count = FioReadDword() / 8; FileEntry *fe = CallocT(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(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++) diff -r e782b59f1f6a -r d2a6acdbd665 src/sound.h --- a/src/sound.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/sound.h Sun Sep 23 07:37:38 2007 +0000 @@ -21,6 +21,7 @@ VARDEF MusicFileSettings msf; struct FileEntry { + uint8 file_slot; uint32 file_offset; uint32 file_size; uint16 rate; diff -r e782b59f1f6a -r d2a6acdbd665 src/sprite.h --- a/src/sprite.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/sprite.h Sun Sep 23 07:37:38 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.*/ }; diff -r e782b59f1f6a -r d2a6acdbd665 src/spritecache.cpp --- a/src/spritecache.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spritecache.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/spriteloader/grf.cpp --- a/src/spriteloader/grf.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spriteloader/grf.cpp Sun Sep 23 07:37:38 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(); diff -r e782b59f1f6a -r d2a6acdbd665 src/spriteloader/grf.hpp --- a/src/spriteloader/grf.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spriteloader/grf.hpp Sun Sep 23 07:37:38 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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/spriteloader/png.cpp --- a/src/spriteloader/png.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spriteloader/png.cpp Sun Sep 23 07:37:38 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; diff -r e782b59f1f6a -r d2a6acdbd665 src/spriteloader/png.hpp --- a/src/spriteloader/png.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spriteloader/png.hpp Sun Sep 23 07:37:38 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 */ diff -r e782b59f1f6a -r d2a6acdbd665 src/spriteloader/spriteloader.hpp --- a/src/spriteloader/spriteloader.hpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/spriteloader/spriteloader.hpp Sun Sep 23 07:37:38 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() { } }; diff -r e782b59f1f6a -r d2a6acdbd665 src/station.h --- a/src/station.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/station.h Sun Sep 23 07:37:38 2007 +0000 @@ -173,7 +173,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; diff -r e782b59f1f6a -r d2a6acdbd665 src/station_cmd.cpp --- a/src/station_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/station_cmd.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -42,6 +42,7 @@ #include "road.h" #include "cargotype.h" #include "strings.h" +#include "autoslope.h" DEFINE_OLD_POOL_GENERIC(Station, Station) DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop) @@ -375,7 +376,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(); @@ -1227,22 +1235,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); @@ -2881,6 +2881,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/strings.cpp --- a/src/strings.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/strings.cpp Sun Sep 23 07:37:38 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) { diff -r e782b59f1f6a -r d2a6acdbd665 src/table/control_codes.h --- a/src/table/control_codes.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/table/control_codes.h Sun Sep 23 07:37:38 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, diff -r e782b59f1f6a -r d2a6acdbd665 src/table/elrail_data.h --- a/src/table/elrail_data.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/table/elrail_data.h Sun Sep 23 07:37:38 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 }; diff -r e782b59f1f6a -r d2a6acdbd665 src/table/industry_land.h --- a/src/table/industry_land.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/table/industry_land.h Sun Sep 23 07:37:38 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] = { diff -r e782b59f1f6a -r d2a6acdbd665 src/table/sprites.h --- a/src/table/sprites.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/table/sprites.h Sun Sep 23 07:37:38 2007 +0000 @@ -176,8 +176,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/table/town_land.h --- a/src/table/town_land.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/table/town_land.h Sun Sep 23 07:37:38 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[] = { diff -r e782b59f1f6a -r d2a6acdbd665 src/terraform_gui.cpp --- a/src/terraform_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/terraform_gui.cpp Sun Sep 23 07:37:38 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) ); } diff -r e782b59f1f6a -r d2a6acdbd665 src/texteff.cpp --- a/src/texteff.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/texteff.cpp Sun Sep 23 07:37:38 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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/town_cmd.cpp --- a/src/town_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/town_cmd.cpp Sun Sep 23 07:37:38 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) @@ -122,6 +123,28 @@ } /** + * Return a random direction + * + * @return a random direction + */ +static inline DiagDirection RandomDiagDir() +{ + return (DiagDirection)(3 & Random()); +} + +/** + * Move a TileIndex into a diagonal direction. + * + * @param tile The current tile + * @param dir The direction in which we want to step + * @return the moved tile + */ +static inline TileIndex AddDiagDirToTileIndex(TileIndex tile, DiagDirection dir) +{ + return TILE_ADD(tile, TileOffsByDiagDir(dir)); +} + +/** * House Tile drawing handler. * Part of the tile loop process * @param ti TileInfo of the tile to draw @@ -160,8 +183,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 +279,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) { @@ -563,29 +590,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 +627,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 +657,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 +706,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,76 +790,66 @@ * * @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; + 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 + * Check there are enough neighbor house tiles next to the current tile * * @param tile current tile * @return true if there are more than 2 house tiles next @@ -840,8 +865,8 @@ } /* 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)) { + for (DiagDirection i = DIAGDIR_BEGIN; i < DIAGDIR_END; i++) { + if (IsTileType(AddDiagDirToTileIndex(tile, i), MP_HOUSE)) { counter++; } @@ -866,25 +891,20 @@ * @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 tmptile; ///< Dummy tile for various things + 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; @@ -901,37 +921,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(AddDiagDirToTileIndex(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(AddDiagDirToTileIndex(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90RIGHT)), MP_HOUSE) && + !IsTileType(AddDiagDirToTileIndex(tile, ChangeDiagDir(target_dir, DIAGDIRDIFF_90LEFT)), MP_HOUSE)) { return; } @@ -939,13 +951,14 @@ * 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 < (DiagDirection)5 && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) { /* Continue building on a partial road. - * Always OK. */ + * Should be allways OK, so we only generate + * the fitting RoadBits */ _grow_town_result = 0; switch (_patches.town_layout) { @@ -956,18 +969,17 @@ 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 + TileIndex tmptile2; ///< Yet another dummy tile /* Reached a tunnel/bridge? Then continue at the other side of it. */ if (IsTileType(tile, MP_TUNNELBRIDGE)) { @@ -981,13 +993,13 @@ /* 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. */ + tmptile = AddDiagDirToTileIndex(tile, target_dir); + + /* Don't walk into water. */ if (IsClearWaterTile(tmptile)) return; switch (_patches.town_layout) { @@ -999,19 +1011,19 @@ case TL_3X3_GRID: /* Use 2x2 grid afterwards! */ /* Fill gap if house has enougth neighbors */ - tmptile2 = TILE_ADD(tmptile, ToTileIndexDiff(_roadblock_tileadd[i])); + tmptile2 = AddDiagDirToTileIndex(tmptile, target_dir); if (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) { _grow_town_result = -1; } case TL_2X2_GRID: - rcmd = GetTownRoadGridElement(t1, tmptile); + rcmd = GetTownRoadGridElement(t1, tmptile, 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])); + tmptile2 = AddDiagDirToTileIndex(tmptile, target_dir); if (AreNeighborsHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) { _grow_town_result = -1; } @@ -1019,11 +1031,11 @@ 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(tmptile, 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)) { @@ -1040,19 +1052,19 @@ } _grow_town_result = 0; - rcmd = (RoadBits)(ROAD_NW << i); } /* Return if a water tile */ if (IsClearWaterTile(tile)) return; + 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: 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; + 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: build_road_and_exit: @@ -1063,38 +1075,33 @@ } /* 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 + if (!(rcmd & DiagDirToRoadBits(bridge_dir))) goto build_road_and_exit; + + /* We are in the right direction */ + uint32 bridge_length = 0; ///< This value stores the length of the possible bridge + tmptile = tile; ///< Now we use this dummy to store the other waterside do { - if (++j == 0) + if (bridge_length++ >= 11) { + /* Max 11 tile long bridges */ goto build_road_and_exit; - tmptile = TILE_MASK(tmptile + TileOffsByDiagDir(i)); + } + tmptile = TILE_MASK(tmptile + TileOffsByDiagDir(bridge_dir)); } 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 { + if (bridge_length == 1) goto build_road_and_exit; + + for (uint times = 0; times <= 22; times++) { 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 */ + _grow_town_result = -1; return; } - } while (--j != 0); + } + /* Quit if it selecting an appropiate bridge type fails a large number of times. */ } /** Returns "growth" if a house was built, or no if the build failed. @@ -1104,7 +1111,10 @@ */ static int GrowTownAtRoad(Town *t, TileIndex tile) { - int block = 5; // special case + /* Special case. + * @see GrowTownInTile Check the else if + */ + DiagDirection target_dir = (DiagDirection)5; ///< The direction in which we want to extend the town TILE_ASSERT(tile); @@ -1127,22 +1137,21 @@ } 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 = AddDiagDirToTileIndex(tile, target_dir); if (IsTileType(tile, MP_ROAD)) { /* Don't allow building over roads of other cities */ @@ -1162,25 +1171,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 +1214,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 +1936,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) && @@ -2303,6 +2316,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/train.h --- a/src/train.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/train.h Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/train_cmd.cpp --- a/src/train_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/train_cmd.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -96,6 +96,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); @@ -302,7 +305,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 */ @@ -512,12 +515,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); @@ -680,12 +683,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); @@ -799,7 +802,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; @@ -954,7 +957,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(); @@ -1026,10 +1029,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; } } @@ -1080,6 +1084,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)) { @@ -1222,7 +1227,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)) { @@ -1269,6 +1274,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; @@ -1278,8 +1284,6 @@ if (first->next_shared != NULL) { first->next_shared->prev_shared = new_f; new_f->next_shared = first->next_shared; - } else { - RemoveVehicleFromGroup(v); } /* @@ -1290,6 +1294,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); @@ -1374,7 +1379,6 @@ first = UnlinkWagon(v, first); DeleteDepotHighlightOfVehicle(v); delete v; - RemoveVehicleFromGroup(v); } } @@ -1889,6 +1893,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/train_gui.cpp --- a/src/train_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/train_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -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; -} diff -r e782b59f1f6a -r d2a6acdbd665 src/tree_cmd.cpp --- a/src/tree_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/tree_cmd.cpp Sun Sep 23 07:37:38 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; } } diff -r e782b59f1f6a -r d2a6acdbd665 src/tree_map.h --- a/src/tree_map.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/tree_map.h Sun Sep 23 07:37:38 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); diff -r e782b59f1f6a -r d2a6acdbd665 src/tunnelbridge_cmd.cpp --- a/src/tunnelbridge_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/tunnelbridge_cmd.cpp Sun Sep 23 07:37:38 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" @@ -530,17 +531,29 @@ /* 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. + /* + * A lot of things can be autosloped, but then there is still a structure with + * on top of a tunnel entrance which is bad. Therefor we disallow those. + * Furthermore half road bits (not tram bits) can always be removed, so we + * need to preserve that behaviour here too. */ - if (IsTileType(end_tile, MP_RAILWAY)) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK); + switch (GetTileType(end_tile)) { + default: 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); + /* Tiles that can be (safely) "auto" terraformed for tunnels */ + case MP_ROAD: + if (GetRoadTileType(end_tile) != ROAD_TILE_NORMAL || // Depots and crossings can't be removed + (GetRoadTypes(end_tile) & ROADTYPES_TRAMHWAY) != 0 || // Half tram bits must not be removed + COUNTBITS(GetRoadBits(end_tile, ROADTYPE_ROAD)) > 1) { // Non-half road bits must not be removed either + return_cmd_error(STR_5005_UNABLE_TO_EXCAVATE_LAND); + } + /* FALL THROUGH */ + case MP_CLEAR: + case MP_TREES: + 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); + break; + } } else { ret = DoCommand(end_tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); if (CmdFailed(ret)) return ret; @@ -748,68 +761,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; } @@ -846,11 +858,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); } } } @@ -877,14 +889,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]); } /** @@ -905,6 +926,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 { @@ -923,13 +965,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; @@ -964,6 +1020,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 */ @@ -983,8 +1042,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); } @@ -1030,6 +1091,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; @@ -1065,12 +1145,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++; @@ -1079,7 +1166,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); @@ -1088,12 +1179,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 */ @@ -1369,7 +1463,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; @@ -1416,6 +1510,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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/unmovable_cmd.cpp --- a/src/unmovable_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/unmovable_cmd.cpp Sun Sep 23 07:37:38 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); } diff -r e782b59f1f6a -r d2a6acdbd665 src/variables.h --- a/src/variables.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/variables.h Sun Sep 23 07:37:38 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 , 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 @@ -239,6 +239,8 @@ 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. }; VARDEF Patches _patches; @@ -312,7 +314,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]; diff -r e782b59f1f6a -r d2a6acdbd665 src/vehicle.cpp --- a/src/vehicle.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/vehicle.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/vehicle.h --- a/src/vehicle.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/vehicle.h Sun Sep 23 07:37:38 2007 +0000 @@ -218,9 +218,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 { VehicleTypeByte type; ///< Type of vehicle @@ -232,7 +235,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 @@ -380,6 +384,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() {} @@ -412,12 +421,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 diff -r e782b59f1f6a -r d2a6acdbd665 src/vehicle_gui.cpp --- a/src/vehicle_gui.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/vehicle_gui.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -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) { diff -r e782b59f1f6a -r d2a6acdbd665 src/video/win32_v.cpp --- a/src/video/win32_v.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/video/win32_v.cpp Sun Sep 23 07:37:38 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; } diff -r e782b59f1f6a -r d2a6acdbd665 src/viewport.cpp --- a/src/viewport.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/viewport.cpp Sun Sep 23 07:37:38 2007 +0000 @@ -81,25 +81,33 @@ }; 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 + + 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; @@ -479,23 +487,34 @@ AddChildSpriteScreen(image, pal, pt.x - vd->parent_list[-1]->left, pt.y - vd->parent_list[-1]->top); } -/** 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. + * + * @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) */ -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) { ViewportDrawer *vd = _cur_vd; ParentSpriteToDraw *ps; - const Sprite *spr; Point pt; + int32 right, bottom; assert((image & SPRITE_MASK) < MAX_SPRITES); @@ -530,11 +549,24 @@ } 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; + if (image == SPR_EMPTY_BOUNDING_BOX) { + 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; + 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; + } else { + const Sprite *spr = GetSprite(image & SPRITE_MASK); + ps->left = (pt.x += spr->x_offs); + right = (pt.x + spr->width ); + ps->top = (pt.y += spr->y_offs); + bottom = (pt.y + spr->height); + } + if (ps->left >= vd->dpi.left + vd->dpi.width || + right <= vd->dpi.left || + ps->top >= vd->dpi.top + vd->dpi.height || + bottom <= vd->dpi.top) { return; } @@ -542,16 +574,16 @@ 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->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; @@ -1130,23 +1162,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, @@ -1158,13 +1190,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; } } @@ -1189,10 +1221,9 @@ { 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); for (cs = ps->child; cs != NULL; cs = cs->next) { DrawSprite(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y); @@ -1440,6 +1471,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; @@ -1505,6 +1544,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; diff -r e782b59f1f6a -r d2a6acdbd665 src/viewport.h --- a/src/viewport.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/viewport.h Sun Sep 23 07:37:38 2007 +0000 @@ -44,11 +44,22 @@ 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 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); void *AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2); void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y); diff -r e782b59f1f6a -r d2a6acdbd665 src/water_cmd.cpp --- a/src/water_cmd.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/water_cmd.cpp Sun Sep 23 07:37:38 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)); diff -r e782b59f1f6a -r d2a6acdbd665 src/win32.cpp --- a/src/win32.cpp Sun Sep 09 21:14:29 2007 +0000 +++ b/src/win32.cpp Sun Sep 23 07:37:38 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(); } /** diff -r e782b59f1f6a -r d2a6acdbd665 src/window.h --- a/src/window.h Sun Sep 09 21:14:29 2007 +0000 +++ b/src/window.h Sun Sep 23 07:37:38 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);