Esempio n. 1
0
PlayfieldNode TetrisAI::lock(PlayfieldNode node,
		PlayfieldPosition instruction) {
	// Generate instructed tetromino
	Tetromino lockingTetromino;
	lockingTetromino.generate(instruction.ttype);
	for (int rotation = 0; rotation < instruction.rotation; rotation++) {
		lockingTetromino.clock();
	}

	// Locking
	vector<TetrominoCRS> blockPosArry = lockingTetromino.getBlockPos();
	for (vector<TetrominoCRS>::iterator it = blockPosArry.begin();
			it != blockPosArry.end(); it++) {
		int blockX = instruction.x + (it->x - 0.5);
		int blockY = instruction.y + (it->y - 0.5);
		node.mSimplePlayfield[blockX][blockY] = true;
	}
	lineCheck(node);
	node.mTetrominoPositions.push_back(instruction);
	return node;
}
bool MapCollision::lineOfMovement(const float& x1, const float& y1, const float& x2, const float& y2, int movement_type) {
	if (isOutsideMap(x2, y2)) return false;

	// intangible entities can always move
	if (movement_type == MOVE_INTANGIBLE) return true;

	// if the target is blocking, clear it temporarily
	int tile_x = int(x2);
	int tile_y = int(y2);
	bool target_blocks = false;
	int target_blocks_type = colmap[tile_x][tile_y];
	if (colmap[tile_x][tile_y] == BLOCKS_ENTITIES || colmap[tile_x][tile_y] == BLOCKS_ENEMIES) {
		target_blocks = true;
		unblock(x2,y2);
	}

	bool has_movement = lineCheck(x1, y1, x2, y2, CHECK_MOVEMENT, movement_type);

	if (target_blocks) block(x2,y2, target_blocks_type == BLOCKS_ENEMIES);
	return has_movement;

}
bool MapCollision::lineOfSight(const float& x1, const float& y1, const float& x2, const float& y2) {
	return lineCheck(x1, y1, x2, y2, CHECK_SIGHT, MOVE_NORMAL);
}