changeset 15933:8ac5258d7680 draft

(svn r20621) -Codechange: move animation frames of houses, objects and industries to m7 (same as airports and stations)
author rubidium <rubidium@openttd.org>
date Thu, 26 Aug 2010 14:36:00 +0000
parents be191a471e19
children 3172190fa127
files docs/landscape.html docs/landscape_grid.html src/industry_map.h src/newgrf.cpp src/object_map.h src/saveload/afterload.cpp src/saveload/saveload.cpp src/town_map.h
diffstat 8 files changed, 94 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/docs/landscape.html
+++ b/docs/landscape.html
@@ -669,7 +669,7 @@
        </li>
       </ul>
      <li>m3 bit 6 : bit 8 of house type (m4), allowing 512 different types.</li>
-     <li>m3 bit 5 : bit 6 of current animation frame (see m6)</li>
+     <li>m3 bit 5 : free</li>
      <li>m3 bits 4..0 : triggers activated <a href="#newhouses">(newhouses)</a></li>
      <li>m4 : <a href="landscape_externals.html">town building type</a> (with m3[6] bit)</li>
      <li>m5 : see m3 bit 7</li>
@@ -677,7 +677,7 @@
       <ul>
        <li>If <a href="#newhouses">newhouses</a> is activated
         <ul>
-         <li>bits 7..2 : Current animation frame (bits 5..0); bit 6 in m3</li>
+         <li>bits 7..2 : Periodic processing time remaining</li>
         </ul>
        </li>
        <li>Standard behaviour
@@ -692,7 +692,7 @@
       <ul>
        <li>If <a href="#newhouses">newhouses</a> is activated
         <ul>
-         <li>Periodic processing time remaining</li>
+         <li>Current animation frame</li>
         </ul>
        </li>
        <li>Standard behaviour (only for houses type 04 and 05)
@@ -1090,7 +1090,7 @@
       </ul>
      </li>
      <li>m2: index into the array of industries</li>
-     <li>m3: animation state</li>
+     <li>m3: random bits (NewGRF)</li>
      <li>m4: animation loop</li>
      <li>m5: type (plus m6 bit 2):<br>
       <small>(note: this is not the same as the industry type, which is stored in the array of industries)</small>
@@ -1107,7 +1107,7 @@
           <tr>
            <td nowrap valign=top><tt>01</tt>&nbsp; </td>
            <td align=left>wheel tower when animated<br>
-            animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td>
+            animation state in m7 bits 5..0; m7 bit 6 set = sound already generated</td>
           </tr>
          </table>
         </td>
@@ -1123,7 +1123,7 @@
           </tr>
           <tr>
            <td nowrap valign=top><tt>0A</tt>&nbsp; </td>
-           <td align=left>transformer; animation progress in m3(valid range <tt>0</tt>..<tt>7</tt>)</td>
+           <td align=left>transformer; animation progress in m7(valid range <tt>0</tt>..<tt>7</tt>)</td>
           </tr>
          </table>
         </td>
@@ -1166,7 +1166,7 @@
           </tr>
           <tr>
            <td nowrap valign=top><tt>1E</tt>..<tt>20</tt>&nbsp; </td>
-           <td align=left>various stages of animation; progress of animation in m3</td>
+           <td align=left>various stages of animation; progress of animation in m7</td>
           </tr>
          </table>
         </td>
@@ -1197,7 +1197,7 @@
           </tr>
           <tr>
            <td nowrap valign=top><tt>30</tt>&nbsp; </td>
-           <td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td>
+           <td align=left>wheel tower when animated; animation state in m7 bits 5..0; m7 bit 6 set = sound already generated</td>
           </tr>
           <tr>
            <td nowrap valign=top><tt>31</tt>&nbsp; </td>
@@ -1237,7 +1237,7 @@
           </tr>
           <tr>
            <td nowrap valign=top><tt>58</tt>&nbsp; </td>
-           <td align=left>wheel tower when animated; animation state in m3 bits 5..0; m3 bit 6 set = sound already generated</td>
+           <td align=left>wheel tower when animated; animation state in m7 bits 5..0; m7 bit 6 set = sound already generated</td>
           </tr>
          </table></td>
        </tr>
@@ -1332,7 +1332,7 @@
          <table>
           <tr>
            <td nowrap valign=top><tt>8F</tt>&nbsp; </td>
-           <td align=left>Animated part; animation state in m3 (valid range <tt>00</tt>..<tt>31</tt>)<br>
+           <td align=left>Animated part; animation state in m7 (valid range <tt>00</tt>..<tt>31</tt>)<br>
                         Tile animation is started (m4 zeroed) on the periodic processing.<br>
                         While the animation is in progress, m4 holds the number
                         of animation cycles that have already taken place.<br>
@@ -1362,7 +1362,7 @@
           </tr>
           <tr>
            <td nowrap valign=top><tt>A2</tt>&nbsp; </td>
-           <td align=left>bubble capture facility; animation state in m3 (valid range <tt>00</tt>..<tt>27</tt>)</td>
+           <td align=left>bubble capture facility; animation state in m7 (valid range <tt>00</tt>..<tt>27</tt>)</td>
           </tr>
          </table>
         </td>
@@ -1400,7 +1400,7 @@
      <li>m6 bits 5..3: random triggers (NewGRF)</li>
      <li>m6 bit 2: bit 8 of type (see m5)</li>
      <li>m6 bits 1..0 : <a href="#tropic_zone">Tropic zone definition</a></li>
-     <li>m7: random bits (NewGRF)</li>
+     <li>m7: animation frame</li>
     </ul>
    </td>
   </tr>
--- a/docs/landscape_grid.html
+++ b/docs/landscape_grid.html
@@ -159,7 +159,7 @@
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
-      <td class="bits">XXX<span class="option">~ ~~</span>XX</td>
+      <td class="bits">XX<span class="free">O</span><span class="option">~ ~~</span>XX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXX<span class="abuse">X XXXX</span></td>
       <td class="bits"><span class="abuse">XXXX XX</span>XX</td>
@@ -293,8 +293,7 @@
       <td>8</td>
       <td class="caption">industry</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits">XXX<span class="free">O</span> <span class="abuse">
-        XXXX</span></td>
+      <td class="bits">XXX<span class="free">O</span> <span class="abuse">XXXX</span></td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
@@ -331,11 +330,11 @@
       <td class="bits">XXXX XXXX</td>
       <td class="bits"><span class="free">O</span>XXX XXXX</td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
-      <td class="bits">XXXX XXXX</td>
+      <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XX<span class="free">OO OO</span>XX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
+      <td class="bits">XXXX XXXX</td>
     </tr>
   </tbody>
 </table>
--- a/src/industry_map.h
+++ b/src/industry_map.h
@@ -236,7 +236,7 @@
 static inline byte GetIndustryAnimationState(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	return _m[tile].m3;
+	return _me[tile].m7;
 }
 
 /**
@@ -248,7 +248,7 @@
 static inline void SetIndustryAnimationState(TileIndex tile, byte state)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	_m[tile].m3 = state;
+	_me[tile].m7 = state;
 }
 
 /**
@@ -261,7 +261,7 @@
 static inline byte GetIndustryRandomBits(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	return _me[tile].m7;
+	return _m[tile].m3;
 }
 
 /**
@@ -274,7 +274,7 @@
 static inline void SetIndustryRandomBits(TileIndex tile, byte bits)
 {
 	assert(IsTileType(tile, MP_INDUSTRY));
-	_me[tile].m7 = bits;
+	_m[tile].m3 = bits;
 }
 
 /**
@@ -317,12 +317,12 @@
 	SetTileType(t, MP_INDUSTRY);
 	_m[t].m1 = 0;
 	_m[t].m2 = index;
-	_m[t].m3 = 0;
+	SetIndustryRandomBits(t, random); // m3
 	_m[t].m4 = 0;
 	SetIndustryGfx(t, gfx); // m5, part of m6
 	SetIndustryTriggers(t, 0); // rest of m6
-	SetIndustryRandomBits(t, random); // m7
 	SetWaterClass(t, wc);
+	_me[t].m7 = 0;
 }
 
 #endif /* INDUSTRY_MAP_H */
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1684,7 +1684,7 @@
 			}
 
 			case 0x16: // Periodic refresh multiplier
-				housespec->processing_time = buf->ReadByte();
+				housespec->processing_time = min(buf->ReadByte(), 63);
 				break;
 
 			case 0x17: // Four random colours to use
--- a/src/object_map.h
+++ b/src/object_map.h
@@ -115,7 +115,7 @@
 static inline byte GetObjectAnimationStage(TileIndex t)
 {
 	assert(IsTileType(t, MP_OBJECT));
-	return _m[t].m3;
+	return _me[t].m7;
 }
 
 /**
@@ -127,7 +127,7 @@
 static inline void SetObjectAnimationStage(TileIndex t, uint8 stage)
 {
 	assert(IsTileType(t, MP_OBJECT));
-	_m[t].m3 = stage;
+	_me[t].m7 = stage;
 }
 
 
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1283,19 +1283,19 @@
 			if (IsTileType(t, MP_INDUSTRY)) {
 				switch (GetIndustryGfx(t)) {
 					case GFX_POWERPLANT_SPARKS:
-						SetIndustryAnimationState(t, GB(_m[t].m1, 2, 5));
+						_m[t].m3 = GB(_m[t].m1, 2, 5);
 						break;
 
 					case GFX_OILWELL_ANIMATED_1:
 					case GFX_OILWELL_ANIMATED_2:
 					case GFX_OILWELL_ANIMATED_3:
-						SetIndustryAnimationState(t, GB(_m[t].m1, 0, 2));
+						_m[t].m3 = GB(_m[t].m1, 0, 2);
 						break;
 
 					case GFX_COAL_MINE_TOWER_ANIMATED:
 					case GFX_COPPER_MINE_TOWER_ANIMATED:
 					case GFX_GOLD_MINE_TOWER_ANIMATED:
-						 SetIndustryAnimationState(t, _m[t].m1);
+						 _m[t].m3 = _m[t].m1;
 						 break;
 
 					default: // No animation states to change
@@ -1684,7 +1684,8 @@
 		/* Increase HouseAnimationFrame from 5 to 7 bits */
 		for (TileIndex t = 0; t < map_size; t++) {
 			if (IsTileType(t, MP_HOUSE) && GetHouseType(t) >= NEW_HOUSE_OFFSET) {
-				SetHouseAnimationFrame(t, GB(_m[t].m6, 3, 5));
+				SB(_m[t].m6, 2, 6, GB(_m[t].m6, 3, 5));
+				SB(_m[t].m3, 5, 1, 0);
 			}
 		}
 	}
@@ -2249,6 +2250,38 @@
 		}
 	}
 
+	/* Move the animation frame to the same location (m7) for all objects. */
+	if (CheckSavegameVersion(147)) {
+		for (TileIndex t = 0; t < map_size; t++) {
+			switch (GetTileType(t)) {
+				case MP_HOUSE:
+					if (GetHouseType(t) >= NEW_HOUSE_OFFSET) {
+						uint per_proc = _me[t].m7;
+						_me[t].m7 = GB(_m[t].m6, 2, 6) | (GB(_m[t].m3, 5, 1) << 6);
+						SB(_m[t].m3, 5, 1, 0);
+						SB(_m[t].m6, 2, 6, min(per_proc, 63));
+					}
+					break;
+
+				case MP_INDUSTRY: {
+					uint rand = _me[t].m7;
+					_me[t].m7 = _m[t].m3;
+					_m[t].m3 = rand;
+					break;
+				}
+
+				case MP_OBJECT:
+					_me[t].m7 = _m[t].m3;
+					_m[t].m3 = 0;
+					break;
+
+				default:
+					/* For stations/airports it's already at m7 */
+					break;
+			}
+		}
+	}
+
 	/* Road stops is 'only' updating some caches */
 	AfterLoadRoadStops();
 	AfterLoadLabelMaps();
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -210,8 +210,9 @@
  *  144   20334
  *  145   20376
  *  146   20446
+ *  147   20621
  */
-extern const uint16 SAVEGAME_VERSION = 146; ///< current savegame version of OpenTTD
+extern const uint16 SAVEGAME_VERSION = 147; ///< current savegame version of OpenTTD
 
 SavegameType _savegame_type; ///< type of savegame we are loading
 
--- a/src/town_map.h
+++ b/src/town_map.h
@@ -148,7 +148,7 @@
 static inline byte GetHouseAnimationFrame(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	return GB(_m[t].m6, 2, 6) | (GB(_m[t].m3, 5, 1) << 6);
+	return _me[t].m7;
 }
 
 /**
@@ -160,8 +160,7 @@
 static inline void SetHouseAnimationFrame(TileIndex t, byte frame)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	SB(_m[t].m6, 2, 6, GB(frame, 0, 6));
-	SB(_m[t].m3, 5, 1, GB(frame, 6, 1));
+	_me[t].m7 = frame;
 }
 
 /**
@@ -187,31 +186,6 @@
 }
 
 /**
- * Make the tile a house.
- * @param t tile index
- * @param tid Town index
- * @param counter of construction step
- * @param stage of construction (used for drawing)
- * @param type of house.  Index into house specs array
- * @param random_bits required for newgrf houses
- * @pre IsTileType(t, MP_CLEAR)
- */
-static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
-{
-	assert(IsTileType(t, MP_CLEAR));
-
-	SetTileType(t, MP_HOUSE);
-	_m[t].m1 = random_bits;
-	_m[t].m2 = tid;
-	_m[t].m3 = 0;
-	SetHouseType(t, type);
-	SetHouseCompleted(t, stage == TOWN_HOUSE_COMPLETED);
-	_m[t].m5 = IsHouseCompleted(t) ? 0 : (stage << 3 | counter);
-	SetHouseAnimationFrame(t, 0);
-	_me[t].m7 = HouseSpec::Get(type)->processing_time;
-}
-
-/**
  * House Construction Scheme.
  *  Construction counter, for buildings under construction. Incremented on every
  *  periodic tile processing.
@@ -365,7 +339,7 @@
 static inline byte GetHouseProcessingTime(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	return _me[t].m7;
+	return GB(_m[t].m6, 2, 6);
 }
 
 /**
@@ -377,7 +351,7 @@
 static inline void SetHouseProcessingTime(TileIndex t, byte time)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	_me[t].m7 = time;
+	SB(_m[t].m6, 2, 6, time);
 }
 
 /**
@@ -388,7 +362,32 @@
 static inline void DecHouseProcessingTime(TileIndex t)
 {
 	assert(IsTileType(t, MP_HOUSE));
-	_me[t].m7--;
+	_m[t].m6 -= 1 << 2;
+}
+
+/**
+ * Make the tile a house.
+ * @param t tile index
+ * @param tid Town index
+ * @param counter of construction step
+ * @param stage of construction (used for drawing)
+ * @param type of house.  Index into house specs array
+ * @param random_bits required for newgrf houses
+ * @pre IsTileType(t, MP_CLEAR)
+ */
+static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
+{
+	assert(IsTileType(t, MP_CLEAR));
+
+	SetTileType(t, MP_HOUSE);
+	_m[t].m1 = random_bits;
+	_m[t].m2 = tid;
+	_m[t].m3 = 0;
+	SetHouseType(t, type);
+	SetHouseCompleted(t, stage == TOWN_HOUSE_COMPLETED);
+	_m[t].m5 = IsHouseCompleted(t) ? 0 : (stage << 3 | counter);
+	SetHouseAnimationFrame(t, 0);
+	SetHouseProcessingTime(t, HouseSpec::Get(type)->processing_time);
 }
 
 #endif /* TOWN_MAP_H */