Bernhard 
		
			Forum-Team 
			      
			
			
 
 
			
	Beiträge: 9.397 
	Registriert seit: Jan 2004
	
		
	 | 
	
		
			
  
			 
			
				hier ist der Thread. Bei mir ist es allerdings nie gelaufen . 
http://www.tt-forums.net/viewtopic.php?t=9293
und hier die Diff       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]);
  
			 
			
			
 
"Das Böse triumphiert alleine dadurch, daß gute Menschen nichts unternehmen!" Edward Burke, 1729-1797 
 
"Wir leben alle unter dem gleichen Himmel, aber wir haben nicht alle den gleichen Horizont!" Konrad Adenauer, 1876-1967  
			
		 |  
	 
 |