mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-13 07:10:57 +00:00
Merge branch 'master' into jgrpp
# Conflicts: # src/group_gui.cpp # src/lang/german.txt # src/lang/korean.txt # src/lang/traditional_chinese.txt # src/pathfinder/yapf/yapf_rail.cpp # src/saveload/vehicle_sl.cpp # src/window.cpp
This commit is contained in:
commit
80d56307c7
@ -1384,7 +1384,7 @@ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTil
|
||||
}
|
||||
|
||||
if (gfx == GFX_WATERTILE_SPECIALCHECK) {
|
||||
if (!IsTileType(cur_tile, MP_WATER) ||
|
||||
if (!IsWaterTile(cur_tile) ||
|
||||
!IsTileFlat(cur_tile)) {
|
||||
return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
|
||||
}
|
||||
|
@ -1762,7 +1762,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Comproba
|
||||
STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Mostrar configuración de scripts de juego e IAs
|
||||
STR_INTRO_TOOLTIP_QUIT :{BLACK}Salir de 'OpenTTD'
|
||||
|
||||
STR_INTRO_TRANSLATION :{BLACK}A esta traducción le faltan {NUM} cadena{P "" s}. Considera ayudar a mejorar OpenTTD convirtiéndote en traductor. Consulta readme.txt para más detalles.
|
||||
STR_INTRO_TRANSLATION :{BLACK}A esta traducción le faltan {NUM} cadena{P "" s} de texto. Considera ayudar a mejorar OpenTTD convirtiéndote en traductor. Consulta el readme.txt para más detalles.
|
||||
|
||||
# Quit window
|
||||
STR_QUIT_CAPTION :{WHITE}Salir
|
||||
@ -2259,7 +2259,7 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... no s
|
||||
STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}No ha sido posible descomprimir el archivo descargado
|
||||
|
||||
STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Gráficos no encontrados
|
||||
STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD necesita gráficos para funcionar pero no se pudo encontrar ninguno. ¿Desea permitir que OpenTTD descargue e instale dichos gráficos?
|
||||
STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD necesita gráficos para funcionar pero no pudo encontrarse ninguno. ¿Desea permitir que OpenTTD descargue e instale dichos gráficos?
|
||||
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Sí, descargar los gráficos
|
||||
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}No, salir de OpenTTD
|
||||
|
||||
@ -2896,7 +2896,7 @@ STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} est
|
||||
STR_NEWGRF_ERROR_INVALID_PARAMETER :Parámetro incorrecto para {1:STRING}: párametro {STRING} ({NUM})
|
||||
STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} debe ser cargado antes de {STRING}
|
||||
STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} debe ser cargado después de {STRING}
|
||||
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requiere OpenTTD versión {STRING} ó superior
|
||||
STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} necesita la versión {STRING} ó superior de OpenTTD
|
||||
STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :El archivo GRF ha sido diseñado para ser traducido
|
||||
STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRFs han sido cargados
|
||||
STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Cargar {1:STRING} como NewGRF estático con {STRING} puede causar desincronizaciones
|
||||
@ -3290,10 +3290,12 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}La indu
|
||||
|
||||
############ range for requires starts
|
||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}
|
||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
|
||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Necesita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
|
||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
|
||||
############ range for requires ends
|
||||
|
||||
STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesita
|
||||
STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{CARGO_LONG} {BLACK}esperando
|
||||
|
||||
############ range for produces starts
|
||||
STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Produce: {YELLOW}{STRING}{STRING}
|
||||
@ -3362,6 +3364,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Quitar todos lo
|
||||
|
||||
STR_GROUP_RENAME_CAPTION :{BLACK}Renombrar un grupo
|
||||
|
||||
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
|
||||
|
||||
# Build vehicle window
|
||||
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nuevos Vehículos de Ferrocarril
|
||||
@ -3811,7 +3814,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Ir al depósito
|
||||
STR_ORDER_GO_TO_NEAREST_HANGAR :Ir al hangar más cercano
|
||||
STR_ORDER_CONDITIONAL :Salto de orden condicional
|
||||
STR_ORDER_SHARE :Compartir órdenes
|
||||
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añadir nueva orden antes de la orden resaltada, o añadirla al final de la lista. Ctrl sobre estaciones ordena 'Carga completa cualquier carga', sobre puntos de ruta ordena 'sin paradas' y sobre depósitos ordena 'mantenimiento'. Ctrl o Compartir órdenes permite a este vehículo compartir órdenes con el vehículo seleccionado. Click sobre un vehículo copia las órdenes. Una órden de depósito desactiva el mantenimiento automático del vehículo
|
||||
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Añadir nueva orden antes de la orden resaltada, o añadirla al final de la lista. Ctrl sobre estaciones ordena 'Carga completa de cualquier carga', sobre puntos de ruta ordena 'sin paradas' y sobre depósitos ordena 'mantenimiento'. Ctrl o Compartir órdenes permite a este vehículo compartir órdenes con el vehículo seleccionado. Click sobre un vehículo copia las órdenes. Una órden de depósito desactiva el mantenimiento automático del vehículo
|
||||
|
||||
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Ver todos los vehículos con el mismo calendario
|
||||
|
||||
@ -4108,7 +4111,7 @@ STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Mensaje
|
||||
# Generic construction errors
|
||||
STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Fuera del borde del mapa
|
||||
STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Demasiado cerca del borde del mapa
|
||||
STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No hay suficiente dinero - se requiere {CURRENCY_LONG}
|
||||
STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}No hay suficiente dinero - se necesita {CURRENCY_LONG}
|
||||
STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Se requiere terreno llano
|
||||
STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Tierra inclinada en dirección errónea
|
||||
STR_ERROR_CAN_T_DO_THIS :{WHITE}No se puede hacer eso...
|
||||
|
@ -541,6 +541,8 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
/* Penalty for reversing in a depot. */
|
||||
assert(IsRailDepot(cur.tile));
|
||||
segment_cost += Yapf().PfGetSettings().rail_depot_reverse_penalty;
|
||||
|
||||
} else if (IsRailDepotTile(cur.tile)) {
|
||||
/* We will end in this pass (depot is possible target) */
|
||||
end_segment_reason |= ESRB_DEPOT;
|
||||
|
||||
@ -554,9 +556,16 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
CFollowTrackRail ft(v);
|
||||
TileIndex t = cur.tile;
|
||||
Trackdir td = cur.td;
|
||||
/* Arbitrary maximum tiles to follow to avoid infinite loops. */
|
||||
uint max_tiles = 20;
|
||||
while (ft.Follow(t, td)) {
|
||||
assert(t != ft.m_new_tile);
|
||||
t = ft.m_new_tile;
|
||||
if (t == cur.tile || --max_tiles == 0) {
|
||||
/* We looped back on ourself or found another loop, bail out. */
|
||||
td = INVALID_TRACKDIR;
|
||||
break;
|
||||
}
|
||||
if (KillFirstBit(ft.m_new_td_bits) != TRACKDIR_BIT_NONE) {
|
||||
/* We encountered a junction; it's going to be too complex to
|
||||
* handle this perfectly, so just bail out. There is no simple
|
||||
@ -615,7 +624,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
/* Finish if we already exceeded the maximum path cost (i.e. when
|
||||
* searching for the nearest depot). */
|
||||
if (m_max_cost > 0 && (parent_cost + segment_entry_cost + segment_cost) > m_max_cost) {
|
||||
end_segment_reason |= ESRB_PATH_TOO_LONG;
|
||||
end_segment_reason |= ESRB_MAX_COST_EXCEEDED;
|
||||
}
|
||||
|
||||
/* Move to the next tile/trackdir. */
|
||||
@ -691,6 +700,9 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
|
||||
} // for (;;)
|
||||
|
||||
/* Don't consider path any further it if exceeded max_cost. */
|
||||
if (end_segment_reason & ESRB_MAX_COST_EXCEEDED) return false;
|
||||
|
||||
bool target_seen = false;
|
||||
if ((end_segment_reason & ESRB_POSSIBLE_TARGET) != ESRB_NONE) {
|
||||
/* Depot, station or waypoint. */
|
||||
|
@ -288,7 +288,7 @@ public:
|
||||
return 't';
|
||||
}
|
||||
|
||||
static bool stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed)
|
||||
static FindDepotData stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty)
|
||||
{
|
||||
Tpf pf1;
|
||||
/*
|
||||
@ -301,16 +301,16 @@ public:
|
||||
* depot orders and you do not disable automatic servicing.
|
||||
*/
|
||||
if (max_penalty != 0) pf1.DisableCache(true);
|
||||
bool result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, depot_tile, reversed);
|
||||
FindDepotData result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty);
|
||||
|
||||
if (_debug_yapfdesync_level > 0 || _debug_desync_level >= 2) {
|
||||
Tpf pf2;
|
||||
TileIndex depot_tile2 = INVALID_TILE;
|
||||
bool reversed2 = false;
|
||||
pf2.DisableCache(true);
|
||||
bool result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, &depot_tile2, &reversed2);
|
||||
if (result1 != result2 || (result1 && (*depot_tile != depot_tile2 || *reversed != reversed2))) {
|
||||
DEBUG(desync, 0, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
|
||||
FindDepotData result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty);
|
||||
if (result1.tile != result2.tile || (result1.reverse != result2.reverse)) {
|
||||
DEBUG(desync, 0, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]",
|
||||
result1.tile != INVALID_TILE ? "T" : "F",
|
||||
result2.tile != INVALID_TILE ? "T" : "F");
|
||||
DumpState(pf1, pf2);
|
||||
}
|
||||
}
|
||||
@ -318,7 +318,7 @@ public:
|
||||
return result1;
|
||||
}
|
||||
|
||||
inline bool FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed)
|
||||
inline FindDepotData FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty)
|
||||
{
|
||||
/* set origin and destination nodes */
|
||||
Yapf().SetOrigin(t1, td1, t2, td2, reverse_penalty, true);
|
||||
@ -326,13 +326,10 @@ public:
|
||||
Yapf().SetMaxCost(max_penalty);
|
||||
|
||||
/* find the best path */
|
||||
bool bFound = Yapf().FindPath(v);
|
||||
if (!bFound) return false;
|
||||
if (!Yapf().FindPath(v)) return FindDepotData();
|
||||
|
||||
/* some path found
|
||||
* get found depot tile */
|
||||
/* Some path found. */
|
||||
Node *n = Yapf().GetBestNode();
|
||||
*depot_tile = n->GetLastTile();
|
||||
|
||||
/* walk through the path back to the origin */
|
||||
Node *pNode = n;
|
||||
@ -342,9 +339,7 @@ public:
|
||||
|
||||
/* if the origin node is our front vehicle tile/Trackdir then we didn't reverse
|
||||
* but we can also look at the cost (== 0 -> not reversed, == reverse_penalty -> reversed) */
|
||||
*reversed = (pNode->m_cost != 0);
|
||||
|
||||
return true;
|
||||
return FindDepotData(n->GetLastTile(), n->m_cost, pNode->m_cost != 0);
|
||||
}
|
||||
};
|
||||
|
||||
@ -684,15 +679,13 @@ bool YapfTrainCheckReverse(const Train *v)
|
||||
|
||||
FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty)
|
||||
{
|
||||
FindDepotData fdd;
|
||||
|
||||
const Train *last_veh = v->Last();
|
||||
|
||||
PBSTileInfo origin = FollowTrainReservation(v);
|
||||
TileIndex last_tile = last_veh->tile;
|
||||
Trackdir td_rev = ReverseTrackdir(last_veh->GetVehicleTrackdir());
|
||||
|
||||
typedef bool (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int, TileIndex*, bool*);
|
||||
typedef FindDepotData (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int);
|
||||
PfnFindNearestDepotTwoWay pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail1::stFindNearestDepotTwoWay;
|
||||
|
||||
/* check if non-default YAPF type needed */
|
||||
@ -700,9 +693,7 @@ FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty)
|
||||
pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail2::stFindNearestDepotTwoWay; // Trackdir, forbid 90-deg
|
||||
}
|
||||
|
||||
bool ret = pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY, &fdd.tile, &fdd.reverse);
|
||||
fdd.best_length = ret ? max_penalty / 2 : UINT_MAX; // some fake distance or NOT_FOUND
|
||||
return fdd;
|
||||
return pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY);
|
||||
}
|
||||
|
||||
bool YapfTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir td, bool override_railtype)
|
||||
|
@ -19,6 +19,7 @@ enum EndSegmentReason {
|
||||
ESR_RAIL_TYPE, ///< the next tile has a different rail type than our tiles
|
||||
ESR_INFINITE_LOOP, ///< infinite loop detected
|
||||
ESR_SEGMENT_TOO_LONG, ///< the segment is too long (possible infinite loop)
|
||||
ESR_MAX_COST_EXCEEDED, ///< maximum cost is exceeded
|
||||
ESR_CHOICE_FOLLOWS, ///< the next tile contains a choice (the track splits to more than one segments)
|
||||
ESR_DEPOT, ///< stop in the depot (could be a target next time)
|
||||
ESR_WAYPOINT, ///< waypoint encountered (could be a target next time)
|
||||
@ -43,6 +44,7 @@ enum EndSegmentReasonBits {
|
||||
ESRB_RAIL_TYPE = 1 << ESR_RAIL_TYPE,
|
||||
ESRB_INFINITE_LOOP = 1 << ESR_INFINITE_LOOP,
|
||||
ESRB_SEGMENT_TOO_LONG = 1 << ESR_SEGMENT_TOO_LONG,
|
||||
ESRB_MAX_COST_EXCEEDED = 1 << ESR_MAX_COST_EXCEEDED,
|
||||
ESRB_CHOICE_FOLLOWS = 1 << ESR_CHOICE_FOLLOWS,
|
||||
ESRB_DEPOT = 1 << ESR_DEPOT,
|
||||
ESRB_WAYPOINT = 1 << ESR_WAYPOINT,
|
||||
@ -63,7 +65,7 @@ enum EndSegmentReasonBits {
|
||||
ESRB_CACHED_MASK = ESRB_DEAD_END | ESRB_RAIL_TYPE | ESRB_INFINITE_LOOP | ESRB_SEGMENT_TOO_LONG | ESRB_CHOICE_FOLLOWS | ESRB_DEPOT | ESRB_WAYPOINT | ESRB_STATION | ESRB_SAFE_TILE,
|
||||
|
||||
/* Reasons to abort pathfinding in this direction. */
|
||||
ESRB_ABORT_PF_MASK = ESRB_DEAD_END | ESRB_PATH_TOO_LONG | ESRB_INFINITE_LOOP | ESRB_FIRST_TWO_WAY_RED,
|
||||
ESRB_ABORT_PF_MASK = ESRB_DEAD_END | ESRB_PATH_TOO_LONG | ESRB_MAX_COST_EXCEEDED | ESRB_INFINITE_LOOP | ESRB_FIRST_TWO_WAY_RED,
|
||||
};
|
||||
|
||||
DECLARE_ENUM_AS_BIT_SET(EndSegmentReasonBits)
|
||||
@ -71,7 +73,7 @@ DECLARE_ENUM_AS_BIT_SET(EndSegmentReasonBits)
|
||||
inline CStrA ValueStr(EndSegmentReasonBits bits)
|
||||
{
|
||||
static const char * const end_segment_reason_names[] = {
|
||||
"DEAD_END", "RAIL_TYPE", "INFINITE_LOOP", "SEGMENT_TOO_LONG", "CHOICE_FOLLOWS",
|
||||
"DEAD_END", "RAIL_TYPE", "INFINITE_LOOP", "SEGMENT_TOO_LONG", "MAX_COST_EXCEEDED", "CHOICE_FOLLOWS",
|
||||
"DEPOT", "WAYPOINT", "STATION", "SAFE_TILE",
|
||||
"PATH_TOO_LONG", "FIRST_TWO_WAY_RED", "LOOK_AHEAD_END", "TARGET_REACHED"
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user