TT-MS Headquarters
Abnutzung der Gleise - Druckversion

+- TT-MS Headquarters (https://www.tt-ms.de/forum)
+-- Forum: Allgemeines rund um Transport Tycoon (/forumdisplay.php?fid=71)
+--- Forum: Wunschliste und Ideen (/forumdisplay.php?fid=8)
+--- Thema: Abnutzung der Gleise (/showthread.php?tid=1068)



Abnutzung der Gleise - Locke - 01.04.2005 17:40

Wie wäre es, wenn man die Gleise warten muss.

Oder dass z.B. Gleise die nicht mehr genutzt werden nach ein paar Jahren mit Grünzeug bewachsen sind.
Und wenn man diese Gleise dann doch braucht, muss man sie erst wieder auf Fordermann bringen.

Außerdem wäre es doch schick, wenn man Unterschiede bei den Schnellzugstrecken, Bhf.'s etc sieht.
(z.B.: So wie bei Simutrans)


- Puffer_MBO - 01.04.2005 18:00

Nicht übel die Idee.

Kann ja nur von jemanden aus meiner Nachbarschaft kommen Zwinkern

Das müsste denn aber auch den Strassen betreffen, wie in unserem Nachbardorf Berlin Zwinkern

Je kaputter die Strassen/ verrottener die Schienen, destso langsammer kann man fahren und destso häufiger muss das Fahrzeug zur Wartung.


- RK - 01.04.2005 18:25

LOL?

Eine wirklich tolle Idee, allerdings müsste man auch die Züge intelligenter machen, damit die nicht die kürzeste sondern die Beste Route nehmen. (I hate waypoints)


- Bernhard - 01.04.2005 18:38

hat es schon mal gegeben. für OTTD. ist leider gestorben konnte man schön sehen wenn Gleise unnötig waren.


- bugfix - 01.04.2005 19:51

Zitat:hat es schon mal gegeben. für OTTD. ist leider gestorben konnte man schön sehen wenn Gleise unnötig waren.


und jetzt gibts des nicht mehr?
man könnte des doch als Zusatz einbauen. Also anschaltbar und abschaltbar.


- Bernhard - 01.04.2005 20:57

hat wohl den Devs nicht gefallen. Rusty Tracks hieß das ganze. Rostige Schienen


- Supernova - 10.04.2005 06:55

Gute Idee. Wie wäre es mit verschiedenen Gleisvarianten?

Gleis auf Holzschwellen
Gleis auf Stahlschwellen
Gleis auf Betonschwellen (erst ab einem bestimmten Jahr erhältlich)

Je nach Schwellenart, sind bestimmte Geschwindigkeiten möglich und unterschiedlich Abnutzungen bemerkbar.
Z.B. Ein ICE kann daher nur mit einer bestimmten Geschwindigkeit fahren, wenn er auf eine Strecke mit Holzschwellen fährt. Oder, ist ein Gleisstück oder Bereich abgenutzt sind nur bestimmte Geschwindigkeiten möglich oder schlimmstenfalls Entgleisungen der Züge treten auf.

Natürlich sollten die Kosten bei Kauf je nach Art unterschiedlich sein. Die Darstellung wäre sicherlich schwer darzustellen?

Auch bei den Brücken sollten die Abnutzungen bemerkbar werden, z.B. die Farbe der Brücke wird in Rost dargestellt. Oder man muß Brücken nach bestimmten Jahren austauschen z.B. erneuern.

Bei der Abnutzung der Schienen bzw. Brücken sind Arbeitsfahrzeuge erforderlich um diese wieder auf Vordermann zu bringen. Für die Arbeitsfahrzeuge müssen nur die Routen festgelegt werden, damit diese die Strecken abfahren. Somit hätten die Arbeitsfahrzeuge eine Aufgabe.


- Roter Baron - 25.06.2005 19:40

Das hört sich ja echt klasse an!
Wäre ne tolle Idee.
Wie ist das hier eigentlich?
Also solche Sachen zu zeichnen, da würd ich mich dran setzen. Ich kann kann nur nicht programmieren, etc. .


- killking - 25.06.2005 21:37

Zitat:Also solche Sachen zu zeichnen, da würd ich mich dran setzen. Ich kann kann nur nicht programmieren, etc. .
Solche Leute wie dich können wir immer gebrauchen!
Zeichne doch mal was du kannst und Uploade das mal, zur Bewertung.
Ein paar Programmierer werden sich schon finden (Bernhard großes Grinsen )


- RK - 25.06.2005 21:52

Das wird definitiv nicht in naher Zukunft implementiert und das Bernhard programmieren kann ist mir neu. ?(


- killking - 25.06.2005 23:23

Zitat:Original von RK
Das wird definitiv nicht in naher Zukunft implementiert und das Bernhard programmieren kann ist mir neu. ?(
1. Schade!

zu Bernhard:
Hmm aber er hat doch mal gesagt das er Coden kann.ich dachte das wär das gleiche. ?(

Zitat:Orginal von Bernhard
[.]Und wenn Du mit zeichen Fertig bist machen wir das coden zusammen
Hab ich aus DIESEM Threat.


- RK - 26.06.2005 09:53

Mit coden bezeichnet man hier das editieren der *.nfo Datei um die *.grf zum laufen zu bringen. Dabei kannst du aber nur das coden, was Patchman schon im Patch programmiert hat. Eine Action "1F" für abgenutze Gleis-Grafiken gibt es z.B. noch nicht.


- killking - 26.06.2005 12:56

Zitat:Original von RK
Mit coden bezeichnet man hier das editieren der *.nfo Datei um die *.grf zum laufen zu bringen. Dabei kannst du aber nur das coden, was Patchman schon im Patch programmiert hat. Eine Action "1F" für abgenutze Gleis-Grafiken gibt es z.B. noch nicht.
Ok, damit hab ich mich jetzt als totalen Programmiertrottel ausgezeichnet. 8)
Danke für die Klarstellung, wieder was gelernt!


- jkl - 21.02.2006 18:13

kann mir mal einer den Link fuer den rusty tracks code geben?

Ich moecte mir das mal ansehen wenns in C geschrieben wurde!

In welcher open TTD version hatten sie es mal drin?


- Bernhard - 21.02.2006 20:10

hier ist der Thread. Bei mir ist es allerdings nie gelaufen .

http://www.tt-forums.net/viewtopic.php?t=9293

und hier die Diff großes Grinsen http://www.tt-forums.net//files/usedtracksv1.diff

Code:
Index: OpenTTD_UsedTracks/ttd.h
===================================================================
--- OpenTTD_UsedTracks/ttd.h    (revision 71)
+++ OpenTTD_UsedTracks/ttd.h    (working copy)
@@ -472,7 +472,8 @@
enum Sprites {
    SPR_CANALS_BASE = 0x1406,
    SPR_SLOPES_BASE = SPR_CANALS_BASE + 70,
-    SPR_OPENTTD_BASE = SPR_SLOPES_BASE + 74,
+    SPR_OPENTTD_BASE = SPR_SLOPES_BASE + 74,
+    SPR_USED_TRACKS_BASE = SPR_OPENTTD_BASE + 75,
};

enum MAP_OWNERS {
Index: OpenTTD_UsedTracks/variables.h
===================================================================
--- OpenTTD_UsedTracks/variables.h    (revision 71)
+++ OpenTTD_UsedTracks/variables.h    (working copy)
@@ -397,7 +397,9 @@
extern byte _map3_hi[TILES_X * TILES_Y];
extern byte _map_owner[TILES_X * TILES_Y];
extern byte _map2[TILES_X * TILES_Y];
-extern byte _map_extra_bits[TILES_X * TILES_Y/4];
+extern byte _map_extra_bits[TILES_X * TILES_Y/4];
+// usage of tracks need bits
+extern byte _map_usage[TILES_X * TILES_Y];

static const byte _inclined_tileh[] = {
    3,9,3,6,12,6,12,9,
Index: OpenTTD_UsedTracks/gfx.h
===================================================================
--- OpenTTD_UsedTracks/gfx.h    (revision 71)
+++ OpenTTD_UsedTracks/gfx.h    (working copy)
@@ -102,6 +102,7 @@
//enum { NUM_SPRITES = 0x1320 };
//enum { NUM_SPRITES = 0x1500 };
enum { NUM_SPRITES = 0x3500 }; // 1500 + space for custom GRF sets
+

/* tables.h */
extern byte _palettes[4][256 * 3];
Index: OpenTTD_UsedTracks/train_cmd.c
===================================================================
--- OpenTTD_UsedTracks/train_cmd.c    (revision 71)
+++ OpenTTD_UsedTracks/train_cmd.c    (working copy)
@@ -2096,6 +2096,9 @@
                    AffectSpeedByDirChange(v, chosen_dir);
                }

+                // al is ok, update track usage:
+                UpdateTrackUsage(v->tile,1);
+                
                v->direction = chosen_dir;
            }
        } else {
Index: OpenTTD_UsedTracks/rail_cmd.c
===================================================================
--- OpenTTD_UsedTracks/rail_cmd.c    (revision 71)
+++ OpenTTD_UsedTracks/rail_cmd.c    (working copy)
@@ -31,6 +31,14 @@
    RAIL_CHECKPOINT_TRACK_MASK = 1,
    RAIL_CHECKPOINT_UNUSED_BITS = 0x3E,
};
+
+enum { /* track usage */
+    USAGE_NEVER = 0,
+    USAGE_RARE = 5,
+    USAGE_NORMAL = 50,
+    USAGE_OFTEN = 100,
+};
+

#define IS_RAIL_DEPOT(x) (((x) & (RAIL_TYPE_DEPOT|RAIL_DEPOT_UNUSED_BITS)) == RAIL_TYPE_DEPOT)
#define IS_RAIL_CHECKPOINT(x) (((x) & (RAIL_TYPE_CHECKPOINT|RAIL_CHECKPOINT_UNUSED_BITS)) == RAIL_TYPE_CHECKPOINT)
@@ -92,8 +100,37 @@
  *               01abcdef => rail w/ signals
  *               10uuuuuu => unused
  *               11uuuudd => rail depot  
- */
+ */
+
+// return (new) state of track
+int UpdateTrackUsage(uint tile, int amount)
+{
+    int before = _map_usage[tile];
+
+    // do nothing.
+    if (amount >=0 ) {
+        if (_map_usage[tile] >= 200 ) amount = 0;
+    }else{// decrease
+        if (_map_usage[tile] == USAGE_NEVER ) amount = 0;
+    }
+
+    _map_usage[tile] += amount;
+
+    if (before != _map_usage[tile])
+        MarkTileDirtyByTile(tile);
+
+
+    if (_map_usage[tile]== USAGE_NEVER) return USAGE_NEVER;
+
+    else if (_map_usage[tile] < USAGE_NORMAL) return USAGE_RARE;
+
+    else if (_map_usage[tile] < USAGE_OFTEN) return USAGE_NORMAL;
+
+    else return USAGE_OFTEN;
+
+}

+
static bool CheckTrackCombination(byte map5, byte trackbits, byte flags)
{
    _error_message = STR_1001_IMPOSSIBLE_TRACK_COMBINATION;
@@ -364,7 +401,9 @@
        _map_type_and_height[tile] &= 0xF;
        _map_type_and_height[tile] |= MP_RAILWAY << 4;
        _map5[tile] |= rail_bit;
-        _map2[tile] &= ~RAIL_MAP2LO_GROUND_MASK;
+        _map2[tile] &= ~RAIL_MAP2LO_GROUND_MASK;
+
+        _map_usage[tile] = (USAGE_NORMAL + USAGE_OFTEN)/2; // start in between

        // In case it's a tile without signals, clear the signal bits. Why?
        if ((_map5[tile] & RAIL_TYPE_MASK) != RAIL_TYPE_SIGNALS)
@@ -1403,72 +1442,89 @@
    DetTrackDrawProc_Null,
    DetTrackDrawProc_Null,
};
+
+

static void DrawTile_Track(TileInfo *ti)
-{
+{    
+    // never, rarely, normal, often, standard, monorail, maglev
+    int usage_offs[4] = {0,59,118,177 };
    uint32 tracktype_offs, image;
-    byte m5;
+    byte m5;
+    int u = 3; //0-3

    _drawtile_track_palette = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_map_owner[ti->tile]));
+
+    if ( _map3_lo[ti->tile] & 0xF ){ //mono/maglev
+        tracktype_offs = (_map3_lo[ti->tile] & 0xF) * TRACKTYPE_SPRITE_PITCH;
+    }else{ // normal rail
+        switch (UpdateTrackUsage(ti->tile,0)){
+        case USAGE_NEVER: u = 0; break;
+        case USAGE_RARE: u = 1; break;
+        case USAGE_NORMAL: u = 2; break;
+        case USAGE_OFTEN: u = 3; break;
+        }
+        tracktype_offs = SPR_USED_TRACKS_BASE + usage_offs[u] + 7 - 0x3F3;
+    }

-    tracktype_offs = (_map3_lo[ti->tile] & 0xF) * TRACKTYPE_SPRITE_PITCH;

    m5 = (byte)ti->map5;
    if (!(m5 & RAIL_TYPE_SPECIAL)) {
-        bool special;
-
+        bool special;
+        
        m5 &= RAIL_BIT_MASK;
+                
        
        special = false;

-        // select the sprite to use based on the map5 byte.
-        (image = 0x3F3, m5 == RAIL_BIT_DIAG2) ||
-        (image++,                m5 == RAIL_BIT_DIAG1) ||
-        (image++,                m5 == RAIL_BIT_UPPER) ||
-        (image++,                m5 == RAIL_BIT_LOWER) ||
-        (image++,                m5 == RAIL_BIT_RIGHT) ||
-        (image++,                m5 == RAIL_BIT_LEFT) ||
-        (image++,                m5 == (RAIL_BIT_DIAG1|RAIL_BIT_DIAG2)) ||
-        
-        (image = 0x40B, m5 == (RAIL_BIT_UPPER|RAIL_BIT_LOWER)) ||
-        (image++,                m5 == (RAIL_BIT_LEFT|RAIL_BIT_RIGHT)) ||
-        
-        (special=true, false) ||
-
-        (image = 0x3FA, !(m5 & (RAIL_BIT_RIGHT|RAIL_BIT_UPPER|RAIL_BIT_DIAG1))) ||
-        (image++,                !(m5 & (RAIL_BIT_LEFT|RAIL_BIT_LOWER|RAIL_BIT_DIAG1))) ||
-        (image++,                !(m5 & (RAIL_BIT_LEFT|RAIL_BIT_UPPER|RAIL_BIT_DIAG2))) ||
-        (image++,                !(m5 & (RAIL_BIT_RIGHT|RAIL_BIT_LOWER|RAIL_BIT_DIAG2))) ||
-        (image++, true);
-
-        if (ti->tileh != 0) {
-            int f = GetRailFoundation(ti->tileh, ti->map5 & 0x3F);
-            if (f) DrawFoundation(ti, f);
-            
-            // default sloped sprites.
-            if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + 0x3F3;
+        // select the sprite to use based on the map5 byte.
+        (image = 0x3F3, m5 == RAIL_BIT_DIAG2) ||
+        (image++,                m5 == RAIL_BIT_DIAG1) ||
+        (image++,                m5 == RAIL_BIT_UPPER) ||
+        (image++,                m5 == RAIL_BIT_LOWER) ||
+        (image++,                m5 == RAIL_BIT_RIGHT) ||
+        (image++,                m5 == RAIL_BIT_LEFT) ||
+        (image++,                m5 == (RAIL_BIT_DIAG1|RAIL_BIT_DIAG2)) ||
+        
+        (image = 0x40B, m5 == (RAIL_BIT_UPPER|RAIL_BIT_LOWER)) ||
+        (image++,                m5 == (RAIL_BIT_LEFT|RAIL_BIT_RIGHT)) ||
+        
+        (special=true, false) ||
+
+        (image = 0x3FA, !(m5 & (RAIL_BIT_RIGHT|RAIL_BIT_UPPER|RAIL_BIT_DIAG1))) ||
+        (image++,                !(m5 & (RAIL_BIT_LEFT|RAIL_BIT_LOWER|RAIL_BIT_DIAG1))) ||
+        (image++,                !(m5 & (RAIL_BIT_LEFT|RAIL_BIT_UPPER|RAIL_BIT_DIAG2))) ||
+        (image++,                !(m5 & (RAIL_BIT_RIGHT|RAIL_BIT_LOWER|RAIL_BIT_DIAG2))) ||
+        (image++, true);
+
+        if (ti->tileh != 0) {
+            int f = GetRailFoundation(ti->tileh, ti->map5 & 0x3F);
+            if (f) DrawFoundation(ti, f);
+            
+            // default sloped sprites.
+            if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + 0x3F3;
+        }
+
+        if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_BROWN)
+            image = (image & 0xFFFF) | 0x3178000; // use a brown palette
+        else if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_ICE_DESERT)
+            image += 26;
+
+        DrawGroundSprite(image + tracktype_offs);
+
+        if (special) {
+            if (m5 & RAIL_BIT_DIAG1) DrawGroundSprite(0x3ED + tracktype_offs);
+            if (m5 & RAIL_BIT_DIAG2) DrawGroundSprite(0x3EE + tracktype_offs);
+            if (m5 & RAIL_BIT_UPPER) DrawGroundSprite(0x3EF + tracktype_offs);
+            if (m5 & RAIL_BIT_LOWER) DrawGroundSprite(0x3F0 + tracktype_offs);
+            if (m5 & RAIL_BIT_LEFT)  DrawGroundSprite(0x3F2 + tracktype_offs);
+            if (m5 & RAIL_BIT_RIGHT) DrawGroundSprite(0x3F1 + tracktype_offs);
+        }
+
+        if (_display_opt & DO_FULL_DETAIL) {
+            _detailed_track_proc[_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK](ti);
        }

-        if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_BROWN)
-            image = (image & 0xFFFF) | 0x3178000; // use a brown palette
-        else if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_ICE_DESERT)
-            image += 26;
-
-        DrawGroundSprite(image + tracktype_offs);
-
-        if (special) {
-            if (m5 & RAIL_BIT_DIAG1) DrawGroundSprite(0x3ED + tracktype_offs);
-            if (m5 & RAIL_BIT_DIAG2) DrawGroundSprite(0x3EE + tracktype_offs);
-            if (m5 & RAIL_BIT_UPPER) DrawGroundSprite(0x3EF + tracktype_offs);
-            if (m5 & RAIL_BIT_LOWER) DrawGroundSprite(0x3F0 + tracktype_offs);
-            if (m5 & RAIL_BIT_LEFT)  DrawGroundSprite(0x3F2 + tracktype_offs);
-            if (m5 & RAIL_BIT_RIGHT) DrawGroundSprite(0x3F1 + tracktype_offs);
-        }
-
-        if (_display_opt & DO_FULL_DETAIL) {
-            _detailed_track_proc[_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK](ti);
-        }
-
        /* draw signals also? */
        if (!(ti->map5 & RAIL_TYPE_SIGNALS))
            return;
@@ -1511,8 +1567,12 @@
        }
    } else {
        const byte *s;
-        const DrawTrackSeqStruct *drss;
+        const DrawTrackSeqStruct *drss;
+
+        // to normal value again(depots and stuff)
+        tracktype_offs = (_map3_lo[ti->tile] & 0xF) * TRACKTYPE_SPRITE_PITCH;

+
        if (!(m5 & (RAIL_TYPE_MASK&~RAIL_TYPE_SPECIAL)))
            return;
        
@@ -1854,7 +1914,9 @@
    byte m2;
    byte owner;

-    m2 = _map2[tile] & 0xF;
+    m2 = _map2[tile] & 0xF;
+
+    UpdateTrackUsage(tile,-1);

    /* special code for alps landscape */
    if (_opt.landscape == LT_HILLY) {
Index: OpenTTD_UsedTracks/landscape.c
===================================================================
--- OpenTTD_UsedTracks/landscape.c    (revision 71)
+++ OpenTTD_UsedTracks/landscape.c    (working copy)
@@ -12,7 +12,8 @@
byte _map3_hi[TILES_X * TILES_Y];
byte _map_owner[TILES_X * TILES_Y];
byte _map2[TILES_X * TILES_Y];
-byte _map_extra_bits[TILES_X * TILES_Y/4];
+byte _map_extra_bits[TILES_X * TILES_Y/4];
+byte _map_usage[TILES_X * TILES_Y];

extern const TileTypeProcs
    _tile_type_clear_procs,
@@ -499,7 +500,8 @@
    for(i=0; i!=TILES_Y-1; i++)
        memset(_map_type_and_height + i*TILES_X, 0, TILES_X-1);

-    memset(_map5, 3, sizeof(_map5));
+    memset(_map5, 3, sizeof(_map5));
+    memset(_map_usage,0,sizeof(_map_usage));
}

void ConvertGroundTilesIntoWaterTiles()

Index: OpenTTD_UsedTracks/spritecache.c
===================================================================
--- OpenTTD_UsedTracks/spritecache.c    (revision 71)
+++ OpenTTD_UsedTracks/spritecache.c    (working copy)
@@ -699,7 +699,11 @@
        load_index = SPR_CANALS_BASE;
        load_index += LoadGrfFile("canalsw.grf", load_index, i++);
        /* XXX: Only for debugging. Will be more generic. */
-        
+        
+        // Dribbel: Used Tracks
+        load_index = SPR_USED_TRACKS_BASE;
+        load_index += LoadGrfFile("used.grf", load_index, i++);
+
        for(j=0; j!=lengthof(_newgrf_files) && _newgrf_files[j]; j++)
            load_index += LoadGrfFile(_newgrf_files[j], load_index, i++);

@@ -714,7 +718,8 @@
            FioOpenFile(i,_filename_list[i]);
        
        FioOpenFile(i, "openttd.grf");
-        FioOpenFile(i+1, "canalsw.grf");
+        FioOpenFile(i+1, "canalsw.grf");
+        FioOpenFile(i+2, "used.grf");
        
        if (_sprite_page_to_load != 0)
            FioOpenFile(i+2, _landscape_filenames[_sprite_page_to_load-1]);