Bom Dia Matheus,
O código funciona perfeitamente e está muito bonito e fácil de entender, além de que as novas funcionalidades ficaram bem legais. Deixo as minhas ressalvas principalmente quanto algumas questões da lógica como comentários a seguir e deixei um exemplo de como eu escreveria aqui:
from random import randint
print("---------------------------------")
print("Bem vindo ao jogo de adivinhação!")
print("---------------------------------")
# váriavel principal
tentativas = 3
rodada = 1
while tentativas >= rodada: #ao invés de verificar se é maior ou igual verifica só se é maior aí não precisaria de todos as verificações nos ifs
# Declarando variável principal
numero_secreto = randint(0, 100)
# Entrada do usuário
print("\nTentativa {0} de 3 ".format(rodada, tentativas))
chute = int(input("Digite o seu número: "))
# variáveis secundárias
acertou = chute == numero_secreto
maior = chute > numero_secreto
menor = chute < numero_secreto
quase = chute == numero_secreto - 1 or chute == numero_secreto + 1
errou = chute != numero_secreto #essa variável não é necessária pois você já está verificando se acertou
# respostas ao usuário
if acertou:
print("Você acertou o número secreto, Parabéns!")
break
else:
if maior and rodada != tentativas:
print("ERROU!\nDica: O valor digitado é maior que o número secreto!")
elif menor and rodada != tentativas:
print("ERROU!\nDica: O valor digitado é menor que o número secreto!")
if quase and rodada != tentativas:
print("Dica bônus: Você chegou muito perto de acertar! Tente outra vez!")
if rodada == tentativas:
print("Suas tentativas acabaram!\n")
if errou: #Essa linha não é necessária, porque o primeiro if já verifica se a pessoa acertou, então se ela entrou no else significa que errou
rodada = rodada + 1
if errou and rodada == tentativas + 1:
print("_____________GAME OVER_____________")