[Scummvm-cvs-logs] scummvm master -> 5a245bd4f2cbac8aee4efe7220533f41d6418312

DrMcCoy drmccoy at drmccoy.de
Sun Jun 3 03:43:21 CEST 2012


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
627e870629 GOB: Limit Penetration movement to walkable tiles
5a245bd4f2 GOB: Consume shields in Penetration


Commit: 627e870629cdab1009d3279453d082a3c44acd03
    https://github.com/scummvm/scummvm/commit/627e870629cdab1009d3279453d082a3c44acd03
Author: Sven Hesse (drmccoy at users.sourceforge.net)
Date: 2012-06-02T18:29:35-07:00

Commit Message:
GOB: Limit Penetration movement to walkable tiles

Changed paths:
    engines/gob/minigames/geisha/penetration.cpp
    engines/gob/minigames/geisha/penetration.h



diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp
index 377835c..c8fbe31 100644
--- a/engines/gob/minigames/geisha/penetration.cpp
+++ b/engines/gob/minigames/geisha/penetration.cpp
@@ -423,6 +423,15 @@ int16 Penetration::checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseB
 	return _vm->_util->checkKey();
 }
 
+bool Penetration::isWalkable(byte tile) const {
+	// Only walls are nonwalkable
+
+	if (tile == 50)
+		return false;
+
+	return true;
+}
+
 void Penetration::handleSub(int16 key) {
 	if      (key == kKeyLeft)
 		moveSub(-5,  0, kAnimationDriveW);
@@ -435,11 +444,30 @@ void Penetration::handleSub(int16 key) {
 }
 
 void Penetration::moveSub(int x, int y, uint16 animation) {
-	_mapX = CLIP<int16>(_mapX + x, 0, kMapWidth  * kMapTileWidth);
-	_mapY = CLIP<int16>(_mapY + y, 0, kMapHeight * kMapTileHeight);
+	// Limit the movement to walkable tiles
+
+	int16 minX = 0;
+	if ((_subTileX > 0) && !isWalkable(_mapTiles[_subTileY * kMapWidth + (_subTileX - 1)]))
+		minX = _subTileX * kMapTileWidth;
+
+	int16 maxX = kMapWidth * kMapTileWidth;
+	if ((_subTileX < (kMapWidth - 1)) && !isWalkable(_mapTiles[_subTileY * kMapWidth + (_subTileX + 1)]))
+		maxX = _subTileX * kMapTileWidth;
+
+	int16 minY = 0;
+	if ((_subTileY > 0) && !isWalkable(_mapTiles[(_subTileY - 1) * kMapWidth + _subTileX]))
+		minY = _subTileY * kMapTileHeight;
+
+	int16 maxY = kMapHeight * kMapTileHeight;
+	if ((_subTileY < (kMapHeight - 1)) && !isWalkable(_mapTiles[(_subTileY + 1) * kMapWidth + _subTileX]))
+		maxY = _subTileY * kMapTileHeight;
+
+	_mapX = CLIP<int16>(_mapX + x, minX, maxX);
+	_mapY = CLIP<int16>(_mapY + y, minY, maxY);
 
-	_subTileX  = _mapX / kMapTileWidth;
-	_subTileY  = _mapY / kMapTileHeight;
+	// The tile the sub is on is where its mid-point is
+	_subTileX = (_mapX + (kMapTileWidth  / 2)) / kMapTileWidth;
+	_subTileY = (_mapY + (kMapTileHeight / 2)) / kMapTileHeight;
 
 	_mapUpdate = true;
 
diff --git a/engines/gob/minigames/geisha/penetration.h b/engines/gob/minigames/geisha/penetration.h
index 28a2889..9109cb5 100644
--- a/engines/gob/minigames/geisha/penetration.h
+++ b/engines/gob/minigames/geisha/penetration.h
@@ -96,6 +96,8 @@ private:
 
 	void handleSub(int16 key);
 	void moveSub(int x, int y, uint16 animation);
+
+	bool isWalkable(byte tile) const;
 };
 
 } // End of namespace Geisha


Commit: 5a245bd4f2cbac8aee4efe7220533f41d6418312
    https://github.com/scummvm/scummvm/commit/5a245bd4f2cbac8aee4efe7220533f41d6418312
Author: Sven Hesse (drmccoy at users.sourceforge.net)
Date: 2012-06-02T18:40:04-07:00

Commit Message:
GOB: Consume shields in Penetration

Changed paths:
    engines/gob/minigames/geisha/penetration.cpp
    engines/gob/minigames/geisha/penetration.h



diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp
index c8fbe31..e4e7798 100644
--- a/engines/gob/minigames/geisha/penetration.cpp
+++ b/engines/gob/minigames/geisha/penetration.cpp
@@ -193,6 +193,10 @@ const byte Penetration::kMaps[kModeCount][kFloorCount][kMapWidth * kMapHeight] =
 };
 
 
+Penetration::Position::Position(uint16 pX, uint16 pY) : x(pX), y(pY) {
+}
+
+
 Penetration::Penetration(GobEngine *vm) : _vm(vm), _background(0), _sprites(0), _objects(0), _sub(0),
 	_shieldMeter(0), _healthMeter(0), _floor(0), _mapUpdate(false), _mapX(0), _mapY(0),
 	_subTileX(0), _subTileY(0) {
@@ -303,6 +307,8 @@ void Penetration::createMap() {
 	// Copy the correct map
 	memcpy(_mapTiles, kMaps[_testMode ? 1 : 0][_floor], kMapWidth * kMapHeight);
 
+	_shields.clear();
+
 	_map->fill(kColorBlack);
 
 	// Draw the map tiles
@@ -378,6 +384,8 @@ void Penetration::createMap() {
 
 				_map->fillRect(posX +  4, posY + 8, posX +  7, posY + 18, kColorFloor); // Area left to shield
 				_map->fillRect(posX + 17, posY + 8, posX + 20, posY + 18, kColorFloor); // Area right to shield
+
+				_shields.push_back(Position(x, y));
 				break;
 
 			case 57: // Start position
@@ -473,6 +481,25 @@ void Penetration::moveSub(int x, int y, uint16 animation) {
 
 	if (_sub->getAnimation() != animation)
 		_sub->setAnimation(animation);
+
+	checkShields();
+}
+
+void Penetration::checkShields() {
+	for (Common::List<Position>::iterator pos = _shields.begin(); pos != _shields.end(); ++pos) {
+		if ((pos->x == _subTileX) && (pos->y == _subTileY)) {
+			// Charge shields
+			_shieldMeter->setMaxValue();
+
+			// Erase the shield from the map
+			const int mapX = kPlayAreaBorderWidth  + pos->x * kMapTileWidth;
+			const int mapY = kPlayAreaBorderHeight + pos->y * kMapTileHeight;
+			_sprites->draw(*_map, 30, mapX, mapY);
+
+			_shields.erase(pos);
+			break;
+		}
+	}
 }
 
 void Penetration::updateAnims() {
diff --git a/engines/gob/minigames/geisha/penetration.h b/engines/gob/minigames/geisha/penetration.h
index 9109cb5..4d3455b 100644
--- a/engines/gob/minigames/geisha/penetration.h
+++ b/engines/gob/minigames/geisha/penetration.h
@@ -54,6 +54,13 @@ private:
 
 	static const byte kMaps[kModeCount][kFloorCount][kMapWidth * kMapHeight];
 
+	struct Position {
+		uint16 x;
+		uint16 y;
+
+		Position(uint16 pX, uint16 pY);
+	};
+
 	GobEngine *_vm;
 
 	bool _hasAccessPass;
@@ -83,6 +90,9 @@ private:
 	uint8 _subTileX;
 	uint8 _subTileY;
 
+	Common::List<Position> _shields;
+
+
 	void init();
 	void deinit();
 
@@ -98,6 +108,8 @@ private:
 	void moveSub(int x, int y, uint16 animation);
 
 	bool isWalkable(byte tile) const;
+
+	void checkShields();
 };
 
 } // End of namespace Geisha






More information about the Scummvm-git-logs mailing list