changeset 3426:d1690b11d1de draft

(svn r4254) -Codechange: Add and make use of map accessors for town lifts.
author celestar <celestar@openttd.org>
date Mon, 03 Apr 2006 11:46:28 +0000
parents dbf6289b760f
children b7f4634bc55f
files town_cmd.c town_map.h
diffstat 2 files changed, 62 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/town_cmd.c
+++ b/town_cmd.c
@@ -81,7 +81,7 @@
 
 static void TownDrawHouseLift(const TileInfo *ti)
 {
-	AddChildSpriteScreen(SPR_LIFT, 14, 60 - GB(_m[ti->tile].m1, 0, 7));
+	AddChildSpriteScreen(SPR_LIFT, 14, 60 - GetLiftPosition(ti->tile));
 }
 
 typedef void TownDrawTileProc(const TileInfo *ti);
@@ -157,8 +157,7 @@
 
 static void AnimateTile_Town(TileIndex tile)
 {
-	int old;
-	int a,b;
+	int pos, dest;
 
 	if (_tick_counter & 3) return;
 
@@ -171,32 +170,26 @@
 		return;
 	}
 
-	if (!((old = _m[tile].m1) & 0x80)) {
+	if (!IsLiftMoving(tile)) {
 		int i;
 
-		_m[tile].m1 |= 0x80;
-
 		/** Building has 6 floors, number 0 .. 6, where 1 is illegal.
 		 *  This is due to the fact that the first floor is, in the graphics,
 		 *  the height of 2 'normal' floors.
 		 *  Furthermore, there are 6 lift positions from floor N (incl) to floor N + 1 (excl) */
 		do {
 			i = (Random() & 7) - 1;
-		} while (i < 0 || i == 1 || i * 6 == old);
+		} while (i < 0 || i == 1 || i * 6 == GetLiftPosition(tile));
 
-		SB(_m[tile].m5, 0, 6, i);
+		SetLiftDestination(tile, i);
 	}
 
-	a = GB(_m[tile].m1, 0, 7);
-	b = GB(_m[tile].m5, 0, 6) * 6;
-	a += (a < b) ? 1 : -1;
-	SB(_m[tile].m1, 0, 7, a);
+	pos = GetLiftPosition(tile);
+	dest = GetLiftDestination(tile) * 6;
+	pos += (pos < dest) ? 1 : -1;
+	SetLiftPosition(tile, pos);
 
-	if (a == b) {
-		_m[tile].m1 &= 0x7F;
-		_m[tile].m5 &= 0x40;
-		DeleteAnimatedTile(tile);
-	}
+	if (pos == dest) HaltLift(tile);
 
 	MarkTileDirtyByTile(tile);
 }
@@ -259,7 +252,7 @@
 {
 	assert(IsTileType(tile, MP_HOUSE));
 
-	if (_m[tile].m5 & 0x80) return;
+	if (LiftHasDestination(tile)) return;
 
 	AB(_m[tile].m5, 0, 3, 1);
 	if (GB(_m[tile].m5, 0, 3) != 0) return;
@@ -293,12 +286,7 @@
 	}
 
 	house = GetHouseType(tile);
-	if (_housetype_extra_flags[house] & 0x20 &&
-			!(_m[tile].m5 & 0x80) &&
-			CHANCE16(1, 2) &&
-			AddAnimatedTile(tile)) {
-		_m[tile].m5 = (_m[tile].m5 & 0x40) | 0x80;
-	}
+	if ((_housetype_extra_flags[house] & 0x20) && !LiftHasDestination(tile) && CHANCE16(1, 2) && AddAnimatedTile(tile)) BeginLiftMovement(tile);
 
 	t = GetTownByTile(tile);
 
--- a/town_map.h
+++ b/town_map.h
@@ -1,5 +1,8 @@
 /* $Id$ */
 
+#ifndef TOWN_MAP_H
+#define TOWN_MAP_H
+
 #include "town.h"
 
 static inline int GetHouseType(TileIndex t)
@@ -14,11 +17,57 @@
 	return _m[t].m2;
 }
 
+static inline bool LiftHasDestination(TileIndex t)
+{
+	return HASBIT(_m[t].m5, 7);
+}
+
+static inline void SetLiftDestination(TileIndex t, byte dest)
+{
+	SB(_m[t].m5, 0, 6, dest);
+	SETBIT(_m[t].m1, 7); /* Start moving */
+}
+
+static inline byte GetLiftDestination(TileIndex t)
+{
+	return GB(_m[t].m5, 0, 6);
+}
+
+static inline bool IsLiftMoving(TileIndex t)
+{
+	return HASBIT(_m[t].m1, 7);
+}
+
+static inline void BeginLiftMovement(TileIndex t)
+{
+	SETBIT(_m[t].m5, 7);
+}
+
+static inline void HaltLift(TileIndex t)
+{
+	CLRBIT(_m[t].m1, 7);
+	CLRBIT(_m[t].m5, 7);
+	SB(_m[t].m5, 0, 6, 0);
+
+	DeleteAnimatedTile(t);
+}
+
+static inline byte GetLiftPosition(TileIndex t)
+{
+	return GB(_m[t].m1, 0, 7);
+}
+
+static inline void SetLiftPosition(TileIndex t, byte pos)
+{
+	SB(_m[t].m1, 0, 7, pos);
+}
+
 static inline Town* GetTownByTile(TileIndex t)
 {
 	return GetTown(GetTownIndex(t));
 }
 
+
 static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, byte type)
 {
 	assert(IsTileType(t, MP_CLEAR));
@@ -46,3 +95,4 @@
 	if (HASBIT(size, TWO_BY_TWO_BIT) || HASBIT(size, TWO_BY_ONE_BIT)) MakeHouseTile(t + TileDiffXY(1, 0), tid, counter, stage, ++type);
 	if (HASBIT(size, TWO_BY_TWO_BIT)) MakeHouseTile(t + TileDiffXY(1, 1), tid, counter, stage, ++type);
 }
+#endif