488 lines
13 KiB
Python
488 lines
13 KiB
Python
"""
|
|
module docs
|
|
"""
|
|
import re
|
|
import turtle as tl
|
|
|
|
from time import sleep as pause
|
|
|
|
from menus import main_menu
|
|
|
|
def ler_falas(file: str) -> dict[str: list[str]]:
|
|
pattern_inicio: str = r"CENA ([\w ]+)\s?"
|
|
pattern_fim: str = r"CENA ([\w ]+) END\s?"
|
|
|
|
falas = dict()
|
|
|
|
with open(file, "r", encoding="utf-8") as arquivo:
|
|
atual = ""
|
|
lendo = True
|
|
|
|
|
|
linha = arquivo.readline()
|
|
while linha != "":
|
|
|
|
inicio = re.search(pattern_inicio, linha)
|
|
fim = re.search(pattern_fim, linha)
|
|
|
|
if inicio:
|
|
atual = inicio.group()[5:-1]
|
|
linha = arquivo.readline()
|
|
lendo = True
|
|
continue
|
|
elif fim:
|
|
lendo = False
|
|
continue
|
|
if lendo == False:
|
|
linha = arquivo.readline()
|
|
continue
|
|
else:
|
|
if falas.get(atual) == None:
|
|
falas[atual] = []
|
|
linha = linha.replace("\\n", "\n")
|
|
falas[atual].append((linha[0], linha[2:-1]))
|
|
linha = arquivo.readline()
|
|
return falas
|
|
|
|
def lerp(inicial: tl.Vec2D, final: tl.Vec2D, t: float) -> tl.Vec2D:
|
|
return inicial + (final - inicial) * t
|
|
|
|
# Função de movimento com troca de sprite
|
|
def goto_animado(personagem: tl.Turtle, x: float, y: float, sprites: list[str], passos: int = 10):
|
|
posicao_inicial: tl.Vec2D = personagem.pos()
|
|
posicao_final: tl.Vec2D = tl.Vec2D(x, y)
|
|
|
|
for posicao in range(passos):
|
|
personagem.shape(sprites[posicao%len(sprites)]) #shape(sprites[posicao % 2]) # Alterna os sprites
|
|
|
|
personagem.goto(lerp(posicao_inicial, posicao_final, 1/(passos + 1) * posicao)) # Move a tartaruga
|
|
|
|
# Funcao para fazer as falas dos personagens
|
|
def falas(personagem: tl.Turtle, text: str, tempo: float = 3) -> None:
|
|
fala.goto(personagem.pos())
|
|
fala.left(45)
|
|
fala.fd(50)
|
|
fala.color("white")
|
|
fala.write(text,False,font=("arial",10,"normal"))
|
|
|
|
pause(tempo)
|
|
|
|
count = 0
|
|
while count <= 3:
|
|
fala.undo()
|
|
count += 1
|
|
|
|
def falar_do_roteiro(roteiro: list[tuple[str, str]], index: int, tempo: float = 3):
|
|
if roteiro[index][0] == "P":
|
|
falas(pinto, roteiro[index][1], tempo)
|
|
elif roteiro[index][0] == "C":
|
|
falas(cobra, roteiro[index][1], tempo)
|
|
return index + 1
|
|
|
|
|
|
def pinto_acha_cobra() -> str:
|
|
"""
|
|
Roteiro da cena 1:
|
|
Lugar misterioso com um baú. O pinto entra na cena. "Eita, um baú totalmente estranho no meio dessa masmorra super perigosa."
|
|
"Baús são legais. Com certeza deve ter algo legal dentro. Vou ver o que tem nele." - Diz o pinto.
|
|
O pinto vai até o baú e tenta abrir ele.
|
|
O baú abre e sai uma cobra de dentro.
|
|
"Vixe, uma cobra!" - Diz o pinto se afastando do baú.
|
|
"Tenha calma pequeno pinto. Eu não sou uma cobra má." - Diz a cobra saindo do baú.
|
|
"Por que eu deveria acreditar em você?" - Diz o pinto se afastando.
|
|
"Porque o meu nome é Python! Cobras com esse nome são confiáveis..." - Diz a cobra.
|
|
"Tipo aquela linguagem de programação?" - Pergunta o pinto.
|
|
"Isso mesmo!" - Responde a cobra.
|
|
"Eu não quero fazer programa!!!" - Diz o pinto enquanto sai de cena
|
|
"Volte aqui pintinho, eu não vou fazer você programar!" - Diz a acobra correndo atrás do pinto.
|
|
Ambos saem de cena.
|
|
"""
|
|
|
|
cena = "pinto_acha_cobra"
|
|
index = 0
|
|
|
|
terminou = "não"
|
|
|
|
tl.addshape("sprites/fundos/fundo_1_bau_fechado.gif")
|
|
bgpic.shape("sprites/fundos/fundo_1_bau_fechado.gif")
|
|
|
|
tl.addshape("sprites/personagens/pinto_.gif")
|
|
pinto.shape("sprites/personagens/pinto_.gif")
|
|
|
|
pinto.goto(-281, -89)
|
|
pinto.showturtle()
|
|
|
|
pinto.goto(-132, -89)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
pinto.goto(28, -89)
|
|
pinto.goto(31, -16)
|
|
|
|
pause(2)
|
|
|
|
tl.addshape("sprites/fundos/fundo_1_bau_aberto.gif")
|
|
bgpic.shape("sprites/fundos/fundo_1_bau_aberto.gif")
|
|
|
|
pause(1)
|
|
|
|
tl.addshape("sprites/personagens/_cobra.gif")
|
|
cobra.shape("sprites/personagens/_cobra.gif")
|
|
|
|
cobra.goto(31, 53)
|
|
cobra.showturtle()
|
|
|
|
pinto.goto(-160, -132)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
cobra.goto(-3, -62)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
pinto.goto(-242, -164)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
cobra.goto(-55, -108)
|
|
index = falar_do_roteiro(falas_dict[cena], index, tempo = 4)
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
tl.addshape("sprites/personagens/_pinto.gif")
|
|
|
|
count = 0
|
|
while count <= 4:
|
|
pinto.shape("sprites/personagens/_pinto.gif")
|
|
pause(0.15)
|
|
pinto.shape("sprites/personagens/pinto_.gif")
|
|
pause(0.15)
|
|
count += 1
|
|
|
|
pinto.shape("sprites/personagens/_pinto.gif")
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
pause(0.5)
|
|
|
|
pinto.goto(-281, -89)
|
|
pinto.hideturtle()
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
cobra.goto(-281, -89)
|
|
cobra.hideturtle()
|
|
|
|
pause(2)
|
|
|
|
terminou = "sim"
|
|
if terminou == "sim":
|
|
return "Finalizou cena"
|
|
else:
|
|
return "Nao conseguiu finalizar a cena"
|
|
|
|
|
|
def pinto_foge_cobra() -> str:
|
|
"""
|
|
Roteiro da cena 2:
|
|
Um lugar da masmorra sombria. Esse lugar tem mais de uma saída. Tem paredes e obstáculos.
|
|
O pinto aparece correndo da cobra. "Ainda bem que eu já passei por aqui!" - Diz ele.
|
|
O pinto então passa pelos lugares certos e vai na direção de cima.
|
|
Enquanto isso a cobra chega no lugar e fica "perdida". "Que lugar estranho! No baú era melhor." - Diz ela.
|
|
Não sabendo para onde foi o pinto, ela diz - "Não sei para onde esse pinto foi..."
|
|
Então ela vai para baixo.
|
|
Ambos fora de cena.
|
|
"""
|
|
|
|
cena = "pinto_foge_cobra"
|
|
index = 0
|
|
|
|
terminou = "não"
|
|
|
|
tl.addshape("sprites/fundos/fundo_2.gif")
|
|
bgpic.shape("sprites/fundos/fundo_2.gif")
|
|
|
|
tl.addshape("sprites/personagens/_pinto.gif")
|
|
pinto.shape("sprites/personagens/_pinto.gif")
|
|
|
|
pinto.goto(286, -26)
|
|
pinto.showturtle()
|
|
|
|
pinto.goto(2, -28)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
tl.addshape("sprites/personagens/pinto_.gif")
|
|
pinto.shape("sprites/personagens/pinto_.gif")
|
|
|
|
pinto.goto(-1, 298)
|
|
pinto.hideturtle()
|
|
|
|
tl.addshape("sprites/personagens/_cobra.gif")
|
|
cobra.shape("sprites/personagens/_cobra.gif")
|
|
|
|
cobra.goto(286, -26)
|
|
cobra.showturtle()
|
|
|
|
cobra.goto(2, -28)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
tl.addshape("sprites/personagens/cobra_.gif")
|
|
|
|
count = 0
|
|
while count <= 4:
|
|
cobra.shape("sprites/personagens/cobra_.gif")
|
|
pause(0.15)
|
|
cobra.shape("sprites/personagens/_cobra.gif")
|
|
pause(0.15)
|
|
count += 1
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
cobra.shape("sprites/personagens/cobra_.gif")
|
|
|
|
cobra.goto(1, -285)
|
|
cobra.hideturtle()
|
|
|
|
pause(2)
|
|
|
|
terminou = "sim"
|
|
if terminou == "sim":
|
|
return "Finalizou cena"
|
|
else:
|
|
return "Nao conseguiu finalizar a cena"
|
|
|
|
def pinto_acha_arma() -> str:
|
|
"""
|
|
Roteiro da cena 3:
|
|
Nessa cena o pinto chega em uma nova sala estranha com um baú.
|
|
"Nossa, outro baú muito perigoso nessa masmorra. Vou abrir!" - Diz o pinto indo em direção ao baú.
|
|
O pinto vai até o baú e após abrir ele, acha um lança-chamas.
|
|
"Isso com certeza vai servir!" - Diz ele segurando a arma e indo para uma outra sala.
|
|
O pinto na outra sala vai para a sala da esquerda.
|
|
A cobra sai debaixo e fala - "Eu achei você!" - Depois ela vai para a sala.
|
|
A cobra segue o pinto. Todos saem de cena.
|
|
"""
|
|
|
|
cena = "pinto_acha_arma"
|
|
index = 0
|
|
|
|
terminou = "não"
|
|
|
|
tl.addshape("sprites/fundos/fundo_3_bau_fechado.gif")
|
|
bgpic.shape("sprites/fundos/fundo_3_bau_fechado.gif")
|
|
|
|
tl.addshape("sprites/personagens/pinto_.gif")
|
|
pinto.shape("sprites/personagens/pinto_.gif")
|
|
pinto.hideturtle()
|
|
|
|
pinto.goto(0, -352)
|
|
pinto.showturtle()
|
|
pinto.goto(0, -16)
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
|
|
tl.addshape("sprites/fundos/fundo_3_bau_aberto.gif")
|
|
bgpic.shape("sprites/fundos/fundo_3_bau_aberto.gif")
|
|
|
|
tl.addshape("sprites/objetos/lancachamas.gif")
|
|
lanca_chamas.shape("sprites/objetos/lancachamas.gif")
|
|
|
|
lanca_chamas.goto(0, 64)
|
|
|
|
lanca_chamas.showturtle()
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
lanca_chamas.hideturtle()
|
|
|
|
tl.addshape("sprites/personagens/_pinto_flamer.gif")
|
|
pinto.shape("sprites/personagens/_pinto_flamer.gif")
|
|
|
|
pause(1)
|
|
|
|
pinto.goto(0, -352)
|
|
|
|
|
|
# OUTRA SALA ----------------------------------------------------------------------------------------
|
|
|
|
|
|
tl.addshape("sprites/fundos/fundo_2.gif")
|
|
bgpic.shape("sprites/fundos/fundo_2.gif")
|
|
|
|
pinto.hideturtle()
|
|
pinto.goto(0, 352)
|
|
pinto.showturtle()
|
|
|
|
pinto.goto(0, 0)
|
|
|
|
pinto.goto(-352, 0)
|
|
|
|
tl.addshape("sprites/personagens/_cobra.gif")
|
|
cobra.shape("sprites/personagens/_cobra.gif")
|
|
|
|
cobra.hideturtle()
|
|
cobra.goto(0, -352)
|
|
cobra.showturtle()
|
|
|
|
cobra.goto(0, 0)
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
cobra.goto(-352, 0)
|
|
|
|
pause(2)
|
|
|
|
terminou = "sim"
|
|
if terminou == "sim":
|
|
return "Finalizou cena"
|
|
else:
|
|
return "Nao conseguiu finalizar a cena"
|
|
|
|
def pinto_mata_cobra() -> str:
|
|
"""
|
|
Roteiro da cena 4:
|
|
O pinto com a sua arma chega na nova sala da masmorra e fica mirando para a porta esperando a cobra.
|
|
"Daqui não tem como errar..." - Diz o pinto.
|
|
A cobra chega na sala indo em direção ao pinto. "Vou te alcançar!" Diz ela.
|
|
Com a cobra se aproximando do pinto. O pinto aperta o gatilho e sai uma rajada de fogo na cobra; ela morre cremada.
|
|
"Parece que agora eu não sou o 'pequeno pinto', né?" Diz o pinto.
|
|
O pinto deixa o lança chamas no chão.
|
|
"Vou voltar a explorar essa masmorra legal." Diz o pinto.
|
|
Ele sai da cena.
|
|
"""
|
|
|
|
cena = "pinto_mata_cobra"
|
|
index = 0
|
|
|
|
terminou = "não"
|
|
|
|
tl.addshape("sprites/fundos/fundo_4.gif")
|
|
bgpic.shape("sprites/fundos/fundo_4.gif")
|
|
|
|
tl.addshape("sprites/personagens/_pinto_flamer.gif")
|
|
pinto.shape("sprites/personagens/_pinto_flamer.gif")
|
|
|
|
pinto.hideturtle()
|
|
pinto.goto(290, -123)
|
|
pinto.showturtle()
|
|
|
|
pinto.goto(-134, -121)
|
|
|
|
tl.addshape("sprites/personagens/pinto_flamer_.gif")
|
|
pinto.shape("sprites/personagens/pinto_flamer_.gif")
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
tl.addshape("sprites/personagens/_cobra.gif")
|
|
cobra.shape("sprites/personagens/_cobra.gif")
|
|
|
|
cobra.hideturtle()
|
|
cobra.goto(290, -123)
|
|
|
|
cobra.showturtle()
|
|
cobra.goto(150, -121)
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index)
|
|
|
|
cobra.goto(5, -121)
|
|
|
|
tl.addshape("sprites/objetos/fogo.gif")
|
|
fogo.shape("sprites/objetos/fogo.gif")
|
|
|
|
fogo.goto(-50, -121)
|
|
fogo.showturtle()
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index, tempo=1.5)
|
|
|
|
pause(1.5)
|
|
|
|
tl.addshape("sprites/personagens/_cobra_burnt.gif")
|
|
cobra.shape("sprites/personagens/_cobra_burnt.gif")
|
|
|
|
fogo.hideturtle()
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index, tempo = 1)
|
|
|
|
index = falar_do_roteiro(falas_dict[cena], index, tempo=4.5)
|
|
|
|
tl.addshape("sprites/personagens/pinto_.gif")
|
|
pinto.shape("sprites/personagens/pinto_.gif")
|
|
|
|
tl.addshape("sprites/objetos/lancachamas.gif")
|
|
lanca_chamas.shape("sprites/objetos/lancachamas.gif")
|
|
|
|
lanca_chamas.goto(-112, -131)
|
|
lanca_chamas.showturtle()
|
|
|
|
pinto.goto(-297, -112)
|
|
pinto.hideturtle()
|
|
|
|
pause(2)
|
|
|
|
terminou = "sim"
|
|
if terminou == "sim":
|
|
return "Finalizou cena"
|
|
else:
|
|
return "Nao conseguiu finalizar a cena"
|
|
|
|
def main() -> None:
|
|
"""
|
|
Funcao main que chama as funcoes de cada cena da animacao
|
|
"""
|
|
|
|
scene_num = int(input(main_menu)) # input para saber qual cena ver
|
|
|
|
while scene_num != 6:
|
|
if scene_num == 1:
|
|
pinto_acha_cobra()
|
|
elif scene_num == 2:
|
|
pinto_foge_cobra()
|
|
elif scene_num == 3:
|
|
pinto_acha_arma()
|
|
elif scene_num == 4:
|
|
pinto_mata_cobra()
|
|
elif scene_num == 5: # adicionado para verificar cenas da animacao sem pausa
|
|
pinto_acha_cobra()
|
|
pinto_foge_cobra()
|
|
pinto_acha_arma()
|
|
pinto_mata_cobra()
|
|
else:
|
|
print("Cena nao disponivel")
|
|
|
|
scene_num = int(input(main_menu))
|
|
|
|
exit() # sair do programa caso escolha a opcao 6
|
|
|
|
if __name__ == "__main__":
|
|
# spawna a tela com suas config
|
|
tl.setup(600,600,None,None)
|
|
tl.bgcolor("black")
|
|
tl.title("A Lenda de Javi, O Grande pinto")
|
|
|
|
# Variaveis usadas para definir fundos, personagens, objetos e falas
|
|
bgpic = tl.Turtle()
|
|
bgpic.up()
|
|
|
|
|
|
pinto = tl.Turtle(visible=False)
|
|
pinto.up()
|
|
|
|
|
|
cobra = tl.Turtle(visible=False)
|
|
cobra.up()
|
|
|
|
|
|
fogo = tl.Turtle(visible=False)
|
|
fogo.up()
|
|
|
|
|
|
lanca_chamas = tl.Turtle(visible=False)
|
|
lanca_chamas.up()
|
|
|
|
|
|
fala = tl.Turtle(visible=False)
|
|
fala.up()
|
|
|
|
falas_dict = ler_falas("falas.txt")
|
|
|
|
index = 0
|
|
|
|
main() #chamando funcao principal
|
|
|
|
tl.mainloop()
|
|
|