(svn r3472) - [PBS] Remove from trunk. Anyone interested can still find it in branch/pbs. This reverts revisions r3158, r3140, r3075, r2977, r2674, r2625, r2621, r2529, r2528, r2525, r2524, r2519, r2517, r2516, r2507, r2499. (in conjunction with Tron)

- The only change is that the nsignalsw.grf file is kept and that existing nightlies with PBS signals get those signals converted to combo-signals.
pull/155/head
Darkvater 19 years ago
parent e051091c35
commit 4014e36aec

@ -660,7 +660,6 @@ SRCS += openttd.c
SRCS += order_cmd.c
SRCS += order_gui.c
SRCS += pathfind.c
SRCS += pbs.c
SRCS += player_gui.c
SRCS += players.c
SRCS += pool.c

@ -107,8 +107,6 @@ AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFin
result->FoundEndNode = AyStar_AiPathFinder_FoundEndNode;
result->GetNeighbours = AyStar_AiPathFinder_GetNeighbours;
result->BeforeExit = NULL;
result->free = AyStar_AiPathFinder_Free;
// Set some information

@ -232,10 +232,6 @@ int AyStarMain_Main(AyStar *aystar) {
else if (r == AYSTAR_LIMIT_REACHED)
printf("[AyStar] Exceeded search_nodes, no path found\n");
#endif
if (aystar->BeforeExit != NULL)
aystar->BeforeExit(aystar);
if (r != AYSTAR_STILL_BUSY)
/* We're done, clean up */
aystar->clear(aystar);

@ -98,11 +98,6 @@ typedef void AyStar_GetNeighbours(AyStar *aystar, OpenListNode *current);
*/
typedef void AyStar_FoundEndNode(AyStar *aystar, OpenListNode *current);
/*
* Is called when aystar ends it pathfinding, but before cleanup.
*/
typedef void AyStar_BeforeExit(AyStar *aystar);
// For internal use, see aystar.c
typedef void AyStar_AddStartNode(AyStar *aystar, AyStarNode* start_node, uint g);
typedef int AyStar_Main(AyStar *aystar);
@ -122,7 +117,6 @@ struct AyStar {
AyStar_GetNeighbours* GetNeighbours;
AyStar_EndNodeCheck* EndNodeCheck;
AyStar_FoundEndNode* FoundEndNode;
AyStar_BeforeExit* BeforeExit;
/* These are completely untouched by AyStar, they can be accesed by
* the application specific routines to input and output data.

@ -18,7 +18,6 @@ int _debug_ms_level;
int _debug_net_level;
int _debug_spritecache_level;
int _debug_oldloader_level;
int _debug_pbs_level;
int _debug_ntp_level;
int _debug_npf_level;
@ -51,7 +50,6 @@ typedef struct DebugLevel {
DEBUG_LEVEL(net),
DEBUG_LEVEL(spritecache),
DEBUG_LEVEL(oldloader),
DEBUG_LEVEL(pbs),
DEBUG_LEVEL(ntp),
DEBUG_LEVEL(npf)
};

@ -17,7 +17,6 @@
extern int _debug_net_level;
extern int _debug_spritecache_level;
extern int _debug_oldloader_level;
extern int _debug_pbs_level;
extern int _debug_ntp_level;
extern int _debug_npf_level;
#endif

@ -103,13 +103,12 @@ m5 bit 7 clear: railway track
<li>m2 bits 7..4: bit clear = signal shows red; same bits as in m3</li>
<li>OpenTTD bits in m4:
<table>
<tr><td nowrap valign=top>bits 2..0: </td><td align=left>type of signal:</td></tr>
<tr><td nowrap valign=top><tt>000</tt>: </td><td align=left>normal signals</td></tr>
<tr><td nowrap valign=top><tt>001</tt>: </td><td align=left>pre-signals</td></tr>
<tr><td nowrap valign=top><tt>010</tt>: </td><td align=left>exit-signals</td></tr>
<tr><td nowrap valign=top><tt>011</tt>: </td><td align=left>combo-signals</td></tr>
<tr><td nowrap valign=top><tt>100</tt>: </td><td align=left>PBS signals</td></tr>
<tr><td nowrap valign=top>bit 3: </td><td align=left>set = semaphore signals, clear = light signals</td></tr>
<tr><td nowrap valign=top>bits 1..0: </td><td align=left>type of signal:</td></tr>
<tr><td nowrap valign=top><tt>00</tt>: </td><td align=left>normal signals</td></tr>
<tr><td nowrap valign=top><tt>01</tt>: </td><td align=left>pre-signals</td></tr>
<tr><td nowrap valign=top><tt>10</tt>: </td><td align=left>exit-signals</td></tr>
<tr><td nowrap valign=top><tt>11</tt>: </td><td align=left>combo-signals</td></tr>
<tr><td nowrap valign=top>bit 2: </td><td align=left>set = semaphore signals, clear = light signals</td></tr>
</table></li>
</ul></li>
<li>m1: <a href="#OwnershipInfo">owner</a> of the track
@ -131,11 +130,6 @@ m5 bit 7 clear: railway track
<tr><td nowrap valign=top><tt>C</tt>&nbsp; </td><td align=left>on snow or desert</td></tr>
</table></li>
<li>m3 bits 0..3 = <a name="TrackType">track type</a>: <tt>0</tt> - conventional railway, <tt>1</tt> - monorail, <tt>2</tt> - maglev
<li>m4 bits 4..7 = Pbs reserved status:
<table>
<tr><td nowrap valign=top><tt>bits 4..6</tt>&nbsp; </td><td align=left>'Track'number of reserved track + 1, if this is zero it means nothing is reserved on this tile</td></tr>
<tr><td nowrap valign=top><tt>bit 7</tt>&nbsp; </td><td align=left>If this is set, then the opposite track ('Track'number^1) is also reserved</td></tr>
</table></li>
</ul>
m5 bits 7 and 6 set: railway depot / checkpoints
<ul>
@ -149,7 +143,6 @@ m5 bits 7 and 6 set: railway depot / checkpoints
<li>m2: For waypoints, index into the array of waypoints.</li>
<li>m3 bits 0..3 = <a href="#TrackType">track type</a></li>
<li>m3 bit 4 = use custom sprite (valid only for the checkpoint)</li>
<li>m3 bit 6 = track on this tile is reserved by pbs</li>
<li>m4 bits 0..3 = ground type, as per m2 bits 0..3 for railway tiles.</li>
</ul>
</td></tr>
@ -174,7 +167,6 @@ m5 bit 4 set, bits 7..5 clear: level crossing
<ul>
<li>m5 bit 3: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular)</li>
<li>m5 bit 2: set if crossing lights are on</li>
<li>m5 bit 0: set if rail track is reserved by pbs</li>
<li>m1: <a href="#OwnershipInfo">owner</a> of the railway track</li>
<li>m2: Index into the array of towns, 0 for non-town roads</li>
<li>m3 bits 0..7: <a href="#OwnershipInfo">owner</a> of the road</li>
@ -390,7 +382,6 @@ exit towards: <tt>47</tt> - NE, <tt>48</tt> - SE, <tt>49</tt> - SW, <tt>4A</tt>
<li>m2: index into the <a href="#_StationArray">array of stations</a></li>
<li>m3 bits 0..3: <a href="#TrackType">track type</a> for railway stations, must be 0 for all the other stations</li>
<li>m3 bit 4 = use custom sprite (valid only railway stations FOR NOW)</li>
<li>m3 bit 6 set = track is reserved by pbs (railway stations only)</li>
<li>m4 = custom station id</li>
</ul>
</td></tr>
@ -561,8 +552,6 @@ m5 bits 7..4 clear: tunnel entrance/exit
<li>m1: <a href="#OwnershipInfo">owner</a> of the tunnel</li>
<li>m3 bits 3..0 = <a href="#TrackType">track type</a> for railway tunnel, must be 0 for road tunnel</li>
<li>m4 bit 7 set = on snow or desert</li>
<li>m4 bit 0 set = track with 'Track'number 0 is reserved by pbs</li>
<li>m4 bit 1 set = track with 'Track'number 1 is reserved by pbs</li>
</ul>
m5 bit 7 set: bridge
<ul><li>
@ -605,8 +594,6 @@ m5 bit 5 set:
<tr><td nowrap valign=top><tt>A</tt>&nbsp; </td><td align=center>200</td><td align=left>tubular, steel</td></tr>
</table></li>
<li>m4 bit 7 set = on snow or desert</li>
<li>m4 bit 0 set = track with 'Track'number 0 is reserved by pbs</li>
<li>m4 bit 1 set = track with 'Track'number 1 is reserved by pbs</li>
</ul>
</td></tr>

@ -70,7 +70,7 @@ the array so you can quickly see what is used and what is not.
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span> XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO O</span>XXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
</tr>
@ -78,7 +78,7 @@ the array so you can quickly see what is used and what is not.
<td class="caption">depot</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="free">O</span>X<span class="free">OO</span> XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">OO O</span>XXX</td>
@ -87,7 +87,7 @@ the array so you can quickly see what is used and what is not.
<td class="caption">waypoint</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits"><span class="free">O</span>X<span class="free">O</span>X XXXX</td>
<td class="bits"><span class="free">OOO</span>X XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XX<span class="free">OO O</span>XXX</td>
@ -109,7 +109,7 @@ the array so you can quickly see what is used and what is not.
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits">XXXX XX<span class="free">O</span>X</td>
<td class="bits">XXXX XX<span class="free">OO</span></td>
</tr>
<tr>
<td class="caption">road depot</td>
@ -145,7 +145,7 @@ the array so you can quickly see what is used and what is not.
<td class="caption">station</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits"><span class="free">O</span>X<span class="free">O</span>X XXXX</td>
<td class="bits"><span class="free">OOO</span>X XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
@ -221,7 +221,7 @@ the array so you can quickly see what is used and what is not.
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO</span> XXXX</td>
<td class="bits">X<span class="free">OOO OO</span>XX</td>
<td class="bits">X<span class="free">OOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
</tr>
@ -230,7 +230,7 @@ the array so you can quickly see what is used and what is not.
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="free">OOOO OOOO</span> <span class="abuse">XXXX XXXX</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">X<span class="free">OOO OO</span>XX</td>
<td class="bits">X<span class="free">OOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits">XXXX XXXX</td>
</tr>

@ -1020,7 +1020,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}End gam
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Enable smooth economy (more, smaller changes)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Allow buying shares from other companies
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}When dragging place signals every: {ORANGE}{STRING} tile(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Allow automatic placement of pbs signals: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Position of main toolbar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Left
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centre
@ -1429,7 +1428,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Railroad track
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 :Railroad track with combo-signals
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Railroad track with pbs-signals

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Termina
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Ativar economia regular (alterações menores)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permite comprar ações de outras companhias
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Ao arrastar colocar sinais a cada: {ORANGE}{STRING} quadrado(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permitir colocação automática de sinais PBS: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posição da barra de ferramentas principal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Esquerda
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centro
@ -1438,7 +1437,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Ferrovia com si
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Ferrovia com pre-sinais
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Ferrovia com sinais de saída
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Ferrovia com sinais combinados
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Ferrovia com sinalização PBS

@ -1029,7 +1029,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Fi del
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Activar economia suau (més canvis però més petits)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permetre comprar participadions d'altres empreses
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}En arrosegant, sitúa senyals cada: {ORANGE}{STRING} quadre(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permetre situacio automatica de senyals pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posició de la barra d'eines principal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Esquerra
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centre
@ -1436,7 +1435,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :V
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Vía de tren amb pre-senyals
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Vía de tren amb senyals de sortida
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Vía de tren amb senyals combinades
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Via de tren amb senyals pbs

@ -1085,7 +1085,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Ukoncit
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Plynulé zmeny ekonomiky (více men¨ích zmen)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Povolit kupování podílu z ostatních spolecnosti
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Pri ta¸ení umistovat signály ka¸dých(é): {ORANGE}{STRING} dilku(y)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Povolit automatické pokládání PBS signalu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Umisteni hlavní li¨ty: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :vlevo
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :uprostred
@ -1492,7 +1491,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Zeleznicni trat
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Zeleznicni trat s presignály
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Zeleznicni trat s výstupními signály
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Zeleznicni trat s kombinovanými signály
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Koleje s PBS signály

@ -1025,7 +1025,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Afslut
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Aktiver rolig økonomi (flere små ændringer)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Tillad at købe aktier i andre selskaber
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Ved trækning placer signal hvert: {ORANGE}{STRING} felt
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Tillad automatisk opsætning af pbs signaler: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Placering af værktøjslinie: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Venstre
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Center
@ -1432,7 +1431,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Togskinner med
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Togskinner med indkørselssignaler
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Togskinner med udkørselssignaler
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Togskinner med kombineret ind- og udkørselssignaler
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Togskinner med pbs signaler

@ -1028,7 +1028,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Stop sp
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Vloeiende economie inschakelen (meer, kleinere veranderingen)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Sta het kopen van aandelen toe
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Bij slepen, plaats seinen elke: {ORANGE}{STRING} tegel(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Sta automatische plaatsing van PBS-seinen toe: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Positie van hoofd knoppenbalk: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Links
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Midden
@ -1438,7 +1437,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Spoor met norma
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Spoor met voorseinen
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Spoor met uitgangseinen
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Spoor met combinatieseinen
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Spoor met pbs-seinen

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}End gam
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Enable smooth economy (more, smaller changes)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Allow buying shares from other companies
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}When dragging, place signals every: {ORANGE}{STRING1} tile(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Allow automatic placement of pbs signals: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Position of main toolbar: {ORANGE}{STRING1}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Left
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centre
@ -1445,7 +1444,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Railway track w
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Railway track with pre-signals
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Railway track with exit-signals
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Railway track with combo-signals
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Railway track with pbs-signals

@ -1028,7 +1028,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}M
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Luba sujuv majandus (väiksemad muutused)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Luba teiste ettevõtete aktsiate ostmine
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Venitades paigutatud signaaltulede tihedus: {ORANGE}{STRING} ühik(ut)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Luba automaatset pbs signaalide panemist: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Tööriistariba asukoht: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Vasakul
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Keskel
@ -1434,7 +1433,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Raudtee tavalis
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Raudtee eel-signaalidega
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Raudtee väljumis-signaalidega
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Raudtee kombo-signaalidega
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Raudtee koos pbs signaalidega

@ -1025,7 +1025,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Lopetus
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Tasainen talous (enemmän pieniä muutoksia)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Osakkeiden ostaminen yhtiöistä
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Vedettäessä aseta opastimien väleiksi: {ORANGE}{STRING} ruutu(a)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Salli kulkutieopastimien automaattinen sijoitus: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Päätyökalupalkin sijainti: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :vasen
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :keskellä
@ -1432,7 +1431,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Rautatie tavall
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Rautatie esiopastimin
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Rautatie poistumisopastimin
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Rautatie yhdistetyin opastimin
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Rautatie kulkutieopastimin

@ -1031,7 +1031,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Date de
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Permettre une économie stable (plus de petits changements)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permettre d'acheter des actions d'autres compagnies
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Espacements des signaux en mode drag & drop : {ORANGE}{STRING} case(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permettre pose automatique signaux PBS: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Position de la barre d'outils principale: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :À gauche
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centrée
@ -1439,7 +1438,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Rails avec des
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Rails avec des pré-signaux
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Rails avec des signaux de sortie
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Rails avec des signaux combinés
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Rails avec des signaux PBS

@ -1018,7 +1018,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Termina
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Habilita-la economía "suave"(máis cambios, pero máis pequenos)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permiti-la compra de accións por outras compañías
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Cando se arrastre, colocar siniais cada: {ORANGE}{STRING} cadrado(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permiti-lo emprazamento automático de sinais pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posición da barra de ferramentas principal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Esquerda
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centro
@ -1423,7 +1422,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :V
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Vía de ferrocarril con pre-sinais
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :vía de ferrocarril con sinais de saída
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Via de ferrocarril con sinais combinados
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Vía de ferrocarril con sinais pbs

@ -1031,7 +1031,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Spiel b
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Feinere Wirtschaft aktivieren (mehrere, kleinere Veränderungen)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Erlaube Anteile an anderen Firmen zu kaufen
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Errichte Signale alle {ORANGE}{STRING} Felder beim Ziehen mit der Maus
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Erlaube automatische Errichtung von Fahrstraßen-Signalen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Position der Werkzeugleiste: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Links
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Mitte
@ -1441,7 +1440,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Gleis mit norma
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Gleis mit Vorsignalen
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Gleis mit Ausfahrtsignalen
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Gleis mit kombinierten Vor-/Ausfahrtsignalen
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Gleise mit Fahrstraßen-Signalen

@ -1092,7 +1092,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}J
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Egyenletes gazdaság (több, kisebb változás)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Másik cégekbõl részvényt lehet vásárolni
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Amikor megragadom helyezzen lámpákat minden {ORANGE}{STRING}. mezõre
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Automatikus PBS (intelligens jelzõcsoport) létrehozás: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}A fõ eszközsor helye: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Balra
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Középen
@ -1501,7 +1500,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Vas
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Vasúti sin elõrejelzõ szemaforral
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Vasúti sin kijáratjelzõ szemaforral
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Vasúti sin vegyes szemaforral
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Vasúti sín intelligens jelzõkkel

@ -1025,7 +1025,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Enda le
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Virkja jafnan efnahag (fleiri og minni breytingar)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Leyfa hlutabréfakaup í öðrum fyrirtækjum
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Þegar dregið er, setja skilti á: {ORANGE}{STRING} hvern reit
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Leyfa sjálfvirka staðsetningu pbs lestarljósa: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Staðsetning tækjasláar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Vinstri
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Miðjað
@ -1432,7 +1431,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Lestarteinn me
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Lestarteinn með forljósum
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Lestarteinn með útljósum
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Lestarteinn með samljósum
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Lestarteinn með pbs ljósi

@ -1029,7 +1029,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Conclud
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Abilita nuova economia stabile (diverse piccole modifiche)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permetti l'acquisto di azioni da altre compagnie
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Trascinando il cursore costruisci i semafori ogni: {ORANGE}{STRING} quadrato/i
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permetti la disposizione automatica dei segnali pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posizione barra degli strumenti principale: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Sinistra
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centro
@ -1439,7 +1438,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Binario ferrovi
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Binario ferroviario con presegnali
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Binario ferroviario con segnali di uscita
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Binario ferroviario con segnali combinati
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Binario ferroviario con segnali pbs

@ -1027,7 +1027,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Spillet
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Jevn økonomi (Flere, mindre endringer)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Tillat kjøping av aksjer i andre selskaper
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Ved opptrekking plasser signal hver: {ORANGE}{STRING} rute(r)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Tillat automatisk plassering av pbs signal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posisjon av hovedverktøylinje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Venstre
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Sentrert
@ -1434,7 +1433,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Jernbanespor me
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Jernbanespor med for-signaler
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Jernbanespor med forlat-signaler
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Jernbanespor med kombinerte signaler
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Jernbane med PBS-signaler

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Data za
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Pozwol na lagodna ekonomie (male zmiany)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Pozwol kupowac udzialy w innych firmach
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}W trakcie przeciagania ustaw sygnaly co: {ORANGE}{STRING} kratk{P e i ek}
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Zezwol na automatyczne stawianie sygnalow PBS: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Pozycja glownego paska narzedzi: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Z lewej strony
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centralnie
@ -1438,7 +1437,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Tory kolejowe z
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Tory kolejowe z pre-sygnalami
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Tory kolejowe z sygnalizacja wyjsciowa
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Tory kolejowe z sygnalizacja combo
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Tory kolejowe z sygnalizacja PBS

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Termina
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Activar economia regular (alterações menores)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permite comprar acções de outras companhias
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Ao arrastar colocar sinais a cada: {ORANGE}{STRING} quadrado(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permitir posicionamento automático de sinais pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posição da barra de ferramentas principal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Esquerda
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centro
@ -1438,7 +1437,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Caminhos-de-fer
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Caminhos-de-ferro com pre-sinais
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Caminhos-de-ferro com sinais de saída
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Caminhos-de-ferro com sinais combinados
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Caminho de ferro com sinais pbs

@ -1029,7 +1029,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Termina
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Economie cu schimbări de productie mai reduse, dar mai frecvente
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permite cumpararea de actiuni de la alte companii
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Plasare automată a semnalelor la fiecare: {ORANGE}{STRING} pătrătele
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permite plasarea automata a semnalelor PBS: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Pozitia listei cu instrumente: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :stânga
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :centru
@ -1436,7 +1435,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Cale ferat
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Cale ferată cu pre-semnalizare
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Cale ferată cu semnale de iesire
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Cale ferată cu semnale combinate
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Cai ferate cu semnalizare PBS

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Ukoncit
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Mierne zmeny ekonomiky (viac mensich zmien)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Povolit nakup akcii od ostatnych spolocnosti
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Pri tahani umiestnit semafory kazdych(e): {ORANGE}{STRING} dlazdic(e)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Automaticke umiestnenie semaforov pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Pozicia hlavneho menu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Na lavo
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :V strede
@ -1438,7 +1437,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Zeleznicne kola
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Zeleznicne kolaje z pre-signami
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Zeleznicne kolaje z exit-signalmi
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Zeleznicne kolaje z combo-signalmi
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Kolajnice so semaformi pbs

@ -1029,7 +1029,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Fin del
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Activar economía suave (cambios más pequeños)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Permitir comprar acciones de otras empresas
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Cuando arrastre colocar señales cada: {ORANGE}{STRING} casilla(s)
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Permitir colocación automática de señales pbs: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Posición de la barra de herramientas principal: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Izquierda
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centro
@ -1436,7 +1435,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :V
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Vía del tren con pre-señales
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Vía del tren con señales de salida
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Vía del tren con señales combo
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Via del tren con señales pbs

@ -1030,7 +1030,6 @@ STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Bitis t
STR_CONFIG_PATCHES_SMOOTH_ECONOMY :{LTBLUE}Yüzeysel ekonomi (daha çok ve küçük çapta degisiklikler)
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Diger sirketlerin hisseleri alinabilsin
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Sürüklerken her: {ORANGE}{STRING} karede bir sinyal koy
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}pbs sinyallerini otomatik yerlestir: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Ana araç çubugu pozisyonu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Sol
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Orta
@ -1436,7 +1435,6 @@ STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Normal sinyalli
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Ön-sinayalli ray
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Çikis-sinyalli ray
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :ön+çikis-sinyalli ray
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :pbs-sinyalli ray

@ -1004,7 +1004,6 @@ STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}Aizlied
STR_CONFIG_PATCHES_ENDING_DATE :{LTBLUE}Nobeidz spe'li: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Atïauj akciju pirkðanu no citâm kompânijâm
STR_CONFIG_AUTO_PBS_PLACEMENT :{LTBLUE}Atl'aut automatisko novietojumu PBS signa'lus: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Pa kreisi
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Centrâ
STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT :Pa labi
@ -1121,7 +1120,6 @@ STR_080A_ROCKS :Akme
##id 0x1000
STR_1021_RAILROAD_TRACK :Dzelzceïa ceïs
STR_RAILROAD_TRACK_WITH_PBSSIGNALS :Dzelzcel's' ar pbs signa'liem

236
npf.c

@ -47,66 +47,6 @@ static uint NPFDistanceTrack(TileIndex t0, TileIndex t1)
return diagTracks * NPF_TILE_LENGTH + straightTracks * NPF_TILE_LENGTH * STRAIGHT_TRACK_LENGTH;
}
/**
* Check if a rail track is the end of the line. Will also consider 1-way signals to be the end of a line.
* @param tile The tile on which the current track is.
* @param trackdir The (track)direction in which you want to look.
* @param enginetype The type of the engine for which we are checking this.
*/
static bool IsEndOfLine(TileIndex tile, Trackdir trackdir, RailType enginetype)
{
byte exitdir = TrackdirToExitdir(trackdir);
TileIndex dst_tile;
uint32 ts;
/* Can always go into a tunnel */
if (IsTileType(tile, MP_TUNNELBRIDGE) && GB(_m[tile].m5, 4, 4) == 0 &&
GB(_m[tile].m5, 0, 2) == exitdir) {
return false;
}
/* Cannot go through the back of a depot */
if (IsTileDepotType(tile, TRANSPORT_RAIL) && (exitdir != GetDepotDirection(tile, TRANSPORT_RAIL)))
return true;
/* Calculate next tile */
dst_tile = tile + TileOffsByDir(exitdir);
// determine the track status on the next tile.
ts = GetTileTrackStatus(dst_tile, TRANSPORT_RAIL) & TrackdirReachesTrackdirs(trackdir);
// when none of the trackdir bits are set, we cant enter the new tile
if ( (ts & TRACKDIR_BIT_MASK) == 0)
return true;
{
byte dst_type = GetTileRailType(dst_tile, exitdir);
if (!IsCompatibleRail(enginetype, dst_type))
return true;
if (GetTileOwner(tile) != GetTileOwner(dst_tile))
return true;
/* Prevent us from entering a depot from behind */
if (IsTileDepotType(dst_tile, TRANSPORT_RAIL) && (exitdir != ReverseDiagdir(GetDepotDirection(dst_tile, TRANSPORT_RAIL))))
return true;
/* Prevent us from falling off a slope into a tunnel exit */
if (IsTileType(dst_tile, MP_TUNNELBRIDGE) &&
GB(_m[dst_tile].m5, 4, 4) == 0 &&
(DiagDirection)GB(_m[dst_tile].m5, 0, 2) == ReverseDiagdir(exitdir)) {
return true;
}
/* Check for oneway signal against us */
if (IsTileType(dst_tile, MP_RAILWAY) && GetRailTileType(dst_tile) == RAIL_TYPE_SIGNALS) {
if (HasSignalOnTrackdir(dst_tile, ReverseTrackdir(FindFirstBit2x64(ts))) && !HasSignalOnTrackdir(dst_tile, FindFirstBit2x64(ts)))
// if one way signal not pointing towards us, stop going in this direction.
return true;
}
return false;
}
}
#if 0
static uint NTPHash(uint key1, uint key2)
{
@ -164,90 +104,6 @@ static TileIndex CalcClosestStationTile(StationID station, TileIndex tile)
return TileXY(x, y);
}
/* On PBS pathfinding runs, this is called before pathfinding ends (BeforeExit aystar callback), and will
* reserve the appropriate tracks, if needed. */
static void NPFReservePBSPath(AyStar *as)
{
NPFFoundTargetData* ftd = (NPFFoundTargetData*)as->user_path;
bool eol_end = false;
if (ftd->best_trackdir == 0xFF)
return;
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_EXIT) && IsEndOfLine(ftd->node.tile, ftd->node.direction, as->user_data[NPF_RAILTYPE]) && !NPFGetFlag(&ftd->node, NPF_FLAG_SEEN_SIGNAL)) {
/* The path ends in an end of line, we'll need to reserve a path.
* We treat and end of line as a red exit signal */
eol_end = true;
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_EXIT, true);
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_TARGET_SEEN))
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_RED, true);
}
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_CHOICE)) {
/* there have been no choices to make on our path, we dont care if our end signal is red */
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_RED, false);
}
if (NPFGetFlag(&ftd->node, NPF_FLAG_PBS_EXIT) && // we passed an exit signal
!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_BLOCKED) && // we didnt encounter reserver tracks
((as->user_data[NPF_PBS_MODE] != PBS_MODE_GREEN) || (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_RED))) ) { // our mode permits having a red exit signal, or the signal is green
PathNode parent;
PathNode *curr;
PathNode *prev;
TileIndex start = INVALID_TILE;
byte trackdir = 0;
parent.node = ftd->node;
parent.parent = &ftd->path;
curr = &parent;
prev = NULL;
do {
if (!NPFGetFlag(&curr->node, NPF_FLAG_PBS_EXIT) || eol_end) {
/* check for already reserved track on this path, if they clash with what we
currently trying to reserve, we have a self-crossing path :-( */
if ((PBSTileUnavail(curr->node.tile) & (1 << curr->node.direction))
&& !(PBSTileReserved(curr->node.tile) & (1 << (curr->node.direction & 7)))
&& (start != INVALID_TILE)) {
/* It's actually quite bad if this happens, it means the pathfinder
* found a path that is intersecting with itself, which is a very bad
* thing in a pbs block. Also there is not much we can do about it at
* this point....
* BUT, you have to have a pretty fucked up junction layout for this to happen,
* so we'll just stop this train, the user will eventually notice, so he can fix it.
*/
PBSClearPath(start, trackdir, curr->node.tile, curr->node.direction);
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_BLOCKED, true);
DEBUG(pbs, 1) ("PBS: Self-crossing path!!!");
return;
};
PBSReserveTrack(curr->node.tile, TrackdirToTrack(curr->node.direction) );
/* we want to reserve the last tile (with the signal) on the path too
also remember this tile, cause its the end of the path (where we exit the block) */
if (start == INVALID_TILE) {
if (prev != NULL) {
PBSReserveTrack(prev->node.tile, TrackdirToTrack(prev->node.direction) );
start = prev->node.tile;
trackdir = ReverseTrackdir(prev->node.direction);
} else {
start = curr->node.tile;
trackdir = curr->node.direction;
}
}
}
prev = curr;
curr = curr->parent;
} while (curr != NULL);
// we remember the tile/track where this path leaves the pbs junction
ftd->node.tile = start;
ftd->node.direction = trackdir;
}
}
/* Calcs the heuristic to the target station or tile. For train stations, it
* takes into account the direction of approach.
*/
@ -272,21 +128,9 @@ static int32 NPFCalcStationOrTileHeuristic(AyStar* as, AyStarNode* current, Open
DEBUG(npf, 4)("Calculating H for: (%d, %d). Result: %d", TileX(current->tile), TileY(current->tile), dist);
/* for pbs runs, we ignore tiles inside the pbs block for the tracking
of the 'closest' tile */
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE)
&& (!NPFGetFlag(current , NPF_FLAG_SEEN_SIGNAL))
&& (!IsEndOfLine(current->tile, current->direction, as->user_data[NPF_RAILTYPE])))
return dist;
if ((dist < ftd->best_bird_dist) ||
/* for pbs runs, prefer tiles that pass a green exit signal to the pbs blocks */
((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !NPFGetFlag(current, NPF_FLAG_PBS_RED) && NPFGetFlag(&ftd->node, NPF_FLAG_PBS_RED))
) {
if (dist < ftd->best_bird_dist) {
ftd->best_bird_dist = dist;
ftd->best_trackdir = current->user_data[NPF_TRACKDIR_CHOICE];
ftd->path = parent->path;
ftd->node = *current;
}
return dist;
}
@ -485,11 +329,6 @@ static int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
/* Determine extra costs */
/* Check for reserved tracks (PBS) */
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !(NPFGetFlag(current, NPF_FLAG_PBS_EXIT)) && !(NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) && (PBSTileUnavail(tile) & (1<<trackdir))) {
NPFSetFlag(current, NPF_FLAG_PBS_BLOCKED, true);
};
/* Check for signals */
if (IsTileType(tile, MP_RAILWAY) && HasSignalOnTrackdir(tile, trackdir)) {
/* Ordinary track with signals */
@ -506,10 +345,6 @@ static int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
cost += _patches.npf_rail_firstred_exit_penalty;
else
cost += _patches.npf_rail_firstred_penalty;
/* for pbs runs, store the fact that the exit signal to the pbs block was red */
if (!(NPFGetFlag(current, NPF_FLAG_PBS_EXIT)) && !(NPFGetFlag(current, NPF_FLAG_PBS_RED)) && NPFGetFlag(current, NPF_FLAG_PBS_CHOICE))
NPFSetFlag(current, NPF_FLAG_PBS_RED, true);
}
/* Record the state of this signal */
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, true);
@ -517,15 +352,6 @@ static int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
/* Record the state of this signal */
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, false);
}
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL) && NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) {
/* penalise a path through the pbs block if it crosses reserved tracks */
cost += 1000;
}
if ((PBSIsPbsSignal(tile, trackdir)) && !NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) {
/* we've encountered an exit signal to the pbs block */
NPFSetFlag(current, NPF_FLAG_PBS_EXIT, true);
}
NPFSetFlag(current, NPF_FLAG_SEEN_SIGNAL, true);
}
@ -547,25 +373,13 @@ static int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
// curves should be taken into account, as this affects the speed limit.
/* Check for depots */
if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
/* Check for reverse in depot */
if (IsTileDepotType(tile, TRANSPORT_RAIL) && as->EndNodeCheck(as, &new_node) != AYSTAR_FOUND_END_NODE) {
/* Penalise any depot tile that is not the last tile in the path. This
* _should_ penalise every occurence of reversing in a depot (and only
* that) */
if (as->EndNodeCheck(as, &new_node) != AYSTAR_FOUND_END_NODE)
cost += _patches.npf_rail_depot_reverse_penalty;
cost += _patches.npf_rail_depot_reverse_penalty;
/* Do we treat this depot as a pbs signal? */
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) {
if (NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) {
cost += 1000;
}
if (PBSIsPbsSegment(tile, ReverseTrackdir(trackdir))) {
NPFSetFlag(current, NPF_FLAG_PBS_EXIT, true);
NPFSetFlag(current, NPF_FLAG_SEEN_SIGNAL, true);
}
}
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, false);
}
/* Check for occupied track */
@ -600,13 +414,8 @@ static int32 NPFFindStationOrTile(AyStar* as, OpenListNode *current)
* is correct */
if (
(fstd->station_index == -1 && tile == fstd->dest_coords) || /* We've found the tile, or */
(IsTileType(tile, MP_STATION) && _m[tile].m2 == fstd->station_index) || /* the station */
(NPFGetFlag(node, NPF_FLAG_PBS_TARGET_SEEN)) /* or, we've passed it already (for pbs) */
(IsTileType(tile, MP_STATION) && _m[tile].m2 == fstd->station_index) /* the station */
) {
NPFSetFlag(&current->path.node, NPF_FLAG_PBS_TARGET_SEEN, true);
/* for pbs runs, only accept we've found the target if we've also found a way out of the block */
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !NPFGetFlag(node, NPF_FLAG_SEEN_SIGNAL) && !IsEndOfLine(node->tile, node->direction, as->user_data[NPF_RAILTYPE]))
return AYSTAR_DONE;
return AYSTAR_FOUND_END_NODE;
} else {
return AYSTAR_DONE;
@ -624,7 +433,6 @@ static void NPFSaveTargetData(AyStar* as, OpenListNode* current)
ftd->best_path_dist = current->g;
ftd->best_bird_dist = 0;
ftd->node = current->path.node;
ftd->path = current->path;
}
/**
@ -701,8 +509,6 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
aystar->num_neighbours = 0;
DEBUG(npf, 4)("Expanding: (%d, %d, %d) [%d]", TileX(src_tile), TileY(src_tile), src_trackdir, src_tile);
aystar->EndNodeCheck(aystar, current);
/* Find dest tile */
if (IsTileType(src_tile, MP_TUNNELBRIDGE) && GB(_m[src_tile].m5, 4, 4) == 0 &&
(DiagDirection)GB(_m[src_tile].m5, 0, 2) == src_exitdir) {
@ -789,16 +595,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
/* Select only trackdirs we can reach from our current trackdir */
trackdirbits &= TrackdirReachesTrackdirs(src_trackdir);
if (_patches.forbid_90_deg && (type == TRANSPORT_RAIL || type == TRANSPORT_WATER)) /* Filter out trackdirs that would make 90 deg turns for trains */
trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir);
if (KillFirstBit2x64(trackdirbits) != 0)
NPFSetFlag(&current->path.node, NPF_FLAG_PBS_CHOICE, true);
/* When looking for 'any' route, ie when already inside a pbs block, discard all tracks that would cross
other reserved tracks, so we *always* will find a valid route if there is one */
if (!(NPFGetFlag(&current->path.node, NPF_FLAG_PBS_EXIT)) && (aystar->user_data[NPF_PBS_MODE] == PBS_MODE_ANY))
trackdirbits &= ~PBSTileUnavail(dst_tile);
trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir);
DEBUG(npf,6)("After filtering: (%d, %d), possible trackdirs: %#x", TileX(dst_tile), TileY(dst_tile), trackdirbits);
@ -840,7 +637,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
* multiple targets that are spread around, we should perform a breadth first
* search by specifiying CalcZero as our heuristic.
*/
static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, Owner owner, RailType railtype, uint reverse_penalty, byte pbs_mode)
static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, Owner owner, RailType railtype, uint reverse_penalty)
{
int r;
NPFFoundTargetData result;
@ -859,11 +656,6 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start
else
assert(0);
if (pbs_mode != PBS_MODE_NONE)
_npf_aystar.BeforeExit = NPFReservePBSPath;
else
_npf_aystar.BeforeExit = NULL;
/* Initialize Start Node(s) */
start1->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
start1->user_data[NPF_NODE_FLAGS] = 0;
@ -888,7 +680,6 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start
_npf_aystar.user_data[NPF_TYPE] = type;
_npf_aystar.user_data[NPF_OWNER] = owner;
_npf_aystar.user_data[NPF_RAILTYPE] = railtype;
_npf_aystar.user_data[NPF_PBS_MODE] = pbs_mode;
/* GO! */
r = AyStarMain_Main(&_npf_aystar);
@ -906,7 +697,7 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start
return result;
}
NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode)
NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype)
{
AyStarNode start1;
AyStarNode start2;
@ -920,12 +711,12 @@ NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir track
start2.direction = trackdir2;
start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, owner, railtype, 0, pbs_mode);
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, owner, railtype, 0);
}
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode)
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype)
{
return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, 0, target, type, owner, railtype, pbs_mode);
return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, 0, target, type, owner, railtype);
}
NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailType railtype, uint reverse_penalty)
@ -944,7 +735,7 @@ NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir t
/* perform a breadth first search. Target is NULL,
* since we are just looking for any depot...*/
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, owner, railtype, reverse_penalty, PBS_MODE_NONE);
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, owner, railtype, reverse_penalty);
}
NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailType railtype)
@ -997,8 +788,6 @@ NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir,
else
assert(0);
_npf_aystar.BeforeExit = NULL;
/* Initialize target */
target.station_index = -1; /* We will initialize dest_coords inside the loop below */
_npf_aystar.user_target = &target;
@ -1006,7 +795,6 @@ NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir,
/* Initialize user_data */
_npf_aystar.user_data[NPF_TYPE] = type;
_npf_aystar.user_data[NPF_OWNER] = owner;
_npf_aystar.user_data[NPF_PBS_MODE] = PBS_MODE_NONE;
/* Initialize Start Node */
start.tile = tile;

13
npf.h

@ -6,7 +6,6 @@
#include "openttd.h"
#include "aystar.h"
#include "vehicle.h"
#include "pbs.h"
#include "tile.h"
#include "variables.h"
@ -39,7 +38,6 @@ enum { /* Indices into AyStar.userdata[] */
NPF_TYPE = 0, /* Contains a TransportTypes value */
NPF_OWNER, /* Contains an Owner value */
NPF_RAILTYPE, /* Contains the RailType value of the engine when NPF_TYPE == TRANSPORT_RAIL. Unused otherwise. */
NPF_PBS_MODE, /* Contains the pbs mode, see pbs.h */
};
enum { /* Indices into AyStarNode.userdata[] */
@ -51,11 +49,6 @@ typedef enum { /* Flags for AyStarNode.userdata[NPF_NODE_FLAGS]. Use NPFGetBit()
NPF_FLAG_SEEN_SIGNAL, /* Used to mark that a signal was seen on the way, for rail only */
NPF_FLAG_REVERSE, /* Used to mark that this node was reached from the second start node, if applicable */
NPF_FLAG_LAST_SIGNAL_RED, /* Used to mark that the last signal on this path was red */
NPF_FLAG_PBS_EXIT, /* Used to mark tracks inside a pbs block, for rail only, for the end node, this is set when the path found goes through a pbs block */
NPF_FLAG_PBS_BLOCKED, /* Used to mark that this path crosses another pbs path */
NPF_FLAG_PBS_RED, /* Used to mark that this path goes through a red exit-pbs signal */
NPF_FLAG_PBS_CHOICE, /* Used to mark that the train has had a choice on this path */
NPF_FLAG_PBS_TARGET_SEEN, /* Used to mark that a target tile has been passed on this path */
} NPFNodeFlag;
typedef struct NPFFoundTargetData { /* Meant to be stored in AyStar.userpath */
@ -63,7 +56,6 @@ typedef struct NPFFoundTargetData { /* Meant to be stored in AyStar.userpath */
uint best_path_dist; /* The shortest path. Is (uint)-1 if no path is found */
Trackdir best_trackdir; /* The trackdir that leads to the shortest path/closest birds dist */
AyStarNode node; /* The node within the target the search led us to */
PathNode path;
} NPFFoundTargetData;
/* These functions below are _not_ re-entrant, in favor of speed! */
@ -71,12 +63,11 @@ typedef struct NPFFoundTargetData { /* Meant to be stored in AyStar.userpath */
/* Will search from the given tile and direction, for a route to the given
* station for the given transport type. See the declaration of
* NPFFoundTargetData above for the meaning of the result. */
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode);
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype);
/* Will search as above, but with two start nodes, the second being the
* reverse. Look at the NPF_FLAG_REVERSE flag in the result node to see which
* direction was taken (NPFGetBit(result.node, NPF_FLAG_REVERSE)) */
NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode);
NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype);
/* Will search a route to the closest depot. */

@ -1574,7 +1574,7 @@ static bool LoadOldMain(LoadgameState *ls)
for (i = 0; i < OLD_MAP_SIZE; i ++) {
if (IsTileType(i, MP_RAILWAY)) {
/* We save presignals different from TTDPatch, convert them */
if ((_m[i].m5 & 0xC0) == 0x40) {
if (GB(_m[i].m5, 6, 2) == 1) {
/* This byte is always zero in TTD for this type of tile */
if (_m[i].m4) /* Convert the presignals to our own format */
_m[i].m4 = (_m[i].m4 >> 1) & 7;

@ -1249,20 +1249,6 @@ bool AfterLoadGame(void)
FOR_ALL_TOWNS(t) UpdateTownMaxPass(t);
}
/* From version 15.0, we moved a semaphore bit from bit 2 to bit 3 in m4, making
* room for PBS. While doing that, clean some blocks that should be empty, for PBS. */
if (CheckSavegameVersion(15)) {
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
if (IsTileType(tile, MP_RAILWAY) && HasSignals(tile) && HASBIT(_m[tile].m4, 2)) {
CLRBIT(_m[tile].m4, 2);
SETBIT(_m[tile].m4, 3);
}
// Clear possible junk data in PBS bits.
if (IsTileType(tile, MP_RAILWAY) && !HASBIT(_m[tile].m5, 7))
SB(_m[tile].m4, 4, 4, 0);
} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
}
/* From version 16.0, we included autorenew on engines, which are now saved, but
* of course, we do need to initialize them for older savegames. */
if (CheckSavegameVersion(16)) {
@ -1328,6 +1314,37 @@ bool AfterLoadGame(void)
UpdateAllWaypointCustomGraphics();
}
/* From version 15, we moved a semaphore bit from bit 2 to bit 3 in m4, making
* room for PBS. Now in version 21 move it back :P. */
if (CheckSavegameVersion(21) && !CheckSavegameVersion(15)) {
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
if (IsTileType(tile, MP_RAILWAY)) {
// Clear PBS signals, move back sempahore bit to 2
if (HasSignals(tile)) {
// convert PBS signals to combo-signals
if (HASBIT(_m[tile].m4, 2)) SB(_m[tile].m4, 0, 2, 3);
SB(_m[tile].m4, 2, 2, HASBIT(_m[tile].m4, 3));
CLRBIT(_m[tile].m4, 3);
}
// Clear PBS reservation on track
if (!IsTileDepotType(tile, TRANSPORT_RAIL))
SB(_m[tile].m4, 4, 4, 0);
else
CLRBIT(_m[tile].m3, 6);
}
// Clear PBS reservation on crossing
if (IsTileType(tile, MP_STREET) && IsLevelCrossing(tile))
CLRBIT(_m[tile].m5, 0);
// Clear PBS reservation on station
if (IsTileType(tile, MP_STATION) && IsLevelCrossing(tile))
CLRBIT(_m[tile].m3, 6);
} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
}
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
return true;

@ -335,10 +335,6 @@ SOURCE=.\pathfind.c
# End Source File
# Begin Source File
SOURCE=.\pbs.c
# End Source File
# Begin Source File
SOURCE=.\players.c
# End Source File
# Begin Source File
@ -650,10 +646,6 @@ SOURCE=.\pathfind.h
# End Source File
# Begin Source File
SOURCE=.\pbs.h
# End Source File
# Begin Source File
SOURCE=.\player.h
# End Source File
# Begin Source File

@ -296,9 +296,6 @@
<File
RelativePath=".\pathfind.c">
</File>
<File
RelativePath=".\pbs.c">
</File>
<File
RelativePath="players.c">
</File>
@ -510,9 +507,6 @@
<File
RelativePath=".\pathfind.h">
</File>
<File
RelativePath=".\pbs.h">
</File>
<File
RelativePath=".\player.h">
</File>

@ -42,14 +42,13 @@ typedef enum RailTileSubtypes {
} RailTileSubtype;
typedef enum SignalTypes {
/* Stored in m4[0..2] for MP_RAILWAY */
/* Stored in m4[0..1] for MP_RAILWAY */
SIGTYPE_NORMAL = 0, // normal signal
SIGTYPE_ENTRY = 1, // presignal block entry
SIGTYPE_EXIT = 2, // presignal block exit
SIGTYPE_COMBO = 3, // presignal inter-block
SIGTYPE_PBS = 4, // pbs signal
SIGTYPE_END,
SIGTYPE_MASK = 7,
SIGTYPE_MASK = 3,
} SignalType;
typedef enum RailTypes {
@ -62,7 +61,7 @@ typedef enum RailTypes {
} RailType;
enum {
SIG_SEMAPHORE_MASK = 1 << 3,
SIG_SEMAPHORE_MASK = 1 << 2,
};
/** These are used to specify a single track. Can be translated to a trackbit

@ -18,9 +18,7 @@
#include "station.h"
#include "sprite.h"
#include "depot.h"
#include "pbs.h"
#include "waypoint.h"
#include "npf.h"
#include "rail.h"
#include "railtypes.h" // include table for railtypes
@ -474,10 +472,6 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* We remove the trackbit here. */
_m[tile].m5 &= ~trackbit;
/* Unreserve track for PBS */
if (PBSTileReserved(tile) & trackbit)
PBSClearTrack(tile, track);
if (GetTrackBits(tile) == 0) {
/* The tile has no tracks left, it is no longer a rail tile */
DoClearSquare(tile);
@ -766,9 +760,9 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m3 |= SignalOnTrack(track);
} else {
if (pre_signal) {
// cycle between normal -> pre -> exit -> combo -> pbs ->...
// cycle between normal -> pre -> exit -> combo -> ...
byte type = (GetSignalType(tile, track) + 1) % SIGTYPE_END;
SB(_m[tile].m4, 0, 3, type);
SB(_m[tile].m4, 0, 2, type);
} else {
// cycle between two-way -> one-way -> one-way -> ...
/* TODO: Rewrite switch into something more general */
@ -799,9 +793,9 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m3 |= p2 & SignalOnTrack(track);
// convert between signal<->semaphores when dragging
if (semaphore) {
SETBIT(_m[tile].m4, 3);
SETBIT(_m[tile].m4, 2);
} else {
CLRBIT(_m[tile].m4, 3);
CLRBIT(_m[tile].m4, 2);
}
}
@ -938,7 +932,7 @@ int32 CmdRemoveSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (GB(_m[tile].m3, 4, 4) == 0) {
SB(_m[tile].m2, 4, 4, 0);
SB(_m[tile].m5, 6, 2, RAIL_TYPE_NORMAL >> 6); // XXX >> because the constant is meant for direct application, not use with SB
CLRBIT(_m[tile].m4, 3); // remove any possible semaphores
CLRBIT(_m[tile].m4, 2); // remove any possible semaphores
}
SetSignalsOnBothDir(tile, track);
@ -1130,54 +1124,29 @@ static int32 ClearTile_Track(TileIndex tile, byte flags)
#include "table/track_land.h"
// used for presignals
static const SpriteID _signal_base_sprites[32] = {
static const SpriteID _signal_base_sprites[16] = {
0x4FB,
0x1323,
0x1333,
0x1343,
// pbs signals
0x1393,
0x13A3, // not used (yet?)
0x13B3, // not used (yet?)
0x13C3, // not used (yet?)
// semaphores
0x1353,
0x1363,
0x1373,
0x1383,
// pbs semaphores
0x13D3,
0x13E3, // not used (yet?)
0x13F3, // not used (yet?)
0x1403, // not used (yet?)
// mirrored versions
0x4FB,
0x1323,
0x1333,
0x1343,
// pbs signals
0x1393,
0x13A3, // not used (yet?)
0x13B3, // not used (yet?)
0x13C3, // not used (yet?)
// semaphores
0x1446,
0x1456,
0x1466,
0x1476,
// pbs semaphores
0x14C6,
0x14D6, // not used (yet?)
0x14E6, // not used (yet?)
0x14F6, // not used (yet?)
};
// used to determine the side of the road for the signal
@ -1195,7 +1164,7 @@ static void DrawSignalHelper(const TileInfo *ti, byte condition, uint32 image_an
uint v = _signal_position[(image_and_pos & 0xF) + (otherside ? 12 : 0)];
uint x = ti->x | (v&0xF);
uint y = ti->y | (v>>4);
uint sprite = _signal_base_sprites[(_m[ti->tile].m4 & 0xF) + (otherside ? 0x10 : 0)] + (image_and_pos>>4) + ((condition != 0) ? 1 : 0);
uint sprite = _signal_base_sprites[(_m[ti->tile].m4 & 0x7) + (otherside ? 8 : 0)] + (image_and_pos>>4) + ((condition != 0) ? 1 : 0);
AddSortableSpriteToDraw(sprite, x, y, 1, 1, 10, GetSlopeZ(x,y));
}
@ -1387,16 +1356,6 @@ static void DrawTrackBits(TileInfo* ti, TrackBits track, bool earth, bool snow,
if (track & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w);
if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e);
}
if (_debug_pbs_level >= 1) {
byte pbs = PBSTileReserved(ti->tile) & track;
if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
}
}
static void DrawTile_Track(TileInfo *ti)
@ -1526,16 +1485,6 @@ static void DrawTile_Track(TileInfo *ti)
DrawGroundSprite(image);
if (_debug_pbs_level >= 1) {
byte pbs = PBSTileReserved(ti->tile);
if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
}
for (; drss->image != 0; drss++) {
DrawSpecialBuilding(drss->image, type < 4 ? rti->total_offset : 0, ti,
drss->subcoord_x, drss->subcoord_y, 0,
@ -1595,11 +1544,6 @@ typedef struct SetSignalsData {
bool stop;
bool has_presignal;
bool has_pbssignal;
// lowest 2 bits = amount of pbs signals in the block, clamped at 2
// bit 2 = there is a pbs entry signal in this block
// bit 3 = there is a pbs exit signal in this block
// presignal info
int presignal_exits;
int presignal_exits_free;
@ -1608,10 +1552,6 @@ typedef struct SetSignalsData {
byte bit[NUM_SSD_ENTRY];
TileIndex tile[NUM_SSD_ENTRY];
int pbs_cur;
// these are used to keep track of all signals in the block
TileIndex pbs_tile[NUM_SSD_ENTRY];
// these are used to keep track of the stack that modifies presignals recursively
TileIndex next_tile[NUM_SSD_STACK];
byte next_dir[NUM_SSD_STACK];
@ -1631,32 +1571,15 @@ static bool SetSignalsEnumProc(TileIndex tile, SetSignalsData *ssd, int track, u
ssd->cur++;
}
if (PBSIsPbsSignal(tile, ReverseTrackdir(track)))
SETBIT(ssd->has_pbssignal, 2);
// remember if this block has a presignal.
ssd->has_presignal |= (_m[tile].m4&1);
}
if (PBSIsPbsSignal(tile, ReverseTrackdir(track)) || PBSIsPbsSignal(tile, track)) {
byte num = ssd->has_pbssignal & 3;
num = clamp(num + 1, 0, 2);
ssd->has_pbssignal &= ~3;
ssd->has_pbssignal |= num;
}
ssd->pbs_tile[ssd->pbs_cur] = tile; // remember the tile index
ssd->pbs_cur++;
if (HasSignalOnTrackdir(tile, track)) {
if (_m[tile].m4&2) {
// this is an exit signal that points out from the segment
ssd->presignal_exits++;
if (GetSignalState(tile, track) != SIGNAL_STATE_RED)
ssd->presignal_exits_free++;
}
if (PBSIsPbsSignal(tile, track))
SETBIT(ssd->has_pbssignal, 3);
if (HasSignalOnTrackdir(tile, track) && (_m[tile].m4 & 2)) {
// this is an exit signal that points out from the segment
ssd->presignal_exits++;
if (GetSignalState(tile, track) != SIGNAL_STATE_RED)
ssd->presignal_exits_free++;
}
return true;
@ -1791,14 +1714,6 @@ static void ChangeSignalStates(SetSignalsData *ssd)
// there is at least one green exit signal OR
// there are no exit signals in the segment
// convert the block to pbs, if needed
if (_patches.auto_pbs_placement && !(ssd->stop) && (ssd->has_pbssignal == 0xE) && !ssd->has_presignal && (ssd->presignal_exits == 0)) // 0xE means at least 2 pbs signals, and at least 1 entry and 1 exit, see comments ssd->has_pbssignal
for (i = 0; i != ssd->pbs_cur; i++) {
TileIndex tile = ssd->pbs_tile[i];
SB(_m[tile].m4, 0, 3, SIGTYPE_PBS);
MarkTileDirtyByTile(tile);
};
// then mark the signals in the segment accordingly
for (i = 0; i != ssd->cur; i++) {
TileIndex tile = ssd->tile[i];
@ -1859,9 +1774,8 @@ bool UpdateSignalsOnSegment(TileIndex tile, byte direction)
for(;;) {
// go through one segment and update all signals pointing into that segment.
ssd.cur = ssd.pbs_cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
ssd.cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
ssd.has_presignal = false;
ssd.has_pbssignal = false;
FollowTrack(tile, 0xC000 | TRANSPORT_RAIL, direction, (TPFEnumProc*)SetSignalsEnumProc, SetSignalsAfterProc, &ssd);
ChangeSignalStates(&ssd);
@ -2126,16 +2040,14 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc *td)
break;
case RAIL_TYPE_SIGNALS: {
const StringID signal_type[7] = {
const StringID signal_type[] = {
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_PBSSIGNALS,
STR_NULL, STR_NULL
STR_RAILROAD_TRACK_WITH_COMBOSIGNALS
};
td->str = signal_type[GB(_m[tile].m4, 0, 3)];
td->str = signal_type[GB(_m[tile].m4, 0, 2)];
break;
}
@ -2199,8 +2111,6 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
} else if (_fractcoords_enter[dir] == fract_coord) {
if (_enter_directions[dir] == v->direction) {
/* enter the depot */
if (v->next == NULL)
PBSClearTrack(v->tile, FIND_FIRST_BIT(v->u.rail.track));
v->u.rail.track = 0x80,
v->vehstatus |= VS_HIDDEN; /* hide it */
v->direction ^= 4;

@ -15,8 +15,6 @@
#include "gfx.h"
#include "sound.h"
#include "depot.h"
#include "pbs.h"
#include "debug.h"
/* When true, GetTrackStatus for roads will treat roads under reconstruction
* as normal roads instead of impassable. This is used when detecting whether
@ -251,7 +249,6 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
cost = _price.remove_road * 2;
if (flags & DC_EXEC) {
byte pbs_track = PBSTileReserved(tile);
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
ModifyTile(tile,
@ -260,8 +257,6 @@ int32 CmdRemoveRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m4 & 0xF, /* map3_lo */
c /* map5 */
);
if (pbs_track != 0)
PBSReserveTrack(tile, FIND_FIRST_BIT(pbs_track));
}
return cost;
} else
@ -404,7 +399,6 @@ int32 CmdBuildRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
goto do_clear;
if (flags & DC_EXEC) {
byte pbs_track = PBSTileReserved(tile);
ModifyTile(tile,
MP_SETTYPE(MP_STREET) |
MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5,
@ -413,8 +407,6 @@ int32 CmdBuildRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m3 & 0xF, /* map3_hi */
m5 /* map5 */
);
if (pbs_track != 0)
PBSReserveTrack(tile, FIND_FIRST_BIT(pbs_track));
}
return _price.build_road * 2;
} else if (ti.type == MP_TUNNELBRIDGE) {
@ -854,17 +846,6 @@ static void DrawTile_Road(TileInfo *ti)
}
DrawGroundSprite(image);
if (_debug_pbs_level >= 1) {
byte pbs = PBSTileReserved(ti->tile);
if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(0x3ED | PALETTE_CRASH);
if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(0x3EE | PALETTE_CRASH);
if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(0x3EF | PALETTE_CRASH);
if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(0x3F0 | PALETTE_CRASH);
if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(0x3F2 | PALETTE_CRASH);
if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(0x3F1 | PALETTE_CRASH);
}
} else {
uint32 ormod;
PlayerID player;

@ -1062,7 +1062,7 @@ static int RoadFindPathToDest(Vehicle *v, TileIndex tile, int enterdir)
trackdir = DiagdirToDiagTrackdir(enterdir);
//debug("Finding path. Enterdir: %d, Trackdir: %d", enterdir, trackdir);
ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE, PBS_MODE_NONE);
ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE);
if (ftd.best_trackdir == 0xff) {
/* We are already at our target. Just do something */
//TODO: maybe display error?
@ -1140,7 +1140,7 @@ static uint RoadFindPathToStation(const Vehicle *v, TileIndex tile)
fstd.dest_coords = tile;
fstd.station_index = -1; // indicates that the destination is a tile, not a station
return NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE, PBS_MODE_NONE).best_path_dist;
return NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE).best_path_dist;
}
#endif

@ -29,7 +29,7 @@
#include <setjmp.h>
enum {
SAVEGAME_VERSION = 20,
SAVEGAME_VERSION = 21,
};

@ -868,7 +868,6 @@ static const SettingDesc patch_player_settings[] = {
// Non-static, needed in network_server.c
const SettingDesc patch_settings[] = {
{"build_on_slopes", SDT_BOOL, (void*)true, &_patches.build_on_slopes, NULL},
{"auto_pbs_placement", SDT_BOOL, (void*)true, &_patches.auto_pbs_placement, NULL},
{"mammoth_trains", SDT_BOOL, (void*)true, &_patches.mammoth_trains, NULL},
{"join_stations", SDT_BOOL, (void*)true, &_patches.join_stations, NULL},
{"station_spread", SDT_UINT8, (void*)12, &_patches.station_spread, NULL},

@ -701,7 +701,6 @@ static const PatchEntry _patches_construction[] = {
{PE_BOOL, 0, STR_CONFIG_PATCHES_SMALL_AIRPORTS, "always_small_airport", &_patches.always_small_airport, 0, 0, 0, NULL},
{PE_UINT8, PF_PLAYERBASED, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY, "drag_signals_density", &_patches.drag_signals_density, 1, 20, 1, NULL},
{PE_BOOL, 0, STR_CONFIG_AUTO_PBS_PLACEMENT, "auto_pbs_placement", &_patches.auto_pbs_placement, 1, 20, 1, NULL},
};
static const PatchEntry _patches_vehicles[] = {

@ -543,7 +543,7 @@ static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks
NPFFillWithOrderData(&fstd, v);
ftd = NPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE, PBS_MODE_NONE);
ftd = NPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE);
if (ftd.best_trackdir != 0xff) {
/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains

@ -25,7 +25,6 @@
#include "airport.h"
#include "sprite.h"
#include "depot.h"
#include "pbs.h"
#include "train.h"
enum {
@ -2072,16 +2071,6 @@ static void DrawTile_Station(TileInfo *ti)
// but this is something else. If AI builds station with 114 it looks all weird
DrawGroundSprite(image);
if (_debug_pbs_level >= 1) {
byte pbs = PBSTileReserved(ti->tile);
if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
}
foreach_draw_tile_seq(dtss, t->seq) {
image = dtss->image + relocation;
image += offset;

@ -19,7 +19,6 @@
#include "player.h"
#include "sound.h"
#include "depot.h"
#include "debug.h"
#include "waypoint.h"
#include "vehicle_gui.h"
#include "train.h"
@ -1552,81 +1551,10 @@ static void AdvanceWagons(Vehicle *v, bool before)
}
}
static TileIndex GetVehicleTileOutOfTunnel(const Vehicle* v, bool reverse)
{
TileIndex tile;
byte direction = (!reverse) ? DirToDiagdir(v->direction) : ReverseDiagdir(v->direction >> 1);
TileIndexDiff delta = TileOffsByDir(direction);
if (v->u.rail.track != 0x40) return v->tile;
for (tile = v->tile;; tile += delta) {
if (IsTunnelTile(tile) && GB(_m[tile].m5, 0, 2) != direction && GetTileZ(tile) == v->z_pos)
break;
}
return tile;
}
static void ReverseTrainDirection(Vehicle *v)
{
int l = 0, r = -1;
Vehicle *u;
TileIndex tile;
Trackdir trackdir;
TileIndex pbs_end_tile = v->u.rail.pbs_end_tile; // these may be changed, and we may need
Trackdir pbs_end_trackdir = v->u.rail.pbs_end_trackdir; // the old values, so cache them
u = GetLastVehicleInChain(v);
tile = GetVehicleTileOutOfTunnel(u, false);
trackdir = ReverseTrackdir(GetVehicleTrackdir(u));
if (PBSTileReserved(tile) & (1 << TrackdirToTrack(trackdir))) {
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
NPFFillWithOrderData(&fstd, v);
tile = GetVehicleTileOutOfTunnel(u, true);
DEBUG(pbs, 2) ("pbs: (%i) choose reverse (RV), tile:%x, trackdir:%i",v->unitnumber, u->tile, trackdir);
ftd = NPFRouteToStationOrTile(tile, trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_ANY);
if (ftd.best_trackdir == 0xFF) {
DEBUG(pbs, 0) ("pbs: (%i) no nodes encountered (RV)", v->unitnumber);
CLRBIT(v->u.rail.flags, VRF_REVERSING);
return;
}
// we found a way out of the pbs block
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED)) {
CLRBIT(v->u.rail.flags, VRF_REVERSING);
return;
}
}
v->u.rail.pbs_end_tile = ftd.node.tile;
v->u.rail.pbs_end_trackdir = ftd.node.direction;
}
tile = GetVehicleTileOutOfTunnel(v, false);
trackdir = GetVehicleTrackdir(v);
if (v->u.rail.pbs_status == PBS_STAT_HAS_PATH) {
TileIndex tile = AddTileIndexDiffCWrap(v->tile, TileIndexDiffCByDir(TrackdirToExitdir(trackdir)));
uint32 ts;
assert(tile != INVALID_TILE);
ts = GetTileTrackStatus(tile, TRANSPORT_RAIL);
ts &= TrackdirReachesTrackdirs(trackdir);
assert(ts != 0 && KillFirstBit2x64(ts) == 0);
trackdir = FindFirstBit2x64(ts);
PBSClearPath(tile, trackdir, pbs_end_tile, pbs_end_trackdir);
v->u.rail.pbs_status = PBS_STAT_NONE;
} else if (PBSTileReserved(tile) & (1 << TrackdirToTrack(trackdir))) {
PBSClearPath(tile, trackdir, pbs_end_tile, pbs_end_trackdir);
if (v->u.rail.track != 0x40)
PBSReserveTrack(tile, trackdir & 7);
};
if (IsTileDepotType(v->tile, TRANSPORT_RAIL))
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@ -2040,8 +1968,6 @@ static bool CheckTrainStayInDepot(Vehicle *v)
}
if (v->u.rail.force_proceed == 0) {
Trackdir trackdir = GetVehicleTrackdir(v);
if (++v->load_unload_time_rem < 37) {
InvalidateWindowClasses(WC_TRAINS_LIST);
return true;
@ -2049,35 +1975,12 @@ static bool CheckTrainStayInDepot(Vehicle *v)
v->load_unload_time_rem = 0;
if (PBSIsPbsSegment(v->tile, trackdir)) {
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
if (PBSTileUnavail(v->tile) & (1 << trackdir)) return true;
NPFFillWithOrderData(&fstd, v);
DEBUG(pbs, 2) ("pbs: (%i) choose depot (DP), tile:%x, trackdir:%i",v->unitnumber, v->tile, trackdir);
ftd = NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_GREEN);
// we found a way out of the pbs block
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED) || NPFGetFlag(&ftd.node, NPF_FLAG_PBS_RED)) {
return true;
} else {
v->u.rail.pbs_end_tile = ftd.node.tile;
v->u.rail.pbs_end_trackdir = ftd.node.direction;
goto green;
}
}
}
if (UpdateSignalsOnSegment(v->tile, v->direction)) {
InvalidateWindowClasses(WC_TRAINS_LIST);
return true;
}
}
green:
VehicleServiceInDepot(v);
InvalidateWindowClasses(WC_TRAINS_LIST);
TrainPlayLeaveStationSound(v);
@ -2215,29 +2118,13 @@ static byte ChooseTrainTrack(Vehicle *v, TileIndex tile, int enterdir, TrackdirB
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
Trackdir trackdir;
uint16 pbs_tracks;
NPFFillWithOrderData(&fstd, v);
/* The enterdir for the new tile, is the exitdir for the old tile */
trackdir = GetVehicleTrackdir(v);
assert(trackdir != 0xff);
pbs_tracks = PBSTileReserved(tile);
pbs_tracks |= pbs_tracks << 8;
pbs_tracks &= TrackdirReachesTrackdirs(trackdir);
if (pbs_tracks || (v->u.rail.pbs_status == PBS_STAT_NEED_PATH)) {
DEBUG(pbs, 2) ("pbs: (%i) choosefromblock, tile_org:%x tile_dst:%x trackdir:%i pbs_tracks:%i",v->unitnumber, tile,tile - TileOffsByDir(enterdir), trackdir, pbs_tracks);
// clear the currently planned path
if (v->u.rail.pbs_status != PBS_STAT_NEED_PATH) PBSClearPath(tile, FindFirstBit2x64(pbs_tracks), v->u.rail.pbs_end_tile, v->u.rail.pbs_end_trackdir);
// try to find a route to a green exit signal
ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_ANY);
v->u.rail.pbs_end_tile = ftd.node.tile;
v->u.rail.pbs_end_trackdir = ftd.node.direction;
} else
ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_NONE);
ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype);
if (ftd.best_trackdir == 0xff) {
/* We are already at our target. Just do something */
@ -2317,8 +2204,7 @@ static bool CheckReverseTrain(Vehicle *v)
assert(trackdir != 0xff);
assert(trackdir_rev != 0xff);
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, last->tile, trackdir_rev, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_NONE);
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, last->tile, trackdir_rev, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype);
if (ftd.best_bird_dist != 0) {
/* We didn't find anything, just keep on going straight ahead */
reverse_best = false;
@ -2906,7 +2792,7 @@ static void TrainController(Vehicle *v)
} else {
/* is not inside depot */
if ((prev == NULL) && (!TrainCheckIfLineEnds(v)))
if (!TrainCheckIfLineEnds(v))
return;
r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
@ -2961,56 +2847,11 @@ static void TrainController(Vehicle *v)
}
if (prev == NULL) {
byte trackdir;
/* Currently the locomotive is active. Determine which one of the
* available tracks to choose */
chosen_track = 1 << ChooseTrainTrack(v, gp.new_tile, enterdir, bits);
assert(chosen_track & tracks);
trackdir = TrackEnterdirToTrackdir(FIND_FIRST_BIT(chosen_track), enterdir);
assert(trackdir != 0xff);
if (PBSIsPbsSignal(gp.new_tile,trackdir) && PBSIsPbsSegment(gp.new_tile,trackdir)) {
// encountered a pbs signal, and possible a pbs block
DEBUG(pbs, 3) ("pbs: (%i) arrive AT signal, tile:%x pbs_stat:%i",v->unitnumber, gp.new_tile, v->u.rail.pbs_status);
if (v->u.rail.pbs_status == PBS_STAT_NONE) {
// we havent planned a path already, so try to find one now
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
NPFFillWithOrderData(&fstd, v);
DEBUG(pbs, 2) ("pbs: (%i) choose signal (TC), tile:%x, trackdir:%i",v->unitnumber, gp.new_tile, trackdir);
ftd = NPFRouteToStationOrTile(gp.new_tile, trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_GREEN);
if (v->u.rail.force_proceed != 0)
goto green_light;
if (ftd.best_trackdir == 0xFF)
goto red_light;
// we found a way out of the pbs block
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED) || NPFGetFlag(&ftd.node, NPF_FLAG_PBS_RED))
goto red_light;
else {
v->u.rail.pbs_end_tile = ftd.node.tile;
v->u.rail.pbs_end_trackdir = ftd.node.direction;
goto green_light;
}
};
} else {
// we have already planned a path through this pbs block
// on entering the block, we reset our status
v->u.rail.pbs_status = PBS_STAT_NONE;
goto green_light;
};
DEBUG(pbs, 3) ("pbs: (%i) no green light found, or was no pbs-block",v->unitnumber);
};
/* Check if it's a red signal and that force proceed is not clicked. */
if ( (tracks>>16)&chosen_track && v->u.rail.force_proceed == 0) goto red_light;
} else {
@ -3019,9 +2860,6 @@ static void TrainController(Vehicle *v)
/* The wagon is active, simply follow the prev vehicle. */
chosen_track = (byte)(_matching_tracks[GetDirectionToVehicle(prev, gp.x, gp.y)] & bits);
}
green_light:
if (v->next == NULL)
PBSClearTrack(gp.old_tile, FIND_FIRST_BIT(v->u.rail.track));
/* make sure chosen track is a valid track */
assert(chosen_track==1 || chosen_track==2 || chosen_track==4 || chosen_track==8 || chosen_track==16 || chosen_track==32);
@ -3050,12 +2888,12 @@ green_light:
}
if (IsFrontEngine(v))
TrainMovedChangeSignals(gp.new_tile, enterdir);
TrainMovedChangeSignals(gp.new_tile, enterdir);
/* Signals can only change when the first
* (above) or the last vehicle moves. */
if (v->next == NULL)
TrainMovedChangeSignals(gp.old_tile, (enterdir) ^ 2);
TrainMovedChangeSignals(gp.old_tile, (enterdir) ^ 2);
if (prev == NULL) {
AffectSpeedByDirChange(v, chosen_dir);
@ -3164,17 +3002,6 @@ static void DeleteLastWagon(Vehicle *v)
EndVehicleMove(v);
DeleteVehicle(v);
// clear up reserved pbs tracks
if (PBSTileReserved(v->tile) & v->u.rail.track) {
if (v == u) {
PBSClearPath(v->tile, FIND_FIRST_BIT(v->u.rail.track), v->u.rail.pbs_end_tile, v->u.rail.pbs_end_trackdir);
PBSClearPath(v->tile, FIND_FIRST_BIT(v->u.rail.track) + 8, v->u.rail.pbs_end_tile, v->u.rail.pbs_end_trackdir);
};
if (v->tile != u->tile) {
PBSClearTrack(v->tile, FIND_FIRST_BIT(v->u.rail.track));
};
}
if (!(v->u.rail.track & 0xC0))
SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(v->u.rail.track));
@ -3302,7 +3129,6 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
uint16 break_speed;
DiagDirection t;
uint32 ts;
byte trackdir;
t = v->breakdown_ctr;
if (t > 1) {
@ -3339,12 +3165,6 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
// determine the track status on the next tile.
ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[t];
// if there are tracks on the new tile, pick one (trackdir will only be used when its a signal tile, in which case only 1 trackdir is accessible for us)
if (ts & TRACKDIR_BIT_MASK)
trackdir = FindFirstBit2x64(ts & TRACKDIR_BIT_MASK);
else
trackdir = INVALID_TRACKDIR;
/* Calc position within the current tile ?? */
x = v->x_pos & 0xF;
y = v->y_pos & 0xF;
@ -3400,28 +3220,6 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
return false;
}
if (v->u.rail.pbs_status == PBS_STAT_HAS_PATH)
return true;
if ((trackdir != INVALID_TRACKDIR) && (PBSIsPbsSignal(tile,trackdir) && PBSIsPbsSegment(tile,trackdir)) && !(IsTileType(v->tile, MP_STATION) && (v->current_order.station == _m[v->tile].m2))) {
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
NPFFillWithOrderData(&fstd, v);
DEBUG(pbs, 2) ("pbs: (%i) choose signal (CEOL), tile:%x trackdir:%i", v->unitnumber, tile, trackdir);
ftd = NPFRouteToStationOrTile(tile, trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.railtype, PBS_MODE_GREEN);
if (ftd.best_trackdir != 0xFF && NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
if (!(NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED) || NPFGetFlag(&ftd.node, NPF_FLAG_PBS_RED))) {
v->u.rail.pbs_status = PBS_STAT_HAS_PATH;
v->u.rail.pbs_end_tile = ftd.node.tile;
v->u.rail.pbs_end_trackdir = ftd.node.direction;
return true;
}
};
};
// slow down
v->vehstatus |= VS_TRAIN_SLOWING;
break_speed = _breakdown_speeds[x & 0xF];
@ -3578,8 +3376,6 @@ static void CheckIfTrainNeedsService(Vehicle *v)
const Depot* depot;
TrainFindDepotData tfdd;
if (PBSTileReserved(v->tile) & v->u.rail.track) return;
if (v->u.rail.pbs_status == PBS_STAT_HAS_PATH) return;
if (_patches.servint_trains == 0) return;
if (!VehicleNeedsService(v)) return;
if (v->vehstatus & VS_STOPPED) return;

@ -18,8 +18,6 @@
#include "player.h"
#include "town.h"
#include "sound.h"
#include "pbs.h"
#include "debug.h"
#include "variables.h"
#include "bridge.h"
#include "train.h"
@ -204,7 +202,6 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
uint i;
int32 cost, terraformcost, ret;
bool allow_on_slopes;
bool reserved = false;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@ -352,7 +349,6 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (ti.map5 != 1) goto not_valid_below;
}
m5 = 0xE0;
reserved = PBSTileReserved(ti.tile) != 0;
} else if (ti.type == MP_STREET) {
if (direction == 0) {
if (ti.map5 != 5) goto not_valid_below;
@ -402,16 +398,6 @@ not_valid_below:;
_m[ti.tile].m2 = (bridge_type << 4) | m5;
SB(_m[ti.tile].m3, 4, 4, railtype);
if (ti.type == MP_RAILWAY) {
// Set or clear PBS reservation status. direction here is of
// the bridge, not the track below.
if (reserved) {
PBSReserveTrack(ti.tile, direction ? TRACK_DIAG1 : TRACK_DIAG2);
} else {
PBSClearTrack(ti.tile, direction ? TRACK_DIAG1 : TRACK_DIAG2);
}
}
MarkTileDirtyByTile(ti.tile);
}
}
@ -807,7 +793,6 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
byte m5;
uint c = tile;
uint16 new_data;
byte pbs;
//checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
// you have a "Poor" (0) town rating
@ -816,7 +801,6 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
do {
m5 = _m[c].m5;
pbs = PBSTileReserved(c);
if (m5 & 0x40) {
if (m5 & 0x20) {
@ -831,8 +815,6 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
_m[c].m5 = (byte)new_data;
_m[c].m2 = 0;
_m[c].m4 &= 0x0F;
if (direction ? HASBIT(pbs,0) : HASBIT(pbs,1))
PBSReserveTrack(c, direction ? 0 : 1);
MarkTileDirtyByTile(c);
@ -1212,16 +1194,6 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
}
}
}
if (_debug_pbs_level >= 1) {
byte pbs = PBSTileReserved(ti->tile);
if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(0x3ED | PALETTE_CRASH);
if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(0x3EE | PALETTE_CRASH);
if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(0x3EF | PALETTE_CRASH);
if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(0x3F0 | PALETTE_CRASH);
if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(0x3F2 | PALETTE_CRASH);
if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(0x3F1 | PALETTE_CRASH);
}
}
static uint GetSlopeZ_TunnelBridge(const TileInfo* ti)
@ -1504,8 +1476,6 @@ static uint32 VehicleEnter_TunnelBridge(Vehicle *v, TileIndex tile, int x, int y
return 0;
}
if (fc == _tunnel_fractcoord_2[dir]) {
if (v->next == NULL)
PBSClearTrack(v->tile, FIND_FIRST_BIT(v->u.rail.track));
v->tile = tile;
v->u.rail.track = 0x40;
v->vehstatus |= VS_HIDDEN;

@ -87,7 +87,6 @@ typedef struct Patches {
bool modified_catchment; //different-size catchment areas
bool vehicle_speed; // show vehicle speed
bool build_on_slopes; // allow building on slopes
bool auto_pbs_placement;// automatic pbs signal placement
bool mammoth_trains; // allow very long trains
bool join_stations; // allow joining of train stations
bool full_load_any; // new full load calculation, any cargo must be full

@ -2122,11 +2122,8 @@ static const SaveLoad _train_desc[] = {
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,flags), SLE_UINT8, 2, 255),
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,days_since_order_progr), SLE_UINT16, 2, 255),
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,pbs_status), SLE_UINT8, 2, 255),
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,pbs_end_tile), SLE_UINT32, 2, 255),
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleRail,pbs_end_trackdir), SLE_UINT8, 2, 255),
SLE_CONDARR(NullStruct, null, SLE_FILE_U8 | SLE_VAR_NULL, 2, 2, 255),
// reserve extra space in savegame here. (currently 8 bytes)
SLE_CONDARR(NullStruct, null, SLE_FILE_U8 | SLE_VAR_NULL, 8, 2, 255),
SLE_CONDREFX(offsetof(Vehicle,u)+offsetof(VehicleRail,other_multiheaded_part), REF_VEHICLE, 2, 19), // added with 17.1, but was blank since 2. Removed in 20
// reserve extra space in savegame here. (currently 3 bytes)

@ -74,10 +74,6 @@ typedef struct VehicleRail {
byte flags;
byte pbs_status;
TileIndex pbs_end_tile;
Trackdir pbs_end_trackdir;
// Link between the two ends of a multiheaded engine
Vehicle *other_multiheaded_part;
} VehicleRail;

@ -14,7 +14,6 @@
#include "town.h"
#include "waypoint.h"
#include "variables.h"
#include "pbs.h"
#include "table/sprites.h"
#include "table/strings.h"
@ -209,7 +208,6 @@ int32 CmdBuildTrainWaypoint(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) {
const StationSpec *spec = NULL;
bool reserved = PBSTileReserved(tile) != 0;
ModifyTile(tile, MP_MAP2 | MP_MAP5, wp->index, RAIL_TYPE_WAYPOINT | dir);
if (GB(p1, 0, 8) < GetNumCustomStations(STAT_CLASS_WAYP))
@ -228,12 +226,6 @@ int32 CmdBuildTrainWaypoint(int x, int y, uint32 flags, uint32 p1, uint32 p2)
wp->localidx = 0;
}
if (reserved) {
PBSReserveTrack(tile, dir);
} else {
PBSClearTrack(tile, dir);
}
wp->deleted = 0;
wp->xy = tile;
wp->build_date = _date;
@ -302,15 +294,9 @@ int32 RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove)
RedrawWaypointSign(wp);
if (justremove) {
bool reserved = PBSTileReserved(tile) != 0;
ModifyTile(tile, MP_MAP2_CLEAR | MP_MAP5, 1<<direction);
CLRBIT(_m[tile].m3, 4);
_m[tile].m4 = 0;
if (reserved) {
PBSReserveTrack(tile, direction);
} else {
PBSClearTrack(tile, direction);
}
} else {
DoClearSquare(tile);
SetSignalsOnBothDir(tile, direction);

Loading…
Cancel
Save