diff --git a/Makefile.bundle.in b/Makefile.bundle.in index 4a643fee7d..17a17e36e8 100644 --- a/Makefile.bundle.in +++ b/Makefile.bundle.in @@ -174,6 +174,7 @@ install: bundle $(Q)install -d "$(INSTALL_BINARY_DIR)" $(Q)install -d "$(INSTALL_ICON_DIR)" $(Q)install -d "$(INSTALL_DATA_DIR)/ai" + $(Q)install -d "$(INSTALL_DATA_DIR)/game" $(Q)install -d "$(INSTALL_DATA_DIR)/baseset" $(Q)install -d "$(INSTALL_DATA_DIR)/lang" $(Q)install -d "$(INSTALL_DATA_DIR)/scripts" @@ -184,6 +185,7 @@ else endif $(Q)install -m 644 "$(BUNDLE_DIR)/lang/"* "$(INSTALL_DATA_DIR)/lang" $(Q)install -m 644 "$(BUNDLE_DIR)/ai/"* "$(INSTALL_DATA_DIR)/ai" + $(Q)install -m 644 "$(BUNDLE_DIR)/game/"* "$(INSTALL_DATA_DIR)/game" $(Q)install -m 644 "$(BUNDLE_DIR)/baseset/"* "$(INSTALL_DATA_DIR)/baseset" $(Q)install -m 644 "$(BUNDLE_DIR)/data/"* "$(INSTALL_DATA_DIR)/data" $(Q)install -m 644 "$(BUNDLE_DIR)/scripts/"* "$(INSTALL_DATA_DIR)/scripts" diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 45e12e60a3..fe1d2cc881 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3009,7 +3009,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :도시 이름 # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} 지역 당국 -STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}회사 운송 성취도: +STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}회사에 대한 이 도시의 평판: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}가능한 행동: STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}이 도시에 할 수 있는 일 목록 - 상세 정보를 보시려면 클릭하세요 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 99d88237f5..4b383df0d8 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -512,7 +512,7 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Monstrar STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Monstrare res fiscales societatis STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Monstrare facta generalia societatis STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Monstrare librum fabularum -STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Monstrare indicem metarum +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Monstrare indicem propositorum STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Monstrare formulas graphicas STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Monstrare album foederis societatum STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Industriam novam condere vel monstrare indicem industriarum @@ -526,11 +526,11 @@ STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Struere STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Struere vias STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Struere navalia STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Struere aeroportus -STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Monstrare terrae arcam ferramentorum qua potes terram augere/minuere, arbores serere, etc. +STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Monstrare terrae arcam instrumentorum qua potes terram augere/minuere, arbores serere, etc. STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Monstrare fenestram soni musicaeque STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Monstrare nuntium novissimum sive optiones nuntii STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Indicia terrae regionis, consola, emendatio scripti, imagines conspectus, de OpenTTD -STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Mutare inter arcas ferramentorum +STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Mutare inter arcas instrumentorum # Extra tooltips for the scenario editor toolbar STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO :{BLACK}Servare scaenarium, legere scaenarium, relinquere scriptorium scaenarii, exire @@ -1507,7 +1507,7 @@ STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Originalis STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melior STR_CONFIG_SETTING_ROAD_SIDE :Vehicula viaria: {STRING} STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Eligere latus viae gubernandi -STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Circuitus tabulae altitudinum: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotatio tabulae altitudinum: {STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sinistrorsus STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Dextrorsus STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :Altitudo scaenario plano data: {STRING} @@ -1518,8 +1518,8 @@ STR_CONFIG_SETTING_STATION_SPREAD :Spatium station STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Area maxima in qua partes stationum possunt esse sita. Cave, numeris spatii magnis, ludus lentus sit STR_CONFIG_SETTING_SERVICEATHELIPAD :Ministrare helicoptera automatice in helicopterariis: {STRING} STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Ministrare helicoptera post quemque appulsum, etsi non est tugurium portui -STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Connectere terrae arcam ferramentorum arcis ferriviariae/viariae/aquariae/aeriae ferramentorum: {STRING} -STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Cum arca ferramentorum constructionis aperitur, etiam plasmationis terrae arca ferramentorum aperitur +STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Connectere terrae arcam instrumentorum arcis ferriviariae/viariae/aquariae/aeriae instrumentorum: {STRING} +STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Cum arca instrumentorum constructionis aperitur, etiam plasmationis terrae arca instrumentorum aperitur STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :Color terrae in tabula adhibitus: {STRING} STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Color terrae in tabula geographica parva STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Viridis @@ -1756,8 +1756,8 @@ STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NONE :Nulla {RED}(rum STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_RAINFOREST :Modo in silvis plivualibus STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_ALL :Ubique -STR_CONFIG_SETTING_TOOLBAR_POS :Locus primariae arcae ferramentorum: {STRING} -STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Locus horizontalis arcae ferramentorum primariae apud apicem fenestrae +STR_CONFIG_SETTING_TOOLBAR_POS :Locus primariae arcae instrumentorum: {STRING} +STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Locus horizontalis arcae instrumentorum primariae apud apicem fenestrae STR_CONFIG_SETTING_STATUSBAR_POS :Locus serae status: {STRING} STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Locus horizontalis serae status apud infimam partem fenestrae STR_CONFIG_SETTING_SNAP_RADIUS :Radius fenestrae adhaerendae: {STRING} @@ -2951,7 +2951,7 @@ STR_MAPGEN_BORDER_RANDOM :{BLACK}Fortuiti STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Fortuiti STR_MAPGEN_BORDER_MANUAL :{BLACK}Manu -STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Circuitus tabulae altitudinum: +STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotatio tabulae altitudinum: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nomen tabulae altitudinum: STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Magnitudo: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} @@ -3236,16 +3236,16 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Emere m STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Largiri auctoritatem vicinalem ut tua censio augeatur, at difficultas adest: forsitan animadvertaris et graviter puniaris.{}Pretium: {CURRENCY_LONG} # Goal window -STR_GOALS_CAPTION :{WHITE}{COMPANY} Metae -STR_GOALS_SPECTATOR_CAPTION :{WHITE}Metae Globales -STR_GOALS_GLOBAL_TITLE :{BLACK}Metae globales: +STR_GOALS_CAPTION :{WHITE}{COMPANY} Proposita +STR_GOALS_SPECTATOR_CAPTION :{WHITE}Proposita Universalia +STR_GOALS_GLOBAL_TITLE :{BLACK}Proposita universalia: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Nullae - STR_GOALS_SPECTATOR_NONE :{ORANGE}- Non applicabiles - STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} -STR_GOALS_COMPANY_TITLE :{BLACK}Metae Societatis: -STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Preme in metam ut conspectus moveatur supra industriam/oppidum/tegulam. Ctrl+Preme ut nova fenestra conspectus aperiatur supra industriam/oppidum/tegulam +STR_GOALS_COMPANY_TITLE :{BLACK}Proposita Societatis: +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Preme in propositum ut conspectus moveatur supra industriam/oppidum/tegulam. Ctrl+Preme ut nova fenestra conspectus aperiatur supra industriam/oppidum/tegulam # Goal question window STR_GOAL_QUESTION_CAPTION_QUESTION :Quaestio @@ -3285,7 +3285,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Preme in # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Librum Fabularum -STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Librum Fabularum Globalis +STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Librum Fabularum Universale STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Pagina {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Salire ad quamdam paginam eligendo eam in hac indice @@ -3293,7 +3293,7 @@ STR_STORY_BOOK_PREV_PAGE :{BLACK}Priorem STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Ire ad paginam priorem STR_STORY_BOOK_NEXT_PAGE :{BLACK}Secundam STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Ire ad paginam secundam -STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Meta irrita +STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Propositum irritum # Station list window STR_STATION_LIST_TOOLTIP :{BLACK}Nomina stationum - preme in nomen ut conspectus moveatur supra stationem. Ctrl+Preme ut nova fenestra conspectus aperiatur supra stationem @@ -3555,7 +3555,7 @@ STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Greges - STR_GROUP_CREATE_TOOLTIP :{BLACK}Preme ut grex creatur STR_GROUP_DELETE_TOOLTIP :{BLACK}Delere gregem electam STR_GROUP_RENAME_TOOLTIP :{BLACK}Renominare gregem electam -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Preme ut vehicula huius gregis custodiantur contra autocommutationem globalem +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Preme ut vehicula huius gregis custodiantur contra autocommutationem universalem STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Gregem Delere STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Esne certus te velle delere hanc gregem eiusque descendentes? diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 259fd8ee68..d6a7d6bc39 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -205,16 +205,16 @@ STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}kg -STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}{NBSP}tonn{P "" er} -STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}tonn{P "" er} +STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}{NBSP}tonn +STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}tonn{P "" ""} STR_UNITS_WEIGHT_LONG_SI :{COMMA}{NBSP}kg STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}{NBSP}gal STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}{NBSP}l STR_UNITS_VOLUME_SHORT_SI :{COMMA} m³ -STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}{NBSP}gallon{P "" er} -STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}liter{P "" er} +STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}{NBSP}gallon +STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}liter STR_UNITS_VOLUME_LONG_SI :{COMMA}{NBSP}m³ STR_UNITS_FORCE_IMPERIAL :{COMMA}{NBSP}lbf @@ -1528,7 +1528,7 @@ STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Prosentandel av STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Andel av inntekten gitt til de mellomliggende etapper i et overføringssystem, noe som gir mer kontroll over inntektene STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Når du drar en linje, plasser signaler hver: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Angi distansen for når signaler vil bli bygget på et spor frem til neste hinder (signal, kryss), hvis signaler blir dratt -STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} kartelement{P 0 "" s} +STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} kartelement{P 0 "" er} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Når du drar en linje, oppretthold fast avstand mellom signaler: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Velg oppførselen til signalplassering ved Ctrl + dragning av signaler. Hvis deaktivert, blir signaler plassert ved tunneler eller broer for å unngå lange strekninger uten signaler. Hvis aktivert, blir signalene plassert for hver N ruter, noe som gjør justering av signaler på parallelle spor enklere STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Bygg vingesignal automatisk før: {STRING} @@ -1577,7 +1577,7 @@ STR_CONFIG_SETTING_STATUSBAR_POS :Statusbarens po STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT :Horisontal posisjon av status verktøylinjen på bunnen av skjermen STR_CONFIG_SETTING_SNAP_RADIUS :Vinduers smekkeradius: {STRING} STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :Avstanden mellom vinduer før vinduet som blir flyttet automatisk tilpasset nærliggende vinduer -STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} piksel{P 0 "" s} +STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} piks{P 0 el ler} STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :Deaktivert STR_CONFIG_SETTING_SOFT_LIMIT :Maksimalt antall flytende vinduer: {STRING} STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Antall ikke-klebrige åpne vinduer før gamle vinduer automatisk blir lukket for å gi plass til nye vinduer @@ -3908,8 +3908,8 @@ STR_TIMETABLE_STAY_FOR_ESTIMATED :(opphold i {STR STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(reise for {STRING}, ikke oppsatt med rutetabell) STR_TIMETABLE_STAY_FOR :og bli værende i {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :og reis i {STRING} -STR_TIMETABLE_DAYS :{COMMA}{NBSP}dag{P "" s} -STR_TIMETABLE_TICKS :{COMMA}{NBSP}tikk{P "" s} +STR_TIMETABLE_DAYS :{COMMA}{NBSP}dag{P "" er} +STR_TIMETABLE_TICKS :{COMMA}{NBSP}tikk STR_TIMETABLE_TOTAL_TIME :{BLACK}Det vil ta {STRING} å fullføre rutetabellen STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Det vil ta minst {STRING} å fullføre denne rutetabellen (rutetabell ikke fullstendig) diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 7ce4e7f6a8..3c892a8525 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -844,7 +844,7 @@ STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE}的调度计划中有无效调度命令 STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} 有重复调度命令 STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE}的调度计划有无效的车站 -STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} 的计划列表中有机场跑道太短不足及起降 +STR_NEWS_PLANE_USES_TOO_SHORT_RUNWAY :{WHITE}{VEHICLE} 的计划列表中有一个机场的跑道太短而不能起降 STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} 即将达到报废年限 STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} 已经达到报废年限 diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt index c0ab4c6e00..5fb8734bad 100644 --- a/src/lang/unfinished/frisian.txt +++ b/src/lang/unfinished/frisian.txt @@ -1563,6 +1563,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :langsaam STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :gewoan STR_CONFIG_SETTING_TOWN_GROWTH_FAST :snel STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Hiel snel +STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 in {COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Gjin STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Begjin stêdgrutte fermenigfuldiger: {STRING} @@ -1649,6 +1650,7 @@ STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Feroarje # Config errors STR_CONFIG_ERROR_ARRAY :{WHITE}... flater in reeks '{STRING}' STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... ûnjildige wearde '{STRING}' foar '{STRING}' +STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :koe net fûn wurde STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :Dat strykt net mei dizze ferzje fan OpenTTD STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :ûnbekind diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 9d3f3ec617..bc4c18db46 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -2875,6 +2875,10 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Corlun b STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Mynd i'r corlun cyffredin blaenorol, gan hepgor unrhyw gorluniau ailliwio/ffont/llidgorluniau, ac amlapio o'r corlun cyntaf i'r olaf STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Cynrychioliad o'r corlun a ddewiswyd. Fe anwybyddir yr aliniad wrth lunio'r corlun STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Symud y corlun, gan newid yr atredau X ac Y +STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Ailosod perthyniad +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Ailosod y dodiadau perthynol +STR_SPRITE_ALIGNER_OFFSETS_ABS :{BLACK}Dodiad X: {NUM}, Dodiad Y: {NUM} (Absoliwt) +STR_SPRITE_ALIGNER_OFFSETS_REL :{BLACK}Dodiad X: {NUM}, Dodiad Y: {NUM} (Perthynol) STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Dewis corlun STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Dewis corlun o ynrhyw fan ar y sgrïn diff --git a/src/network/network.cpp b/src/network/network.cpp index ca40b0d96d..2f9f8a210c 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -63,7 +63,6 @@ NetworkCompanyState *_network_company_states = NULL; ///< Statistics about some ClientID _network_own_client_id; ///< Our client identifier. ClientID _redirect_console_to_client; ///< If not invalid, redirect the console output to a client. bool _network_need_advertise; ///< Whether we need to advertise. -uint32 _network_last_advertise_frame; ///< Last time we did advertise. uint8 _network_reconnect; ///< Reconnect timeout StringList _network_bind_list; ///< The addresses to bind on. StringList _network_host_list; ///< The servers we know. @@ -762,7 +761,6 @@ bool NetworkServerStart() if (_network_dedicated) IConsoleCmdExec("exec scripts/on_dedicated.scr 0"); /* Try to register us to the master server */ - _network_last_advertise_frame = 0; _network_need_advertise = true; NetworkUDPAdvertise(); @@ -1079,7 +1077,6 @@ void NetworkStartUp() /* Network is available */ _network_available = NetworkCoreInitialize(); _network_dedicated = false; - _network_last_advertise_frame = 0; _network_need_advertise = true; _network_advertise_retries = 0; diff --git a/src/network/network_func.h b/src/network/network_func.h index 375cc3da56..4f1525b5a4 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -34,7 +34,6 @@ extern NetworkCompanyState *_network_company_states; extern ClientID _network_own_client_id; extern ClientID _redirect_console_to_client; extern bool _network_need_advertise; -extern uint32 _network_last_advertise_frame; extern uint8 _network_reconnect; extern StringList _network_bind_list; extern StringList _network_host_list; diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 731d51ca05..1cccbf6441 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -42,9 +42,9 @@ static ThreadMutex *_network_udp_mutex = ThreadMutex::New(); /** Session key to register ourselves to the master server */ static uint64 _session_key = 0; -static const uint ADVERTISE_NORMAL_INTERVAL = 30000; ///< interval between advertising in ticks (15 minutes) -static const uint ADVERTISE_RETRY_INTERVAL = 300; ///< re-advertise when no response after this many ticks (9 seconds) -static const uint ADVERTISE_RETRY_TIMES = 3; ///< give up re-advertising after this much failed retries +static const uint32 ADVERTISE_NORMAL_INTERVAL = 15 * 60 * 1000; ///< interval between advertising in ms (15 minutes) +static const uint32 ADVERTISE_RETRY_INTERVAL = 10 * 1000; ///< re-advertise when no response after this many ms (10 seconds) +static const uint32 ADVERTISE_RETRY_TIMES = 3; ///< give up re-advertising after this much failed retries NetworkUDPSocketHandler *_udp_client_socket = NULL; ///< udp client socket NetworkUDPSocketHandler *_udp_server_socket = NULL; ///< udp server socket @@ -616,25 +616,37 @@ static void NetworkUDPAdvertiseThread(void *pntr) */ void NetworkUDPAdvertise() { + static uint32 _last_advertisement = 0; ///< The time of the last advertisement (used to check for wrapping of time) + static uint32 _next_advertisement = 0; ///< The next time we should perform a normal advertisement. + static uint32 _next_retry = 0; ///< The next time we should perform a retry of an advertisement. + /* Check if we should send an advertise */ if (!_networking || !_network_server || !_network_udp_server || !_settings_client.network.server_advertise) return; - if (_network_need_advertise) { + if (_network_need_advertise || _realtime_tick < _last_advertisement) { + /* Forced advertisement, or a wrapping of time in which case we determine the advertisement/retry times again. */ _network_need_advertise = false; _network_advertise_retries = ADVERTISE_RETRY_TIMES; } else { /* Only send once every ADVERTISE_NORMAL_INTERVAL ticks */ if (_network_advertise_retries == 0) { - if ((_network_last_advertise_frame + ADVERTISE_NORMAL_INTERVAL) > _frame_counter) return; + if (_realtime_tick <= _next_advertisement) return; _network_advertise_retries = ADVERTISE_RETRY_TIMES; + } else { + /* An actual retry. */ + if (_realtime_tick <= _next_retry) return; } - - if ((_network_last_advertise_frame + ADVERTISE_RETRY_INTERVAL) > _frame_counter) return; } _network_advertise_retries--; - _network_last_advertise_frame = _frame_counter; + _last_advertisement = _realtime_tick; + _next_advertisement = _realtime_tick + ADVERTISE_NORMAL_INTERVAL; + _next_retry = _realtime_tick + ADVERTISE_RETRY_INTERVAL; + + /* Make sure we do not have an overflow when checking these; when time wraps, we simply force an advertisement. */ + if (_next_advertisement < _last_advertisement) _next_advertisement = UINT32_MAX; + if (_next_retry < _last_advertisement) _next_retry = UINT32_MAX; if (!ThreadObject::New(NetworkUDPAdvertiseThread, NULL)) { NetworkUDPAdvertiseThread(NULL); diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 568e4240bd..b6233df829 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -483,7 +483,7 @@ static const NWidgetPart _nested_scen_edit_land_gen_widgets[] = { NWidget(WWT_IMGBTN, COLOUR_GREY, WID_ETT_PLACE_DESERT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_DESERT, STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA), EndContainer(), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_ETT_PLACE_OBJECT), SetMinimalSize(23, 22), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_ETT_PLACE_OBJECT), SetMinimalSize(23, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRANSMITTER, STR_SCENEDIT_TOOLBAR_PLACE_OBJECT), NWidget(NWID_SPACER), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_ETT_PLACE_HOUSE), SetMinimalSize(23, 22), @@ -634,7 +634,7 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { break; case WID_ETT_PLACE_HOUSE: // Place house button - ShowBuildHousePicker(this); + ShowBuildHousePicker(); break; case WID_ETT_INCREASE_SIZE: @@ -702,10 +702,6 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT); break; - case WID_ETT_PLACE_HOUSE: // Place house button - PlaceProc_House(tile); - break; - default: NOT_REACHED(); } } diff --git a/src/town_gui.cpp b/src/town_gui.cpp index c5ce502eb3..2164777511 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -45,6 +45,8 @@ typedef GUIList GUITownList; +static void PlaceProc_House(TileIndex tile); + static const NWidgetPart _nested_town_authority_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), @@ -1331,12 +1333,13 @@ public: static HouseID _cur_house = INVALID_HOUSE_ID; ///< house selected in the house picker window /** The window used for building houses. */ -class HousePickerWindow : public PickerWindowBase { +class HousePickerWindow : public Window { protected: GUIHouseList house_list; ///< list of houses and house sets - uint house_offset; ///< index of selected house + int house_offset; ///< index of selected house uint house_set; ///< index of selected house set uint line_height; ///< height of a single line in the list of house sets + HouseID display_house; ///< house ID of currently displayed house void RestoreSelectedHouseIndex() { @@ -1345,6 +1348,7 @@ protected: if (this->house_list.Length() == 0) { // no houses at all? _cur_house = INVALID_HOUSE_ID; + this->display_house = _cur_house; return; } @@ -1360,6 +1364,16 @@ protected: } } _cur_house = this->house_list.GetHouseAtOffset(this->house_set, this->house_offset); + this->display_house = _cur_house; + } + + void SelectHouseIntl(uint new_house_set, int new_house_offset) + { + SetObjectToPlaceWnd(SPR_CURSOR_TOWN, PAL_NONE, HT_RECT, this); + this->house_set = new_house_set; + this->house_offset = new_house_offset; + _cur_house = this->house_list.GetHouseAtOffset(new_house_set, new_house_offset); + this->display_house = _cur_house; } /** @@ -1367,14 +1381,13 @@ protected: * @param new_house_set index of the house set * @param new_house_offset offset of the house */ - void SelectOtherHouse(uint new_house_set, uint new_house_offset) + void SelectOtherHouse(uint new_house_set, int new_house_offset) { assert(new_house_set < this->house_list.NumHouseSets()); - assert(new_house_offset < this->house_list.NumHousesInHouseSet(new_house_set)); + assert(new_house_offset < (int) this->house_list.NumHousesInHouseSet(new_house_set)); + assert(new_house_offset >= 0); - _cur_house = this->house_list.GetHouseAtOffset(new_house_set, new_house_offset); - this->house_set = new_house_set; - this->house_offset = new_house_offset; + SelectHouseIntl(new_house_set, new_house_offset); NWidgetMatrix *matrix = this->GetWidget(WID_HP_HOUSE_SELECT_MATRIX); matrix->SetCount(this->house_list.NumHousesInHouseSet(this->house_set)); @@ -1395,24 +1408,19 @@ protected: } public: - HousePickerWindow(WindowDesc *desc, Window *w) : PickerWindowBase(desc, w) + HousePickerWindow(WindowDesc *desc, WindowNumber number) : Window(desc) { this->CreateNestedTree(); /* there is no shade box but we will shade the window if there is no house to show */ this->shade_select = this->GetWidget(WID_HP_MAIN_PANEL_SEL); NWidgetMatrix *matrix = this->GetWidget(WID_HP_HOUSE_SELECT_MATRIX); matrix->SetScrollbar(this->GetScrollbar(WID_HP_HOUSE_SELECT_SCROLL)); - this->FinishInitNested(0); + this->FinishInitNested(number); if (_cur_house != INVALID_HOUSE_ID) matrix->SetClicked(this->house_offset); // set clicked item again to make it visible } - ~HousePickerWindow() - { - DeleteWindowById(WC_SELECT_TOWN, 0); - } - - virtual void OnInit() + virtual void OnInit() override { this->house_list.Build(); this->RestoreSelectedHouseIndex(); @@ -1437,88 +1445,122 @@ public: NWidgetMatrix *matrix = this->GetWidget(WID_HP_HOUSE_SELECT_MATRIX); matrix->SetCount(this->house_list.NumHousesInHouseSet(this->house_set)); matrix->SetClicked(this->house_offset); + SelectHouseIntl(this->house_set, this->house_offset); + } else { + ResetObjectToPlace(); } } virtual void SetStringParameters(int widget) const { - switch (widget) { - case WID_HP_CAPTION: - if (this->house_list.NumHouseSets() == 1) SetDParamStr(0, this->house_list.GetNameOfHouseSet(0)); - break; + if (widget == WID_HP_CAPTION) { + if (this->house_list.NumHouseSets() == 1) SetDParamStr(0, this->house_list.GetNameOfHouseSet(0)); + } else if (this->display_house == INVALID_HOUSE_ID) { + switch (widget) { + case WID_HP_CAPTION: + break; - case WID_HP_HOUSE_NAME: - SetDParam(0, GetHouseName(_cur_house)); - break; + case WID_HP_HOUSE_ZONES: + for (int i = 0; i < HZB_END; i++) { + SetDParam(2 * i, STR_HOUSE_BUILD_HOUSE_ZONE_DISABLED); + SetDParam(2 * i + 1, i + 1); + } + break; - case WID_HP_HISTORICAL_BUILDING: - SetDParam(0, HouseSpec::Get(_cur_house)->extra_flags & BUILDING_IS_HISTORICAL ? STR_HOUSE_BUILD_HISTORICAL_BUILDING : STR_EMPTY); - break; + case WID_HP_HOUSE_YEARS: + SetDParam(0, STR_HOUSE_BUILD_YEARS_BAD_YEAR); + SetDParam(1, 0); + SetDParam(2, STR_HOUSE_BUILD_YEARS_BAD_YEAR); + SetDParam(3, 0); + break; - case WID_HP_HOUSE_POPULATION: - SetDParam(0, HouseSpec::Get(_cur_house)->population); - break; + case WID_HP_HOUSE_ACCEPTANCE: + SetDParamStr(0, ""); + break; - case WID_HP_HOUSE_ZONES: { - HouseZones zones = (HouseZones)(HouseSpec::Get(_cur_house)->building_availability & HZ_ZONALL); - for (int i = 0; i < HZB_END; i++) { - /* colour: gold(enabled)/grey(disabled) */ - SetDParam(2 * i, HasBit(zones, HZB_END - i - 1) ? STR_HOUSE_BUILD_HOUSE_ZONE_ENABLED : STR_HOUSE_BUILD_HOUSE_ZONE_DISABLED); - /* digit: 1(center)/2/3/4/5(edge) */ - SetDParam(2 * i + 1, i + 1); + case WID_HP_HOUSE_SUPPLY: + SetDParam(0, 0); + break; + + default: + SetDParam(0, STR_EMPTY); + break; + } + } else { + switch (widget) { + case WID_HP_HOUSE_NAME: + SetDParam(0, GetHouseName(this->display_house)); + break; + + case WID_HP_HISTORICAL_BUILDING: + SetDParam(0, HouseSpec::Get(this->display_house)->extra_flags & BUILDING_IS_HISTORICAL ? STR_HOUSE_BUILD_HISTORICAL_BUILDING : STR_EMPTY); + break; + + case WID_HP_HOUSE_POPULATION: + SetDParam(0, HouseSpec::Get(this->display_house)->population); + break; + + case WID_HP_HOUSE_ZONES: { + HouseZones zones = (HouseZones)(HouseSpec::Get(this->display_house)->building_availability & HZ_ZONALL); + for (int i = 0; i < HZB_END; i++) { + /* colour: gold(enabled)/grey(disabled) */ + SetDParam(2 * i, HasBit(zones, HZB_END - i - 1) ? STR_HOUSE_BUILD_HOUSE_ZONE_ENABLED : STR_HOUSE_BUILD_HOUSE_ZONE_DISABLED); + /* digit: 1(center)/2/3/4/5(edge) */ + SetDParam(2 * i + 1, i + 1); + } + break; } - break; - } - case WID_HP_HOUSE_LANDSCAPE: { - StringID info = STR_HOUSE_BUILD_LANDSCAPE_ABOVE_OR_BELOW_SNOWLINE; - switch (HouseSpec::Get(_cur_house)->building_availability & (HZ_SUBARTC_ABOVE | HZ_SUBARTC_BELOW)) { - case HZ_SUBARTC_ABOVE: info = STR_HOUSE_BUILD_LANDSCAPE_ONLY_ABOVE_SNOWLINE; break; - case HZ_SUBARTC_BELOW: info = STR_HOUSE_BUILD_LANDSCAPE_ONLY_BELOW_SNOWLINE; break; - default: break; + case WID_HP_HOUSE_LANDSCAPE: { + StringID info = STR_HOUSE_BUILD_LANDSCAPE_ABOVE_OR_BELOW_SNOWLINE; + switch (HouseSpec::Get(this->display_house)->building_availability & (HZ_SUBARTC_ABOVE | HZ_SUBARTC_BELOW)) { + case HZ_SUBARTC_ABOVE: info = STR_HOUSE_BUILD_LANDSCAPE_ONLY_ABOVE_SNOWLINE; break; + case HZ_SUBARTC_BELOW: info = STR_HOUSE_BUILD_LANDSCAPE_ONLY_BELOW_SNOWLINE; break; + default: break; + } + SetDParam(0, info); + break; } - SetDParam(0, info); - break; - } - case WID_HP_HOUSE_YEARS: { - const HouseSpec *hs = HouseSpec::Get(_cur_house); - SetDParam(0, hs->min_year <= _cur_year ? STR_HOUSE_BUILD_YEARS_GOOD_YEAR : STR_HOUSE_BUILD_YEARS_BAD_YEAR); - SetDParam(1, hs->min_year); - SetDParam(2, hs->max_year >= _cur_year ? STR_HOUSE_BUILD_YEARS_GOOD_YEAR : STR_HOUSE_BUILD_YEARS_BAD_YEAR); - SetDParam(3, hs->max_year); - break; - } - - case WID_HP_HOUSE_ACCEPTANCE: { - static char buff[DRAW_STRING_BUFFER] = ""; - char *str = buff; - CargoArray cargo; - uint32 dummy = 0; - AddAcceptedHouseCargo(_cur_house, INVALID_TILE, cargo, &dummy); - for (uint i = 0; i < NUM_CARGO; i++) { - if (cargo[i] == 0) continue; - /* If the accepted value is less than 8, show it in 1/8:ths */ - SetDParam(0, cargo[i] < 8 ? STR_HOUSE_BUILD_CARGO_VALUE_EIGHTS : STR_HOUSE_BUILD_CARGO_VALUE_JUST_NAME); - SetDParam(1, cargo[i]); - SetDParam(2, CargoSpec::Get(i)->name); - str = GetString(str, str == buff ? STR_HOUSE_BUILD_CARGO_FIRST : STR_HOUSE_BUILD_CARGO_SEPARATED, lastof(buff)); + case WID_HP_HOUSE_YEARS: { + const HouseSpec *hs = HouseSpec::Get(this->display_house); + SetDParam(0, hs->min_year <= _cur_year ? STR_HOUSE_BUILD_YEARS_GOOD_YEAR : STR_HOUSE_BUILD_YEARS_BAD_YEAR); + SetDParam(1, hs->min_year); + SetDParam(2, hs->max_year >= _cur_year ? STR_HOUSE_BUILD_YEARS_GOOD_YEAR : STR_HOUSE_BUILD_YEARS_BAD_YEAR); + SetDParam(3, hs->max_year); + break; } - if (str == buff) GetString(buff, STR_JUST_NOTHING, lastof(buff)); - SetDParamStr(0, buff); - break; - } - case WID_HP_HOUSE_SUPPLY: { - CargoArray cargo; - AddProducedHouseCargo(_cur_house, INVALID_TILE, cargo); - uint32 cargo_mask = 0; - for (uint i = 0; i < NUM_CARGO; i++) if (cargo[i] != 0) SetBit(cargo_mask, i); - SetDParam(0, cargo_mask); - break; - } + case WID_HP_HOUSE_ACCEPTANCE: { + static char buff[DRAW_STRING_BUFFER] = ""; + char *str = buff; + CargoArray cargo; + uint32 dummy = 0; + AddAcceptedHouseCargo(this->display_house, INVALID_TILE, cargo, &dummy); + for (uint i = 0; i < NUM_CARGO; i++) { + if (cargo[i] == 0) continue; + /* If the accepted value is less than 8, show it in 1/8:ths */ + SetDParam(0, cargo[i] < 8 ? STR_HOUSE_BUILD_CARGO_VALUE_EIGHTS : STR_HOUSE_BUILD_CARGO_VALUE_JUST_NAME); + SetDParam(1, cargo[i]); + SetDParam(2, CargoSpec::Get(i)->name); + str = GetString(str, str == buff ? STR_HOUSE_BUILD_CARGO_FIRST : STR_HOUSE_BUILD_CARGO_SEPARATED, lastof(buff)); + } + if (str == buff) GetString(buff, STR_JUST_NOTHING, lastof(buff)); + SetDParamStr(0, buff); + break; + } - default: break; + case WID_HP_HOUSE_SUPPLY: { + CargoArray cargo; + AddProducedHouseCargo(this->display_house, INVALID_TILE, cargo); + uint32 cargo_mask = 0; + for (uint i = 0; i < NUM_CARGO; i++) if (cargo[i] != 0) SetBit(cargo_mask, i); + SetDParam(0, cargo_mask); + break; + } + + default: break; + } } } @@ -1612,7 +1654,9 @@ public: } case WID_HP_HOUSE_PREVIEW: - DrawHouseImage(_cur_house, r.left, r.top, r.right, r.bottom); + if (this->display_house != INVALID_HOUSE_ID) { + DrawHouseImage(this->display_house, r.left, r.top, r.right, r.bottom); + } break; case WID_HP_HOUSE_SELECT: { @@ -1645,6 +1689,21 @@ public: break; } } + + virtual void OnPlaceObject(Point pt, TileIndex tile) override + { + PlaceProc_House(tile); + } + + virtual void OnPlaceObjectAbort() override + { + this->house_offset = -1; + _cur_house = INVALID_HOUSE_ID; + NWidgetMatrix *matrix = this->GetWidget(WID_HP_HOUSE_SELECT_MATRIX); + matrix->SetClicked(-1); + this->UpdateSelectSize(); + this->SetDirty(); + } }; static const NWidgetPart _nested_house_picker_widgets[] = { @@ -1715,12 +1774,9 @@ static WindowDesc _house_picker_desc( * Show our house picker. * @param parent The toolbar window we're associated with. */ -void ShowBuildHousePicker(Window *parent) +void ShowBuildHousePicker() { - if (BringWindowToFrontById(WC_BUILD_HOUSE, 0) != NULL) { - return; - } - new HousePickerWindow(&_house_picker_desc, parent); + AllocateWindowDescFront(&_house_picker_desc, 0); } @@ -1820,8 +1876,7 @@ static void ShowSelectTownWindow(const TownList &towns, const CommandContainer & new SelectTownWindow(&_select_town_desc, towns, cmd); } - -void PlaceProc_House(TileIndex tile) +static void PlaceProc_House(TileIndex tile) { if (_town_pool.items == 0) { ShowErrorMessage(STR_ERROR_CAN_T_BUILD_HOUSE_HERE, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO); diff --git a/src/town_gui.h b/src/town_gui.h index 6f516ab989..3b22d68daf 100644 --- a/src/town_gui.h +++ b/src/town_gui.h @@ -12,11 +12,6 @@ #ifndef TOWN_GUI_H #define TOWN_GUI_H -#include "tile_type.h" - -struct Window; - -void ShowBuildHousePicker(Window *parent); -void PlaceProc_House(TileIndex tile); +void ShowBuildHousePicker(); #endif /* TOWN_GUI_H */