No código rolou uma mudança no comando qtdPista.textContent pra document.getElementById('qtd-pista').textContent. Isso rolou porque o primeiro tava tentando pegar o elemento pelo ID, mas tava usando a variável qtdPista que já era o próprio elemento. O segundo comando tá usando document.getElementById() pra achar o elemento pelo ID, e aí sim consegue pegar o conteúdo certo com textContent.
Sobre o lance de .value e .textContent, é tipo assim: o .value é usado pra tirar o valor de um elemento de formulário, tipo um campo de texto ou uma caixa de seleção. Já o .textContent é mais pro conteúdo de um elemento HTML, tipo um parágrafo ou uma tag de texto.
No código que tá ali, a função comprarPista() tá usando o .textContent pra pegar a quantidade de ingressos 'pista' disponíveis e comparar com a quantidade que a pessoa quer. E a variável qtd tá usando o .value pra pegar a quantidade que a pessoa digitou no formulário.
Então, cê tem que sacar qual usar, se é .value ou .textContent, dependendo do tipo de elemento HTML que tá manipulando. Se for um elemento de formulário, tipo um campo de texto, vai de .value. Se for um elemento de conteúdo, tipo um parágrafo, a pedida é o .textContent.