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); }