[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/games/magazynier
From:       Tadeusz Andrzej Kadłubowski <yess () hell ! org ! pl>
Date:       2009-12-12 20:04:53
Message-ID: 1260648293.344243.27525.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1061720 by tkadlubo:

- move() and similar methods have a first parameter, the position from which the move \
                starts.
- mouse navigation is reworked, so that it doesn't cause moves, but constructs an \
aggregate MagazynierCommand, which is emited via addNewUndoCommand.


 M  +46 -41    levelModel.cpp  
 M  +3 -2      levelModel.h  


--- trunk/playground/games/magazynier/levelModel.cpp #1061719:1061720
@@ -265,92 +265,92 @@
 	return;
 } //}}}
 
-bool LevelModel::canMove(QPoint delta) //{{{
+bool LevelModel::canMove(QPoint pos, QPoint delta) //{{{
 {
-	MagazynierItem *target = getItem(*m_playerPos + delta);
+	MagazynierItem *target = getItem(pos + delta);
 
 	if (target->itemType() == Empty || target->itemType() == Goal) {
 		return true;
 	}
 
 	if (target->itemType() == Box || target->itemType() == (Goal | Box)) {
-		MagazynierItem *boxTarget = getItem(*m_playerPos + delta + delta);
+		MagazynierItem *boxTarget = getItem(pos + delta + delta);
 		if (boxTarget->itemType() == Empty || boxTarget->itemType() == Goal) {
 			return true;
 		}
 	}
 
-	kDebug() << "Can't move from" << *m_playerPos << target->itemType() << "in the \
way"; +	kDebug() << "Can't move from" << pos << target->itemType() << "in the way";
 	return false;
 } //}}}
 
-MagazynierCommand *LevelModel::move(QPoint delta) //{{{
+MagazynierCommand *LevelModel::move(QPoint pos, QPoint delta, QUndoCommand \
*parentCommand) //{{{  {
-	if (!canMove(delta)) {
+	if (!canMove(pos, delta)) {
 		return NULL;
 	}
 	
 	kDebug() << "Move by" << delta;
-	MagazynierCommand *aggregateCommand = new MagazynierCommand(this);
+	MagazynierCommand *aggregateCommand = new MagazynierCommand(this, parentCommand);
 
-	MagazynierItem *here = getItem(*m_playerPos);
-	MagazynierItem *target = getItem(*m_playerPos + delta);
+	MagazynierItem *here = getItem(pos);
+	MagazynierItem *target = getItem(pos + delta);
 		
 	if (here->itemType() == Player) {
 		kDebug() << "player moves to" << target->itemType();
 		if (target->itemType() == Empty) {
-			new MoveFromEmptyToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+			new MoveFromEmptyToEmptyCommand(this, pos, delta, aggregateCommand);
 		} else if (target->itemType() == Goal) {
-			new MoveFromEmptyToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+			new MoveFromEmptyToGoalCommand(this, pos, delta, aggregateCommand);
 		} else if (target->itemType() == Box) {
-			MagazynierItem *boxTarget = getItem(*m_playerPos + delta + delta);
+			MagazynierItem *boxTarget = getItem(pos + delta + delta);
 			if (boxTarget->itemType() == Empty) {
 				aggregateCommand->setShift(true);
-				new MoveFromEmptyToEmptyCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromEmptyToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromEmptyToEmptyCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromEmptyToEmptyCommand(this, pos, delta, aggregateCommand);
 			} else if (boxTarget->itemType() == Goal) {
 				aggregateCommand->setShift(true);
-				new MoveFromEmptyToGoalCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromEmptyToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromEmptyToGoalCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromEmptyToEmptyCommand(this, pos, delta, aggregateCommand);
 			}
 		} else if (target->itemType() == (Box | Goal)) {
-			MagazynierItem *boxTarget = getItem(*m_playerPos + delta + delta);
+			MagazynierItem *boxTarget = getItem(pos + delta + delta);
 			if (boxTarget->itemType() == Empty) {
 				aggregateCommand->setShift(true);
-				new MoveFromGoalToEmptyCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromEmptyToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromGoalToEmptyCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromEmptyToGoalCommand(this, pos, delta, aggregateCommand);
 			} else if (boxTarget->itemType() == Goal) {
 				aggregateCommand->setShift(true);
-				new MoveFromGoalToGoalCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromEmptyToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromGoalToGoalCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromEmptyToGoalCommand(this, pos, delta, aggregateCommand);
 			}
 		}
 	} else if (here->itemType() == (Player | Goal)) {
 		if (target->itemType() == Empty) {
-			new MoveFromGoalToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+			new MoveFromGoalToEmptyCommand(this, pos, delta, aggregateCommand);
 		} else if (target->itemType() == Goal) {
-			new MoveFromGoalToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+			new MoveFromGoalToGoalCommand(this, pos, delta, aggregateCommand);
 		} else if (target->itemType() == Box) {
-			MagazynierItem *boxTarget = getItem(*m_playerPos + delta + delta);
+			MagazynierItem *boxTarget = getItem(pos + delta + delta);
 			if (boxTarget->itemType() == Empty) {
 				aggregateCommand->setShift(true);
-				new MoveFromEmptyToEmptyCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromGoalToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromEmptyToEmptyCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromGoalToEmptyCommand(this, pos, delta, aggregateCommand);
 			} else if (boxTarget->itemType() == Goal) {
 				aggregateCommand->setShift(true);
-				new MoveFromEmptyToGoalCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromGoalToEmptyCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromEmptyToGoalCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromGoalToEmptyCommand(this, pos, delta, aggregateCommand);
 			}
 		} else if (target->itemType() == (Box | Goal)) {
-			MagazynierItem *boxTarget = getItem(*m_playerPos + delta + delta);
+			MagazynierItem *boxTarget = getItem(pos + delta + delta);
 			if (boxTarget->itemType() == Empty) {
 				aggregateCommand->setShift(true);
-				new MoveFromGoalToEmptyCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromGoalToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromGoalToEmptyCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromGoalToGoalCommand(this, pos, delta, aggregateCommand);
 			} else if (boxTarget->itemType() == Goal) {
 				aggregateCommand->setShift(true);
-				new MoveFromGoalToGoalCommand(this, *m_playerPos + delta, delta, \
                aggregateCommand);
-				new MoveFromGoalToGoalCommand(this, *m_playerPos, delta, aggregateCommand);
+				new MoveFromGoalToGoalCommand(this, pos + delta, delta, aggregateCommand);
+				new MoveFromGoalToGoalCommand(this, pos, delta, aggregateCommand);
 			}
 		}
 	}
@@ -359,7 +359,7 @@
 
 void LevelModel::moveUp(void)
 {
-	MagazynierCommand *command = move(*m_moveDirUp); 
+	MagazynierCommand *command = move(*m_playerPos, *m_moveDirUp); 
 	if (command != NULL) {
 		emit addNewUndoCommand(command);
 	}
@@ -367,7 +367,7 @@
 
 void LevelModel::moveLeft(void)
 {
-	MagazynierCommand *command = move(*m_moveDirLeft);
+	MagazynierCommand *command = move(*m_playerPos, *m_moveDirLeft);
 	if (command != NULL) {
 		emit addNewUndoCommand(command);
 	}
@@ -375,7 +375,7 @@
 
 void LevelModel::moveRight(void)
 {
-	MagazynierCommand *command = move(*m_moveDirRight);
+	MagazynierCommand *command = move(*m_playerPos, *m_moveDirRight);
 	if (command != NULL) {
 		emit addNewUndoCommand(command);
 	}
@@ -383,7 +383,7 @@
 
 void LevelModel::moveDown(void)
 {
-	MagazynierCommand *command = move(*m_moveDirDown);
+	MagazynierCommand *command = move(*m_playerPos, *m_moveDirDown);
 	if (command != NULL) {
 		emit addNewUndoCommand(command);
 	}
@@ -443,23 +443,28 @@
 	if(x<0 || y<0 || x>=getColumnCount() || y>=getRowCount())
 		return;
 
+	MagazynierCommand *command = NULL;
 	if(getItem(pos)->itemType()==Empty || getItem(pos)->itemType()==Goal) {
 		kDebug() << x << y << "Cell empty!";
 		QList<QPoint> *path = AStar::findPath(this, *m_playerPos, pos);
 		if(path!=NULL) {
+			command = new MagazynierCommand(this);
 			QPoint prevPos = *m_playerPos;
 			foreach(QPoint pos, *path) {
-				kDebug() << pos;
-				kDebug() << prevPos-pos;
-				move(pos-prevPos);
+				kDebug() << "Moving from" << prevPos << "by" << pos-prevPos;
+				move(prevPos, pos-prevPos, command);
 				prevPos = pos;
 			}
 		}
 		delete path;
 	}else if((pos-(*m_playerPos)).manhattanLength()==1 && getItem(pos)->itemType() & \
Box) {  // Only move a box when the player is standing next to it \
                (manhattanLength==1)
-		move(pos-(*m_playerPos));
+		command = move(*m_playerPos, pos-(*m_playerPos));
 	}
+
+	if (command != NULL) {
+		emit addNewUndoCommand(command);
+	}
 } //}}}
 
 // vim: foldmethod=marker
--- trunk/playground/games/magazynier/levelModel.h #1061719:1061720
@@ -63,6 +63,8 @@
 	int getMoveCount(void);
 	int getShiftCount(void);
 
+	MagazynierCommand *move(QPoint pos, QPoint delta, QUndoCommand *parentCommand = 0);
+
 	void moveFromEmptyToEmpty(QPoint pos, QPoint delta);
 	void moveFromEmptyToGoal(QPoint pos, QPoint delta);
 	void moveFromGoalToEmpty(QPoint pos, QPoint delta);
@@ -84,8 +86,7 @@
 	int m_columnCount, m_rowCount;
 	bool m_levelCompleted;
 
-	bool canMove(QPoint delta);
-	MagazynierCommand *move(QPoint delta);
+	bool canMove(QPoint pos, QPoint delta);
 
 public slots:
 	void moveUp(void);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic