diff --git a/CInemon-IP/README.md b/CInemon-IP/README.md
new file mode 100644
index 0000000..37c28cf
--- /dev/null
+++ b/CInemon-IP/README.md
@@ -0,0 +1,34 @@
+CINEMON IP - A Revolução
+
+HISTÓRIA:
+Você é um estudante da UFPE recrutado para conter a revolução de Pedro Noites, que criou criaturas digitais (CInemons) para dominar o campus e restaurar a grade antiga do CIn. Seu objetivo é escolher 3 CInemons e enfrentar os líderes revolucionários para restaurar a ordem acadêmica.
+
+COMO JOGAR:
+- Movimento: WASD ou setas
+- Interação: Espaço
+- Menu: ESC
+- Batalhas:
+ 1/2: Ataques
+ 3: Trocar CInemon
+
+CINEMONS DISPONÍVEIS:
+🔥 Fogo: Heatbug, Patchburn
+⚡ Elétrico: Pikacode, Ampereon
+🌍 Terra: Minerbit, Terrabyte
+💧 Água: Hydrabyte, Debbubble
+🌿 Planta: Dataflora, Treebit
+
+CHEFES:
+1. (Área 2)
+2. (CAC)
+3. Pedro Noites (CIn) - com Paradoxium (tipo Discreto)
+
+SISTEMA DE BATALHA:
+Fogo > Planta > Terra > Elétrico > Água > Fogo
+Tipos Especiais têm resistências únicas.
+
+OBJETIVO FINAL:
+Chegar no CIn, recuperando os pedaços dos crachás e impedindo Pedro Noites de restaurar a antiga grade do CIn
+
+Gênero: RPG Acadêmico-Tático
+Plataforma: PC (Python/Pygame)
diff --git a/CInemon-IP/cinemons/Aetherbyte.png b/CInemon-IP/cinemons/Aetherbyte.png
new file mode 100644
index 0000000..b09373f
Binary files /dev/null and b/CInemon-IP/cinemons/Aetherbyte.png differ
diff --git a/CInemon-IP/cinemons/Aqualynx.png b/CInemon-IP/cinemons/Aqualynx.png
new file mode 100644
index 0000000..2d58e4f
Binary files /dev/null and b/CInemon-IP/cinemons/Aqualynx.png differ
diff --git a/CInemon-IP/cinemons/Bitwhale.png b/CInemon-IP/cinemons/Bitwhale.png
new file mode 100644
index 0000000..0de8af2
Binary files /dev/null and b/CInemon-IP/cinemons/Bitwhale.png differ
diff --git a/CInemon-IP/cinemons/Butterfault.png b/CInemon-IP/cinemons/Butterfault.png
new file mode 100644
index 0000000..1500eec
Binary files /dev/null and b/CInemon-IP/cinemons/Butterfault.png differ
diff --git a/CInemon-IP/cinemons/Discretex.png b/CInemon-IP/cinemons/Discretex.png
new file mode 100644
index 0000000..2fbc27a
Binary files /dev/null and b/CInemon-IP/cinemons/Discretex.png differ
diff --git a/CInemon-IP/cinemons/Emberfang.png b/CInemon-IP/cinemons/Emberfang.png
new file mode 100644
index 0000000..662dfca
Binary files /dev/null and b/CInemon-IP/cinemons/Emberfang.png differ
diff --git a/CInemon-IP/cinemons/Firewall.png b/CInemon-IP/cinemons/Firewall.png
new file mode 100644
index 0000000..faa9dfc
Binary files /dev/null and b/CInemon-IP/cinemons/Firewall.png differ
diff --git a/CInemon-IP/cinemons/Granitex.png b/CInemon-IP/cinemons/Granitex.png
new file mode 100644
index 0000000..5abd81a
Binary files /dev/null and b/CInemon-IP/cinemons/Granitex.png differ
diff --git a/CInemon-IP/cinemons/Grasscat.png b/CInemon-IP/cinemons/Grasscat.png
new file mode 100644
index 0000000..1b3e7e9
Binary files /dev/null and b/CInemon-IP/cinemons/Grasscat.png differ
diff --git a/CInemon-IP/cinemons/Leafbyte.png b/CInemon-IP/cinemons/Leafbyte.png
new file mode 100644
index 0000000..1b0314b
Binary files /dev/null and b/CInemon-IP/cinemons/Leafbyte.png differ
diff --git a/CInemon-IP/cinemons/MinerByte.png b/CInemon-IP/cinemons/MinerByte.png
new file mode 100644
index 0000000..86016d6
Binary files /dev/null and b/CInemon-IP/cinemons/MinerByte.png differ
diff --git a/CInemon-IP/cinemons/Paradoxium.png b/CInemon-IP/cinemons/Paradoxium.png
new file mode 100644
index 0000000..8572ab3
Binary files /dev/null and b/CInemon-IP/cinemons/Paradoxium.png differ
diff --git a/CInemon-IP/cinemons/Redlion.png b/CInemon-IP/cinemons/Redlion.png
new file mode 100644
index 0000000..16bc5b5
Binary files /dev/null and b/CInemon-IP/cinemons/Redlion.png differ
diff --git a/CInemon-IP/cinemons/Serpython.png b/CInemon-IP/cinemons/Serpython.png
new file mode 100644
index 0000000..3f9c180
Binary files /dev/null and b/CInemon-IP/cinemons/Serpython.png differ
diff --git a/CInemon-IP/cinemons/Terrabyte.png b/CInemon-IP/cinemons/Terrabyte.png
new file mode 100644
index 0000000..367ee51
Binary files /dev/null and b/CInemon-IP/cinemons/Terrabyte.png differ
diff --git a/CInemon-IP/cinemons/pikacode.png b/CInemon-IP/cinemons/pikacode.png
new file mode 100644
index 0000000..74e2c04
Binary files /dev/null and b/CInemon-IP/cinemons/pikacode.png differ
diff --git a/CInemon-IP/code/__pycache__/batalha_ui.cpython-311.pyc b/CInemon-IP/code/__pycache__/batalha_ui.cpython-311.pyc
new file mode 100644
index 0000000..05a9821
Binary files /dev/null and b/CInemon-IP/code/__pycache__/batalha_ui.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/batalha_ui.cpython-312.pyc b/CInemon-IP/code/__pycache__/batalha_ui.cpython-312.pyc
new file mode 100644
index 0000000..3bb4549
Binary files /dev/null and b/CInemon-IP/code/__pycache__/batalha_ui.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/batalha_ui.cpython-313.pyc b/CInemon-IP/code/__pycache__/batalha_ui.cpython-313.pyc
new file mode 100644
index 0000000..f892adb
Binary files /dev/null and b/CInemon-IP/code/__pycache__/batalha_ui.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/cinemon.cpython-311.pyc b/CInemon-IP/code/__pycache__/cinemon.cpython-311.pyc
new file mode 100644
index 0000000..114f07f
Binary files /dev/null and b/CInemon-IP/code/__pycache__/cinemon.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/cinemon.cpython-312.pyc b/CInemon-IP/code/__pycache__/cinemon.cpython-312.pyc
new file mode 100644
index 0000000..b0671e2
Binary files /dev/null and b/CInemon-IP/code/__pycache__/cinemon.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/cinemon.cpython-313.pyc b/CInemon-IP/code/__pycache__/cinemon.cpython-313.pyc
new file mode 100644
index 0000000..5c789bf
Binary files /dev/null and b/CInemon-IP/code/__pycache__/cinemon.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/config.cpython-311.pyc b/CInemon-IP/code/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000..a0846c0
Binary files /dev/null and b/CInemon-IP/code/__pycache__/config.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/config.cpython-312.pyc b/CInemon-IP/code/__pycache__/config.cpython-312.pyc
new file mode 100644
index 0000000..b79b6a8
Binary files /dev/null and b/CInemon-IP/code/__pycache__/config.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/config.cpython-313.pyc b/CInemon-IP/code/__pycache__/config.cpython-313.pyc
new file mode 100644
index 0000000..a27b6ec
Binary files /dev/null and b/CInemon-IP/code/__pycache__/config.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/gema.cpython-311.pyc b/CInemon-IP/code/__pycache__/gema.cpython-311.pyc
new file mode 100644
index 0000000..79b6d66
Binary files /dev/null and b/CInemon-IP/code/__pycache__/gema.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/gema.cpython-312.pyc b/CInemon-IP/code/__pycache__/gema.cpython-312.pyc
new file mode 100644
index 0000000..08bdaa8
Binary files /dev/null and b/CInemon-IP/code/__pycache__/gema.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/gema.cpython-313.pyc b/CInemon-IP/code/__pycache__/gema.cpython-313.pyc
new file mode 100644
index 0000000..a42fead
Binary files /dev/null and b/CInemon-IP/code/__pycache__/gema.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/inimigo.cpython-311.pyc b/CInemon-IP/code/__pycache__/inimigo.cpython-311.pyc
new file mode 100644
index 0000000..02cc30d
Binary files /dev/null and b/CInemon-IP/code/__pycache__/inimigo.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/inimigo.cpython-312.pyc b/CInemon-IP/code/__pycache__/inimigo.cpython-312.pyc
new file mode 100644
index 0000000..e127865
Binary files /dev/null and b/CInemon-IP/code/__pycache__/inimigo.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/inimigo.cpython-313.pyc b/CInemon-IP/code/__pycache__/inimigo.cpython-313.pyc
new file mode 100644
index 0000000..5d7bd24
Binary files /dev/null and b/CInemon-IP/code/__pycache__/inimigo.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_base.cpython-311.pyc b/CInemon-IP/code/__pycache__/jogo_base.cpython-311.pyc
new file mode 100644
index 0000000..050b8bd
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_base.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_base.cpython-312.pyc b/CInemon-IP/code/__pycache__/jogo_base.cpython-312.pyc
new file mode 100644
index 0000000..eb5c007
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_base.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_base.cpython-313.pyc b/CInemon-IP/code/__pycache__/jogo_base.cpython-313.pyc
new file mode 100644
index 0000000..307dd2b
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_base.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_ui.cpython-311.pyc b/CInemon-IP/code/__pycache__/jogo_ui.cpython-311.pyc
new file mode 100644
index 0000000..9136aba
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_ui.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_ui.cpython-312.pyc b/CInemon-IP/code/__pycache__/jogo_ui.cpython-312.pyc
new file mode 100644
index 0000000..1679d5c
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_ui.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/jogo_ui.cpython-313.pyc b/CInemon-IP/code/__pycache__/jogo_ui.cpython-313.pyc
new file mode 100644
index 0000000..d0bd35e
Binary files /dev/null and b/CInemon-IP/code/__pycache__/jogo_ui.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/main.cpython-311.pyc b/CInemon-IP/code/__pycache__/main.cpython-311.pyc
new file mode 100644
index 0000000..c8ea968
Binary files /dev/null and b/CInemon-IP/code/__pycache__/main.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/npc.cpython-311.pyc b/CInemon-IP/code/__pycache__/npc.cpython-311.pyc
new file mode 100644
index 0000000..f3f809e
Binary files /dev/null and b/CInemon-IP/code/__pycache__/npc.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/npc.cpython-312.pyc b/CInemon-IP/code/__pycache__/npc.cpython-312.pyc
new file mode 100644
index 0000000..26a8dd1
Binary files /dev/null and b/CInemon-IP/code/__pycache__/npc.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/npc.cpython-313.pyc b/CInemon-IP/code/__pycache__/npc.cpython-313.pyc
new file mode 100644
index 0000000..b4bcb0e
Binary files /dev/null and b/CInemon-IP/code/__pycache__/npc.cpython-313.pyc differ
diff --git a/CInemon-IP/code/__pycache__/personagem.cpython-311.pyc b/CInemon-IP/code/__pycache__/personagem.cpython-311.pyc
new file mode 100644
index 0000000..60834a5
Binary files /dev/null and b/CInemon-IP/code/__pycache__/personagem.cpython-311.pyc differ
diff --git a/CInemon-IP/code/__pycache__/personagem.cpython-312.pyc b/CInemon-IP/code/__pycache__/personagem.cpython-312.pyc
new file mode 100644
index 0000000..ecb2712
Binary files /dev/null and b/CInemon-IP/code/__pycache__/personagem.cpython-312.pyc differ
diff --git a/CInemon-IP/code/__pycache__/personagem.cpython-313.pyc b/CInemon-IP/code/__pycache__/personagem.cpython-313.pyc
new file mode 100644
index 0000000..6f5c0a4
Binary files /dev/null and b/CInemon-IP/code/__pycache__/personagem.cpython-313.pyc differ
diff --git a/CInemon-IP/code/batalha_ui.py b/CInemon-IP/code/batalha_ui.py
new file mode 100644
index 0000000..d83628a
--- /dev/null
+++ b/CInemon-IP/code/batalha_ui.py
@@ -0,0 +1,221 @@
+import pygame
+import sys
+import os
+from jogo_base import JogoBase
+from config import (tela, fonte, fonte_grande, relogio, CINZA, BRANCO, PRETO, VERMELHO, AZUL, VERDE, LARGURA, ALTURA)
+
+class BatalhaUI(JogoBase):
+ def __init__(self):
+ super().__init__()
+ self.tempo_tremor_jogador = 0
+ self.tempo_tremor_inimigo = 0
+ self.tremor_offset_jogador = [0, 0]
+ self.tremor_offset_inimigo = [0, 0]
+ self.hp_jogador_anterior = None
+ self.hp_inimigo_anterior = None
+ self.sprites_cache = {}
+
+ def carregar_sprite_cinemon(self, nome, tamanho):
+ """Carrega o sprite do CInemon com o tamanho especificado."""
+ chave_cache = f"{nome}_{tamanho[0]}x{tamanho[1]}"
+ if chave_cache in self.sprites_cache:
+ return self.sprites_cache[chave_cache]
+
+ sprite_path = os.path.join(r"Desktop\CInemon-IP\cinemons", f"{nome}.png")
+ try:
+ sprite = pygame.image.load(sprite_path).convert_alpha()
+ sprite = pygame.transform.scale(sprite, tamanho)
+ self.sprites_cache[chave_cache] = sprite
+ return sprite
+ except Exception as e:
+ print(f"Erro ao carregar sprite do CInemon {nome}: {e}")
+ return None
+
+ def desenhar_barra_vida(self, tela, x, y, hp_atual, hp_max, tempo_tremor, tremor_offset):
+ largura_barra = 200
+ altura_barra = 20
+ hp_atual = max(0, hp_atual)
+ proporcao = hp_atual / hp_max
+ largura_verde = int(largura_barra * proporcao)
+
+ offset_x = tremor_offset[0] if tempo_tremor > 0 else 0
+ offset_y = tremor_offset[1] if tempo_tremor > 0 else 0
+
+ pygame.draw.rect(tela, VERMELHO, (x + offset_x, y + offset_y, largura_barra, altura_barra))
+ pygame.draw.rect(tela, VERDE, (x + offset_x, y + offset_y, largura_verde, altura_barra))
+ pygame.draw.rect(tela, PRETO, (x + offset_x, y + offset_y, largura_barra, altura_barra), 2)
+
+ def renderizar_batalha(self, jogo):
+ tela.fill((200, 230, 255))
+
+ # Atualizar offsets de tremor
+ if self.tempo_tremor_jogador > 0:
+ self.tremor_offset_jogador = [pygame.time.get_ticks() % 2 * 4 - 2, pygame.time.get_ticks() % 2 * 4 - 2]
+ self.tempo_tremor_jogador -= 1
+ if self.tempo_tremor_inimigo > 0:
+ self.tremor_offset_inimigo = [pygame.time.get_ticks() % 2 * 4 - 2, pygame.time.get_ticks() % 2 * 4 - 2]
+ self.tempo_tremor_inimigo -= 1
+
+ pygame.draw.rect(tela, AZUL, (50, 50, 400, 200))
+ pygame.draw.rect(tela, VERMELHO, (LARGURA - 450, 50, 400, 200))
+
+ jogador = jogo.cinemon_jogador_atual
+ nome_jogador = fonte_grande.render(jogador.nome, True, BRANCO)
+ hp_jogador = fonte.render(f"HP: {max(0, jogador.hp)}/{jogador.hp_max}", True, BRANCO)
+ tela.blit(nome_jogador, (70, 70))
+ tela.blit(hp_jogador, (70, 110))
+ self.desenhar_barra_vida(tela, 70, 150, jogador.hp, jogador.hp_max,
+ self.tempo_tremor_jogador, self.tremor_offset_jogador)
+ sprite_jogador = self.carregar_sprite_cinemon(jogador.nome, (300, 300))
+ sprite_jogador_x = 70 + (self.tremor_offset_jogador[0] if self.tempo_tremor_jogador > 0 else 0)
+ sprite_jogador_y = 220 + (self.tremor_offset_jogador[1] if self.tempo_tremor_jogador > 0 else 0)
+ if sprite_jogador:
+ tela.blit(sprite_jogador, (sprite_jogador_x, sprite_jogador_y))
+ else:
+ pygame.draw.rect(tela, jogador.cor, (sprite_jogador_x, sprite_jogador_y, 300, 300))
+
+ inimigo = jogo.cinemon_inimigo_atual
+ nome_inimigo = fonte_grande.render(inimigo.nome, True, BRANCO)
+ hp_inimigo = fonte.render(f"HP: {max(0, inimigo.hp)}/{inimigo.hp_max}", True, BRANCO)
+ tela.blit(nome_inimigo, (LARGURA - 430, 70))
+ tela.blit(hp_inimigo, (LARGURA - 430, 110))
+ self.desenhar_barra_vida(tela, LARGURA - 430, 150, inimigo.hp, inimigo.hp_max,
+ self.tempo_tremor_inimigo, self.tremor_offset_inimigo)
+ sprite_inimigo = self.carregar_sprite_cinemon(inimigo.nome, (300, 300))
+ sprite_inimigo_x = (LARGURA - 430) + (self.tremor_offset_inimigo[0] if self.tempo_tremor_inimigo > 0 else 0)
+ sprite_inimigo_y = 220 + (self.tremor_offset_inimigo[1] if self.tempo_tremor_inimigo > 0 else 0)
+ if sprite_inimigo:
+ tela.blit(sprite_inimigo, (sprite_inimigo_x, sprite_inimigo_y))
+ else:
+ pygame.draw.rect(tela, inimigo.cor, (sprite_inimigo_x, sprite_inimigo_y, 300, 300))
+
+ pygame.draw.rect(tela, BRANCO, (50, ALTURA - 200, LARGURA - 100, 150))
+ pygame.draw.rect(tela, PRETO, (50, ALTURA - 200, LARGURA - 100, 150), 2)
+
+ linhas = jogo.mensagem_atual.split('\n')
+ for i, linha in enumerate(linhas):
+ texto = fonte.render(linha, True, PRETO)
+ tela.blit(texto, (70, ALTURA - 180 + i * 30))
+
+ if jogo.fase_batalha == 0 and jogo.turno_jogador and not jogo.aguardando_espaco:
+ opcoes = fonte.render(f"1. {jogador.ataques[0][0]} 2. {jogador.ataques[1][0]} 3. Trocar", True, PRETO)
+ tela.blit(opcoes, (LARGURA//2 - opcoes.get_width()//2, ALTURA - 50))
+
+ if jogo.aguardando_espaco:
+ instrucao = fonte.render("Pressione ESPAÇO para continuar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 50))
+
+ self.hp_jogador_anterior = jogador.hp
+ self.hp_inimigo_anterior = inimigo.hp
+
+ def tela_trocar_cinemon(self, jogo):
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_1 and len(jogo.jogador_cinemons) >= 1 and jogo.jogador_cinemons[0].hp > 0:
+ antigo = jogo.cinemon_jogador_atual.nome
+ jogo.cinemon_jogador_atual = jogo.jogador_cinemons[0]
+ jogo.mensagem_atual = f"Você trocou {antigo} por {jogo.cinemon_jogador_atual.nome}!"
+ jogo.estado = "batalha"
+ jogo.fase_batalha = 0
+ jogo.turno_jogador = True
+ jogo.aguardando_espaco = False
+ elif evento.key == pygame.K_2 and len(jogo.jogador_cinemons) >= 2 and jogo.jogador_cinemons[1].hp > 0:
+ antigo = jogo.cinemon_jogador_atual.nome
+ jogo.cinemon_jogador_atual = jogo.jogador_cinemons[1]
+ jogo.mensagem_atual = f"Você trocou {antigo} por {jogo.cinemon_jogador_atual.nome}!"
+ jogo.estado = "batalha"
+ jogo.fase_batalha = 0
+ jogo.turno_jogador = True
+ jogo.aguardando_espaco = False
+ elif evento.key == pygame.K_3 and len(jogo.jogador_cinemons) >= 3 and jogo.jogador_cinemons[2].hp > 0:
+ antigo = jogo.cinemon_jogador_atual.nome
+ jogo.cinemon_jogador_atual = jogo.jogador_cinemons[2]
+ jogo.mensagem_atual = f"Você trocou {antigo} por {jogo.cinemon_jogador_atual.nome}!"
+ jogo.estado = "batalha"
+ jogo.fase_batalha = 0
+ jogo.turno_jogador = True
+ jogo.aguardando_espaco = False
+ elif evento.key == pygame.K_ESCAPE:
+ jogo.estado = "batalha"
+
+ tela.fill((200, 200, 255))
+ titulo = fonte_grande.render("Escolha um CInemon", True, PRETO)
+ tela.blit(titulo, (LARGURA//2 - titulo.get_width()//2, 50))
+
+ for i, cinemon in enumerate(jogo.jogador_cinemons):
+ y = 150 + i * 150
+ retangulo_x = LARGURA//2 - 250
+ retangulo_largura = 500
+ retangulo_altura = 120
+
+ pygame.draw.rect(tela, BRANCO if cinemon.hp > 0 else CINZA,
+ (retangulo_x, y, retangulo_largura, retangulo_altura))
+ pygame.draw.rect(tela, PRETO,
+ (retangulo_x, y, retangulo_largura, retangulo_altura), 2)
+
+ sprite = self.carregar_sprite_cinemon(cinemon.nome, (100, 100))
+ sprite_x = retangulo_x + 20
+ sprite_y = y + (retangulo_altura - 100) // 2
+ if sprite:
+ tela.blit(sprite, (sprite_x, sprite_y))
+ else:
+ pygame.draw.rect(tela, cinemon.cor, (sprite_x, sprite_y, 100, 100))
+
+ texto_x = retangulo_x + 140
+ nome = fonte.render(f"{i+1}. {cinemon.nome} ({cinemon.tipo})", True, PRETO)
+ hp = fonte.render(f"HP: {max(0, cinemon.hp)}/{cinemon.hp_max}", True, PRETO)
+ status = fonte.render("ATIVO" if cinemon.hp > 0 else "DESMAIADO",
+ True, VERMELHO if cinemon.hp <= 0 else VERDE)
+
+ tela.blit(nome, (texto_x, y + 20))
+ tela.blit(hp, (texto_x, y + 50))
+ tela.blit(status, (texto_x, y + 80))
+
+ instrucao = fonte.render("Pressione 1-3 para escolher ou ESC para cancelar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 50))
+
+ def processar_batalha(self, jogo):
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_SPACE and jogo.aguardando_espaco:
+ jogo.aguardando_espaco = False
+ if jogo.cinemon_inimigo_atual.hp <= 0:
+ jogo.proximo_inimigo()
+ elif jogo.cinemon_jogador_atual.hp <= 0 and any(c.hp > 0 for c in jogo.jogador_cinemons):
+ jogo.estado = "trocar_cinemon"
+ elif jogo.cinemon_jogador_atual.hp <= 0 and not any(c.hp > 0 for c in jogo.jogador_cinemons):
+ pygame.quit()
+ sys.exit()
+ elif jogo.fase_batalha == 1:
+ jogo.fase_batalha = 2
+ jogo.turno_jogador = False
+ jogo.mensagem_atual = f"{jogo.cinemon_inimigo_atual.nome} está atacando..."
+ pygame.time.delay(1000)
+ hp_inimigo_antes = jogo.cinemon_inimigo_atual.hp
+ jogo.executar_ataque_inimigo()
+ if self.hp_jogador_anterior is not None and jogo.cinemon_jogador_atual.hp < self.hp_jogador_anterior:
+ self.tempo_tremor_jogador = 15
+ elif jogo.fase_batalha == 3:
+ jogo.fase_batalha = 0
+ jogo.turno_jogador = True
+ if jogo.fase_batalha == 0 and jogo.turno_jogador and not jogo.aguardando_espaco:
+ if evento.key == pygame.K_1:
+ jogo.acao_selecionada = 0
+ hp_inimigo_antes = jogo.cinemon_inimigo_atual.hp
+ jogo.executar_ataque_jogador()
+ if hp_inimigo_antes is not None and jogo.cinemon_inimigo_atual.hp < hp_inimigo_antes:
+ self.tempo_tremor_inimigo = 15
+ elif evento.key == pygame.K_2:
+ jogo.acao_selecionada = 1
+ hp_inimigo_antes = jogo.cinemon_inimigo_atual.hp
+ jogo.executar_ataque_jogador()
+ if hp_inimigo_antes is not None and jogo.cinemon_inimigo_atual.hp < hp_inimigo_antes:
+ self.tempo_tremor_inimigo = 15
+ elif evento.key == pygame.K_3:
+ jogo.estado = "trocar_cinemon"
\ No newline at end of file
diff --git a/CInemon-IP/code/cinemon.py b/CInemon-IP/code/cinemon.py
new file mode 100644
index 0000000..fb4b7f4
--- /dev/null
+++ b/CInemon-IP/code/cinemon.py
@@ -0,0 +1,22 @@
+from config import *
+
+class CInemon:
+ def __init__(self, nome, tipo, hp_max, velocidade, ataques):
+ self.nome = nome
+ self.tipo = tipo
+ self.hp = hp_max
+ self.hp_max = hp_max
+ self.velocidade = velocidade
+ self.ataques = ataques
+ self.cor = self._definir_cor_tipo()
+
+ def _definir_cor_tipo(self):
+ cores = {
+ "FOGO": VERMELHO,
+ "AGUA": AZUL,
+ "PLANTA": VERDE,
+ "ELETRICO": AMARELO,
+ "TERRA": MARROM,
+ "ESPECIAL": ROXO
+ }
+ return cores.get(self.tipo, BRANCO)
\ No newline at end of file
diff --git a/CInemon-IP/code/config.py b/CInemon-IP/code/config.py
new file mode 100644
index 0000000..a9c9e5b
--- /dev/null
+++ b/CInemon-IP/code/config.py
@@ -0,0 +1,35 @@
+# config.py
+import pygame
+
+# Constants
+LARGURA = 1280
+ALTURA = 720
+VERDE = (0, 128, 0)
+BRANCO = (255, 255, 255)
+PRETO = (0, 0, 0)
+VERMELHO = (255, 0, 0)
+AZUL = (0, 0, 255)
+ROXO = (128, 0, 128)
+CINZA = (128, 128, 128)
+AMARELO = (255, 255, 0)
+AZUL_ESCURO = (0, 0, 128)
+LARANJA = (255, 165, 0) # Added if needed
+MARROM = (165, 42, 42) # Added if needed
+
+# Type effectiveness (example, adjust as needed)
+SISTEMA_DE_TIPOS = {
+ "FOGO": {"AGUA": 0.5, "PLANTA": 2.0, "FOGO": 0.5},
+ "AGUA": {"FOGO": 2.0, "TERRA": 0.5, "AGUA": 0.5},
+ "PLANTA": {"TERRA": 2.0, "FOGO": 0.5, "PLANTA": 0.5},
+ "TERRA": {"ELETRICO": 2.0, "AGUA": 2.0, "TERRA": 0.5},
+ "ELETRICO": {"AGUA": 2.0, "TERRA": 0.5, "ELETRICO": 0.5},
+ "ESPECIAL": {"ESPECIAL": 1.0} # Default for now
+}
+
+# Pygame initialization
+pygame.init()
+tela = pygame.display.set_mode((LARGURA, ALTURA))
+pygame.display.set_caption("CINEMON IP - A Revolução")
+relogio = pygame.time.Clock()
+fonte = pygame.font.SysFont("Arial", 24)
+fonte_grande = pygame.font.SysFont("Arial", 36)
\ No newline at end of file
diff --git a/CInemon-IP/code/gema.py b/CInemon-IP/code/gema.py
new file mode 100644
index 0000000..ad443a9
--- /dev/null
+++ b/CInemon-IP/code/gema.py
@@ -0,0 +1,37 @@
+import pygame
+import os
+import jogo_base
+
+
+
+class Gema:
+ def __init__(self, x, y):
+ self.x = x # Posição X no mundo
+ self.y = y # Posição Y no mundo
+ self.collected = False # Estado de coleta
+ self.width = 32 # Tamanho visual do sprite
+ self.height = 32
+ self.rect = pygame.Rect(self.x + 8, self.y + 8, 16, 16) # Hitbox menor para colisão
+
+ # Carrega o sprite da gema
+ sprite_path = os.path.join("Desktop", "CInemon-IP", "sprites", "spr_gema_coletável_2.png")
+
+
+ self.sprite = pygame.image.load(sprite_path).convert_alpha()
+ self.sprite = pygame.transform.scale(self.sprite, (self.width, self.height))
+
+
+ def desenhar(self, tela, camera, zoom):
+ if not self.collected:
+ pos_x = (self.x - camera.x) * zoom
+ pos_y = (self.y - camera.y) * zoom
+ scaled_width = int(self.width * zoom)
+ scaled_height = int(self.height * zoom)
+
+ if self.sprite:
+ sprite_scaled = pygame.transform.scale(self.sprite, (scaled_width, scaled_height))
+
+ tela.blit(sprite_scaled, (pos_x, pos_y))
+ else:
+ rect_scaled = pygame.Rect(pos_x, pos_y, scaled_width, scaled_height)
+ pygame.draw.rect(tela, self.cor, rect_scaled)
\ No newline at end of file
diff --git a/CInemon-IP/code/inimigo.py b/CInemon-IP/code/inimigo.py
new file mode 100644
index 0000000..549d4a5
--- /dev/null
+++ b/CInemon-IP/code/inimigo.py
@@ -0,0 +1,80 @@
+import pygame
+import os
+from config import BRANCO, PRETO, VERMELHO, AZUL, VERDE, AMARELO, CINZA, ROXO, LARANJA, MARROM, AZUL_ESCURO
+
+class Inimigo:
+ def __init__(self, x, y, nome):
+ self.x = x
+ self.y = y
+ self.nome = nome
+ self.rect = pygame.Rect(x, y, 32,32)
+
+ # Define a cor e a imagem com base no nome do inimigo
+ if nome == 'Pedro':
+ self.cor = VERMELHO
+ caminho_imagem = os.path.join("Desktop", "CInemon-IP", "sprites", "spr_pedro_manhaes2.png")
+
+ self.imagem = pygame.image.load(caminho_imagem)
+ self.imagem = pygame.transform.scale(self.imagem, (32, 32))
+ self.tem_imagem = True
+
+ elif nome == 'Fernanda':
+ self.cor = VERDE
+ caminho_imagem = os.path.join("Desktop", "CInemon-IP", "sprites", "spr_fernanda_madeiral_2.1.png")
+
+
+ self.imagem = pygame.image.load(caminho_imagem)
+ self.imagem = pygame.transform.scale(self.imagem, (32, 32))
+ self.tem_imagem = True
+
+ elif nome == 'Sergio':
+ self.cor = LARANJA
+ caminho_imagem = os.path.join("Desktop", "CInemon-IP", "sprites", "spr_sergio_soares.png")
+
+ self.imagem = pygame.image.load(caminho_imagem)
+ self.imagem = pygame.transform.scale(self.imagem, (32, 32))
+ self.tem_imagem = True
+
+ elif nome == 'Ricardo':
+ self.cor = LARANJA
+ caminho_imagem = os.path.join("Desktop", "CInemon-IP", "sprites", "spr_ricardo_2.1-export.png")
+
+
+ self.imagem = pygame.image.load(caminho_imagem)
+ self.imagem = pygame.transform.scale(self.imagem, (32, 32))
+ self.tem_imagem = True
+
+
+
+
+
+ else:
+ self.cor = CINZA
+ self.tem_imagem = False
+
+ def desenhar(self, tela, camera, zoom):
+
+ scaled_width = int(32 * zoom)
+ scaled_height = int(32 * zoom)
+ pos_x = (self.x - camera.x) * zoom
+ pos_y = (self.y - camera.y) * zoom
+ rect_scaled = pygame.Rect(pos_x, pos_y, scaled_width, scaled_height)
+
+ if self.tem_imagem and (self.nome == 'Pedro' or self.nome == 'Fernanda' or self.nome == 'Sergio' or self.nome == 'Fernanda' or self.nome == 'Ricardo'):
+
+ imagem_scaled = pygame.transform.scale(self.imagem, (scaled_width, scaled_height))
+ tela.blit(imagem_scaled, (pos_x, pos_y))
+ else:
+
+ pygame.draw.rect(tela, self.cor, rect_scaled)
+
+ centro_x = pos_x + scaled_width // 2
+ centro_y = pos_y + scaled_height // 4
+ raio_cabeca = int(10 * zoom)
+ pygame.draw.circle(tela, (200, 150, 100), (centro_x, centro_y), raio_cabeca) # Cabeça
+ pygame.draw.rect(tela, PRETO,
+ (centro_x - int(10 * zoom), centro_y - int(2.5 * zoom), int(20 * zoom), int(5 * zoom)), 2) # Boca
+ pygame.draw.rect(tela, PRETO,
+ (centro_x - int(15 * zoom), centro_y - int(2.5 * zoom), int(5 * zoom), int(5 * zoom)), 2) # Olho esquerdo
+ pygame.draw.rect(tela, PRETO,
+ (centro_x + int(10 * zoom), centro_y - int(2.5 * zoom), int(5 * zoom), int(5 * zoom)), 2) # Olho direito
\ No newline at end of file
diff --git a/CInemon-IP/code/jogo_base.py b/CInemon-IP/code/jogo_base.py
new file mode 100644
index 0000000..9d0f12f
--- /dev/null
+++ b/CInemon-IP/code/jogo_base.py
@@ -0,0 +1,540 @@
+import pygame
+import sys
+import os
+import math
+import random
+from personagem import Personagem
+from inimigo import Inimigo
+from cinemon import CInemon
+from config import LARGURA, ALTURA, SISTEMA_DE_TIPOS
+from pytmx.util_pygame import load_pygame
+from gema import Gema
+from npc import NPC # Importa a nova classe NPC
+
+class JogoBase:
+ def __init__(self):
+ self.estado = "menu"
+
+ # Define o mapa inicial
+ caminho_mapa = os.path.join("Desktop", "CInemon-IP", "data", "basic.tmx") # Começa com basic.tmx
+ self.mapa_atual = "basic.tmx" # Mapa atual
+ self.mapa_anterior = None # Rastreia o mapa de origem
+
+ # Carrega o mapa TMX com tratamento de erro
+ try:
+ self.tmx_data = load_pygame(caminho_mapa)
+ print("Mapa carregado com sucesso:", self.tmx_data.width, "x", self.tmx_data.height)
+ except Exception as e:
+ print(f"Erro ao carregar o mapa: {e}")
+ sys.exit()
+
+ # Agora que tmx_data está definido, inicialize as camadas
+ self.map_width = self.tmx_data.width * self.tmx_data.tilewidth
+ self.map_height = self.tmx_data.height * self.tmx_data.tileheight
+ self.camada_porta = self.tmx_data.get_layer_by_name("porta") if "porta" in [layer.name for layer in self.tmx_data.layers] else None
+ self.camada_colisao = self.tmx_data.get_layer_by_name("colisao")
+ self.mapa_colisao = self._criar_mapa_colisao()
+
+
+ self.jogador = None
+ self.pedro = None
+ self.Sergio = None
+ self.Fernanda = None
+ self.Ricardo = None
+ self.npcs = []
+ self.gemas = []
+
+ self.definir_posicoes()
+
+ self.camera = pygame.Rect(0, 0, LARGURA, ALTURA)
+
+ self.inimigo_atual = None
+ self.jogador_cinemons = []
+ self.cinemons_disponiveis = self.criar_cinemons_disponiveis()
+ self.cinemons_escolhidos = []
+ self.pedro_cinemons = [
+ CInemon("Paradoxium", "ESPECIAL", 5, 20, [("Paradoxo Lógico", 30), ("Indução Forte", 40)])
+
+ ]
+ self.Sergio_cinemons = [
+ CInemon("Redlion", "FOGO", 15, 20, [("Vírus Ígneo", 30), ("Nano Queimadura", 40)]),
+ CInemon("Serpython", "FOGO", 15, 20, [("Dano Imoral", 30), ("Chama", 40)]) ##### se liga
+ ]
+ self.Fernanda_cinemons = [
+ CInemon("Butterfault", "PLANTA", 15, 20, [("Dano Imoral", 30), ("Chama", 40)])
+ ]
+ self.Ricardo_cinemons = [
+ CInemon("MinerByte", "TERRA", 15, 20, [("Dano Imoral", 30), ("Chama", 40)])
+ ]
+ self.em_batalha = False
+ self.turno_jogador = True
+ self.mensagem_atual = ""
+ self.fase_batalha = 0
+ self.acao_selecionada = None
+ self.cinemon_jogador_atual = None
+ self.cinemon_inimigo_atual = None
+ self.rects_cinemon = []
+ self.aguardando_espaco = False
+ self.distancia_batalha = 100
+ self.mensagem_dialogo = []
+ self.dialogo_atual = 0
+ self.batalha_vencida_pedro = False
+ self.batalha_vencida_Sergio = False
+ self.batalha_vencida_Fernanda = False
+ self.batalha_vencida_Ricardo = False
+
+ self.pedacos_cracha = 0
+ self.cracha_completo = 0
+
+
+
+ self.camada_colisao = self.tmx_data.get_layer_by_name("colisao")
+ self.mapa_colisao = self._criar_mapa_colisao()
+
+ self.gemas_coletadas = 0
+ self.em_dialogo_npc = False # Controla o diálogo com o NPC
+ self.resposta_npc = None # Armazena a resposta do jogador ('sim' ou 'nao')
+
+
+
+ def verificar_colisao_porta(self):
+ """Verifica se o jogador colidiu com uma porta e troca o mapa se necessário"""
+ if not self.camada_porta:
+ return False
+
+ # Pega a posição do jogador em tiles
+ tile_x = int(self.jogador.x // self.tmx_data.tilewidth)
+ tile_y = int(self.jogador.y // self.tmx_data.tileheight)
+
+ # Verifica os tiles ao redor do jogador
+ for x, y, tile in self.camada_porta.tiles():
+ if tile and tile_x == x and tile_y == y:
+ if self.cracha_completo == 1:
+ indice_camada_porta = self.tmx_data.layers.index(self.camada_porta)
+ propriedades = self.tmx_data.get_tile_properties(x, y, indice_camada_porta)
+ if propriedades and propriedades.get("porta", False):
+ destino = propriedades.get("destino", "cin.tmx") # Mapa destino
+ spawn_x = 450 # Posição de spawn (opcional)
+ spawn_y = 950
+ self.trocar_mapa(destino, spawn_x, spawn_y)
+ return True
+ return False
+
+ return False
+ def trocar_mapa(self, novo_mapa, spawn_x=None, spawn_y=None):
+ """Troca o mapa atual para um novo mapa TMX e rastreia o mapa anterior"""
+ # Armazena o mapa atual como anterior antes de trocar
+ self.mapa_anterior = self.mapa_atual
+ caminho_mapa = os.path.join("Desktop", "CInemon-IP", "data", novo_mapa)
+
+ try:
+ self.tmx_data = load_pygame(caminho_mapa)
+ print(f"Mapa trocado para {novo_mapa} com sucesso: {self.tmx_data.width}x{self.tmx_data.height}")
+ self.map_width = self.tmx_data.width * self.tmx_data.tilewidth
+ self.map_height = self.tmx_data.height * self.tmx_data.tileheight
+ self.mapa_atual = novo_mapa
+
+ # Atualiza as camadas
+ self.camada_colisao = self.tmx_data.get_layer_by_name("colisao")
+ self.mapa_colisao = self._criar_mapa_colisao()
+ self.camada_porta = self.tmx_data.get_layer_by_name("porta") if "porta" in [layer.name for layer in self.tmx_data.layers] else None
+
+ # Reposiciona o jogador
+ self.jogador.x = spawn_x if spawn_x is not None else self.map_width // 2
+ self.jogador.y = spawn_y if spawn_y is not None else self.map_height // 2
+ self.jogador.rect.x = self.jogador.x + 8
+ self.jogador.rect.y = self.jogador.y + 18
+
+ # Atualiza a câmera
+ self._atualizar_camera()
+
+
+
+
+ except Exception as e:
+ print(f"Erro ao trocar o mapa: {e}")
+ sys.exit()
+
+
+
+
+ def verificar_colisao_porta_retorno(self):
+ """Verifica se o jogador quer voltar ao mapa anterior"""
+ if not self.camada_porta or not self.mapa_anterior:
+ return False
+
+ tile_x = int(self.jogador.x // self.tmx_data.tilewidth)
+ tile_y = int(self.jogador.y // self.tmx_data.tileheight)
+
+ for x, y, tile in self.camada_porta.tiles():
+ if tile and tile_x == x and tile_y == y:
+ propriedades = self.tmx_data.get_tile_properties(x, y, self.tmx_data.layers.index(self.camada_porta))
+ if propriedades and propriedades.get("porta", False):
+ spawn_x = propriedades.get("spawn_x", self.map_width // 2)
+ spawn_y = propriedades.get("spawn_y", self.map_height // 2)
+ self.trocar_mapa(self.mapa_anterior, spawn_x, spawn_y)
+ print(f"Porta encontrada! Destino: {propriedades.get('destino')}")
+ return True
+ return False
+
+
+
+
+
+
+
+
+
+
+
+ def definir_posicoes(self):
+ self.jogador = Personagem(1695, 710, self.map_width, self.map_height)
+ self.pedro = Inimigo(450, 140 , 'Pedro')
+ self.Ricardo = Inimigo(450, 295, 'Ricardo')
+ self.Sergio = Inimigo(1345, 765, 'Sergio')
+ self.Fernanda = Inimigo(192, 988, 'Fernanda')
+ self.npcs = [
+ NPC(770, 900, 'Fernanda1', "spr_enfermeira_joy.png"),
+
+ ]
+ self.gemas = [
+ Gema(400, 520),
+ Gema(450, 100),
+ Gema(1675, 1045),
+ Gema(320, 1230),
+ ]
+
+ def _criar_mapa_colisao(self):
+ mapa_colisao = [[False for _ in range(self.tmx_data.height)]
+ for _ in range(self.tmx_data.width)]
+ if self.camada_colisao:
+ for x, y, tile in self.camada_colisao.tiles():
+ if tile:
+ mapa_colisao[x][y] = True
+ return mapa_colisao
+
+ def verificar_colisao_tile(self, x, y):
+ tile_x = int(x // self.tmx_data.tilewidth)
+ tile_y = int(y // self.tmx_data.tileheight)
+
+ if 0 <= tile_x < self.tmx_data.width and 0 <= tile_y < self.tmx_data.height:
+ return self.mapa_colisao[tile_x][tile_y]
+ return True
+
+
+
+
+
+ def verificar_colisao_personagem(self, rect):
+ pontos = []
+ step = 4
+
+ for x in range(rect.left, rect.right, step):
+ pontos.append((x, rect.top))
+ pontos.append((x, rect.bottom))
+
+ for y in range(rect.top, rect.bottom, step):
+ pontos.append((rect.left, y))
+ pontos.append((rect.right, y))
+
+ for px, py in pontos:
+ if self.verificar_colisao_tile(px, py):
+ return True
+ return False
+
+ def criar_cinemons_disponiveis(self):
+ return [
+ CInemon("Firewall", "FOGO", 10, 120, [("Bug Flamejante", 25), ("Firewall", 20)]),
+ CInemon("Pikacode", "ELETRICO", 10, 110, [("Raio Código", 30), ("Compile Shock", 25)]),
+ CInemon("Terrabyte", "TERRA", 10, 130, [("Terrabyte", 20), ("Overclock Quake", 35)]),
+ CInemon("Aqualynx", "AGUA", 10, 125, [("Onda de Dados", 25), ("Debbubble", 30)]),
+ CInemon("Grasscat", "PLANTA", 10, 115, [("Árvore Binária", 20), ("Trepadeira Viral", 25)]),
+ CInemon("Aetherbyte", "ELETRICO", 10, 105, [("Nanotrovoada", 30), ("Corrente de Dados", 20)]),
+ CInemon("Granitex", "TERRA", 10, 135, [("Código Sísmico", 35), ("Data Geodo", 25)]),
+ CInemon("Bitwhale", "AGUA", 10, 120, [("Bubblesorted", 25), ("Maremoto Quântico", 30)]),
+ CInemon("Leafbyte", "PLANTA", 10, 125, [("Cipó Cibernético", 20), ("Sistema de Vinhas", 25)]),
+ CInemon("Emberfang", "FOGO", 10, 110, [("Vírus Ígneo", 30), ("Nano Queimadura", 20)])
+ ]
+
+ def verificar_colisao(self):
+ distancia_pedro = math.sqrt((self.jogador.x - self.pedro.x)**2 + (self.jogador.y - self.pedro.y)**2)
+ distancia_Sergio = math.sqrt((self.jogador.x - self.Sergio.x)**2 + (self.jogador.y - self.Sergio.y)**2)
+ distancia_Fernanda = math.sqrt((self.jogador.x - self.Fernanda.x)**2 + (self.jogador.y - self.Fernanda.y)**2)
+ distancia_Ricardo = math.sqrt((self.jogador.x - self.Ricardo.x)**2 + (self.jogador.y - self.Ricardo.y)**2)
+ if self.mapa_atual == 'cin.tmx':
+ if (distancia_pedro < self.distancia_batalha and not self.em_batalha
+ and len(self.jogador_cinemons) > 0 and not self.batalha_vencida_pedro):
+ self.inimigo_atual = 'Pedro'
+ #dialogos pedro
+ self.mensagem_dialogo = [
+ "Pedro Noites: Você ousa se opor à minha revolução?",
+ "Pedro Noites: Você conseguiu roubar meus experimentos.",
+ "Pedro Noites: Prepare-se para enfrentar as consequências!",
+ "Pedro Noites: Você realmente acha que conhece todos os meus truques?",
+ "Pedro Noites: Prepare-se, porque eu guardei o melhor para o fim.",
+ "Pedro Noites: Existe um tipo secreto de CInemon, algo que eu desenvolvi nas sombras, longe dos olhos curiosos...",
+ "Pedro Noites: Um poder que nem mesmo você pode imaginar.",
+ "Pedro Noites: Me enfrente! E você verá o que acontece quando se desafia o verdadeiro mestre!",
+ "Pedro Noites: Vamos resolver isso com uma batalha de CInemons!"
+ ]
+ self.dialogo_atual = 0
+ self.estado = "dialogo"
+ self.aguardando_espaco = True
+ if self.mapa_atual == 'basic.tmx':
+ if (distancia_Sergio < self.distancia_batalha and not self.em_batalha
+ and len(self.jogador_cinemons) > 0 and not self.batalha_vencida_Sergio):
+ self.inimigo_atual = 'Sergio'
+ #dialogos sergio
+ self.mensagem_dialogo = [
+ "Sergio: Como você ousa falar mal de Sergiogol",
+ "Sergio: Prepare-se para enfrentar as consequências!",
+ "Sergio: Vamos resolver isso com uma batalha de CInemons!"
+ ]
+ self.dialogo_atual = 0
+ self.estado = "dialogo"
+ self.aguardando_espaco = True
+
+ if (distancia_Fernanda < self.distancia_batalha and not self.em_batalha
+ and len(self.jogador_cinemons) > 0 and not self.batalha_vencida_Fernanda):
+ self.inimigo_atual = 'Fernanda'
+ #dialogos Fernanda
+ self.mensagem_dialogo = [
+ "Fernanda: Como você ousa falar durante a chamada!",
+ "Fernanda: Prepare-se para enfrentar as consequências!",
+ "Fernanda: Vamos resolver isso com uma batalha de CInemons!"
+ ]
+ self.dialogo_atual = 0
+ self.estado = "dialogo"
+ self.aguardando_espaco = True
+ if (distancia_Ricardo < self.distancia_batalha and not self.em_batalha
+ and len(self.jogador_cinemons) > 0 and not self.batalha_vencida_Ricardo):
+ self.inimigo_atual = 'Ricardo'
+ #dialogos Ricardo
+ self.mensagem_dialogo = [
+ "Ricardo: Como você ousa falar mal do meu Python... Python é MASSA",
+ "Ricardo: Prepare-se para enfrentar as consequências!",
+ "Ricardo: Vamos resolver isso com uma batalha de CInemons!"
+ ]
+ self.dialogo_atual = 0
+ self.estado = "dialogo"
+ self.aguardando_espaco = True
+
+ def verificar_colisao_barreiras(self):
+ temp_x, temp_y = self.jogador.x, self.jogador.y
+
+ if (self.jogador.x != self.jogador.x_anterior or
+ self.jogador.y != self.jogador.y_anterior):
+
+ if self.verificar_colisao_personagem(self.jogador.rect):
+ self.jogador.x = self.jogador.x_anterior
+ self.jogador.y = self.jogador.y_anterior
+ self.jogador.rect.x = self.jogador.x + 8
+ self.jogador.rect.y = self.jogador.y + 18
+ return True
+
+ return False
+
+ def verificar_coleta_gemas(self):
+ for gema in self.gemas:
+ if not gema.collected and self.jogador.rect.colliderect(gema.rect):
+ gema.collected = True
+ self.gemas_coletadas += 1
+ print(f"Gema coletada! Total: {self.gemas_coletadas}")
+
+ def verificar_interacao_npc(self):
+ distancia_fernanda = math.sqrt((self.jogador.x - self.fernanda.x)**2 + (self.jogador.y - self.fernanda.y)**2)
+ if self.mapa_atual == 'basic.tmx':
+ if distancia_fernanda < 50: # Distância para interação
+ return True
+ return False
+
+ def processar_dialogo_npc(self):
+ if self.jogador.dinheiro >= 50:
+ self.mensagem_dialogo = [
+ "Enfermeira Joy: Quer gastar 50 créditos para reanimar e curar seus CInemons?",
+ "Pressione S para Sim ou N para Não"
+ ]
+ else:
+ self.mensagem_dialogo = [
+ "Enfermeira Joy: Você não tem créditos suficientes!",
+ "Volte quando tiver pelo menos 50 créditos."
+ ]
+ self.em_dialogo_npc = True
+ self.dialogo_atual = 0
+ self.resposta_npc = None
+
+ def responder_dialogo_npc(self, resposta):
+ if resposta == 'sim' and self.jogador.dinheiro >= 50:
+ self.jogador.dinheiro -= 50
+ for cinemon in self.jogador_cinemons:
+ cinemon.hp = cinemon.hp_max # Cura total
+ self.mensagem_dialogo = ["Enfermeira Joy: Seus CInemons estão como novos!"]
+ self.dialogo_atual = 0
+ elif resposta == 'nao':
+ self.mensagem_dialogo = ["Enfermeira Joy: Tudo bem, volte quando precisar!"]
+ self.dialogo_atual = 0
+ self.resposta_npc = None
+
+ def iniciar_batalha(self):
+ self.em_batalha = True
+ self.turno_jogador = True
+ self.fase_batalha = 0
+ self.cinemon_jogador_atual = self.jogador_cinemons[0]
+ if self.inimigo_atual == 'Pedro':
+ self.cinemon_inimigo_atual = self.pedro_cinemons[0]
+ elif self.inimigo_atual == 'Sergio':
+ self.cinemon_inimigo_atual = self.Sergio_cinemons[0]
+ elif self.inimigo_atual == 'Fernanda':
+ self.cinemon_inimigo_atual = self.Fernanda_cinemons[0]
+ elif self.inimigo_atual == 'Ricardo':
+ self.cinemon_inimigo_atual = self.Fernanda_cinemons[0]
+ self.mensagem_atual = f"{self.inimigo_atual} enviou {self.cinemon_inimigo_atual.nome}!"
+ self.aguardando_espaco = True
+
+ def calcular_dano(self, atacante, defensor, ataque_idx):
+ ataque_nome, dano_base = atacante.ataques[ataque_idx]
+ multiplicador = SISTEMA_DE_TIPOS[atacante.tipo].get(defensor.tipo, 1.0)
+ dano = int(dano_base * multiplicador)
+
+ mensagem = f"{atacante.nome} usou {ataque_nome}!\n"
+ if multiplicador > 1:
+ mensagem += "Foi SUPER EFETIVO!\n"
+ elif multiplicador < 1:
+ mensagem += "Não foi muito efetivo...\n"
+ else:
+ mensagem += "Dano normal.\n"
+ mensagem += f"Causou {dano} de dano!"
+
+ return dano, mensagem
+
+ def processar_batalha(self):
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_SPACE and self.aguardando_espaco:
+ self.aguardando_espaco = False
+ if self.cinemon_inimigo_atual.hp <= 0:
+ self.proximo_inimigo()
+ elif self.cinemon_jogador_atual.hp <= 0 and any(c.hp > 0 for c in self.jogador_cinemons):
+ self.estado = "trocar_cinemon"
+ elif self.fase_batalha == 1:
+ self.fase_batalha = 2
+ self.turno_jogador = False
+ self.mensagem_atual = f"{self.cinemon_inimigo_atual.nome} está atacando..."
+ pygame.time.delay(1000)
+ self.executar_ataque_inimigo()
+ elif self.fase_batalha == 3:
+ self.fase_batalha = 0
+ self.turno_jogador = True
+ if self.fase_batalha == 0 and self.turno_jogador and not self.aguardando_espaco:
+ if evento.key == pygame.K_1:
+ self.acao_selecionada = 0
+ self.executar_ataque_jogador()
+ elif evento.key == pygame.K_2:
+ self.acao_selecionada = 1
+ self.executar_ataque_jogador()
+ elif evento.key == pygame.K_3:
+ self.estado = "trocar_cinemon"
+
+ def executar_ataque_jogador(self):
+ if self.acao_selecionada is not None:
+ dano, mensagem = self.calcular_dano(self.cinemon_jogador_atual, self.cinemon_inimigo_atual, self.acao_selecionada)
+ self.cinemon_inimigo_atual.hp = max(0, self.cinemon_inimigo_atual.hp - dano) # Limita HP a 0
+ self.mensagem_atual = mensagem
+ self.acao_selecionada = None
+ self.aguardando_espaco = True
+ self.fase_batalha = 1
+ if self.cinemon_inimigo_atual.hp <= 0:
+ self.mensagem_atual += f"\n{self.cinemon_inimigo_atual.nome} desmaiou!"
+
+ def executar_ataque_inimigo(self):
+ dano, mensagem = self.calcular_dano(self.cinemon_inimigo_atual, self.cinemon_jogador_atual, random.randint(0, 1))
+ self.cinemon_jogador_atual.hp = max(0, self.cinemon_jogador_atual.hp - dano) # Limita HP a 0
+ self.mensagem_atual = mensagem
+ self.aguardando_espaco = True
+ self.fase_batalha = 3
+ if self.cinemon_jogador_atual.hp <= 0:
+ self.mensagem_atual += f"\n{self.cinemon_jogador_atual.nome} desmaiou!"
+ if any(c.hp > 0 for c in self.jogador_cinemons):
+ self.mensagem_atual += "\nEscolha outro CInemon!"
+ else:
+ self.mensagem_atual += "\nVocê perdeu a batalha!"
+
+ def proximo_inimigo(self):
+ if self.inimigo_atual == 'Pedro':
+ inimigos = self.pedro_cinemons
+ elif self.inimigo_atual == 'Sergio':
+ inimigos = self.Sergio_cinemons
+ elif self.inimigo_atual == 'Fernanda':
+ inimigos = self.Fernanda_cinemons
+ elif self.inimigo_atual == 'Ricardo':
+ inimigos = self.Ricardo_cinemons
+ for cinemon in inimigos:
+ if cinemon.hp > 0:
+ self.cinemon_inimigo_atual = cinemon
+ self.mensagem_atual = f"{self.inimigo_atual} enviou {cinemon.nome}!"
+ self.fase_batalha = 0
+ self.turno_jogador = True
+ self.aguardando_espaco = True
+ return
+ self.em_batalha = False
+ self.estado = "mapa"
+ if self.inimigo_atual == 'Pedro':
+ self.batalha_vencida_pedro = True
+ self.jogador.dinheiro += 100
+ elif self.inimigo_atual == 'Sergio':
+ self.batalha_vencida_Sergio = True
+ self.jogador.dinheiro += 100
+ elif self.inimigo_atual == 'Fernanda':
+ self.batalha_vencida_Fernanda = True
+ self.jogador.dinheiro += 100
+ elif self.inimigo_atual == 'Ricardo':
+ self.batalha_vencida_Ricardo = True
+ self.jogador.dinheiro += 100
+ self.mensagem_atual = "Você venceu a batalha!"
+ self.aguardando_espaco = True
+
+ if self.inimigo_atual == 'Pedro':
+ self.batalha_vencida_pedro = True
+ self.jogador.dinheiro += 100
+ if self.cracha_completo == 0:
+ self.pedacos_cracha += 1
+
+ elif self.inimigo_atual == 'Sergio':
+ self.batalha_vencida_Sergio = True
+ self.jogador.dinheiro += 100
+ if self.cracha_completo == 0:
+ self.pedacos_cracha += 1
+
+ elif self.inimigo_atual == 'Fernanda':
+ self.batalha_vencida_Fernanda = True
+ self.jogador.dinheiro += 100
+ if self.cracha_completo == 0:
+ self.pedacos_cracha += 1
+ elif self.inimigo_atual == 'Ricardo':
+ self.batalha_vencida_Ricardo = True
+ self.jogador.dinheiro += 100
+ if self.cracha_completo == 0:
+ self.pedacos_cracha += 1
+
+ if self.cracha_completo == 0:
+ if self.pedacos_cracha >= 3:
+ self.cracha_completo = 1
+ self.pedacos_cracha = 0
+ self.mensagem_atual = "Você venceu a batalha e formou o Crachá Completo!"
+ else:
+ self.mensagem_atual = f"Você venceu a batalha e ganhou um pedaço de crachá! ({self.pedacos_cracha}/3)"
+ else:
+ self.mensagem_atual = "Você venceu a batalha!"
+
+ self.aguardando_espaco = True
+
+
+ def _atualizar_camera(self):
+ x = self.jogador.x - LARGURA // 2
+ y = self.jogador.y - ALTURA // 2
+ x = max(0, min(x, self.map_width - LARGURA))
+ y = max(0, min(y, self.map_height - ALTURA))
+ self.camera = pygame.Rect(x, y, LARGURA, ALTURA)
\ No newline at end of file
diff --git a/CInemon-IP/code/jogo_ui.py b/CInemon-IP/code/jogo_ui.py
new file mode 100644
index 0000000..2ce442e
--- /dev/null
+++ b/CInemon-IP/code/jogo_ui.py
@@ -0,0 +1,444 @@
+import pygame
+import sys
+import os
+import math
+import random
+from jogo_base import JogoBase
+from batalha_ui import BatalhaUI
+from personagem import Personagem
+from inimigo import Inimigo
+from cinemon import CInemon
+from config import (tela, fonte, fonte_grande, relogio, BRANCO, PRETO, VERMELHO, AZUL, VERDE,
+ AMARELO, CINZA, ROXO, AZUL_ESCURO, LARGURA, ALTURA, SISTEMA_DE_TIPOS)
+from pytmx.util_pygame import load_pygame
+
+class JogoUI(JogoBase):
+ def __init__(self):
+ super().__init__()
+ self.batalha_ui = BatalhaUI()
+ self.zoom = 1.9
+ self.mostrar_status = False
+ self.mostrar_mensagem_gemas = False
+ self.tempo_mensagem_gemas = 0
+ self.npc_atual = None # Adicionado para rastrear o NPC atual em interação
+ self.estado = "menu" # Define o estado inicial como diálogo inicial
+ self.dialogo_atual = 0
+
+
+ def renderizar_dialogo_inicial(self):
+ self.mensagem_dialogo = [
+ ['Olá, treinador! Eu sou Filipe Milk, estudante do CIn e líder da resistência contra Pedro Noites.'],
+ ['Ele quer impor sua grade curricular maligna, mas nós temos um plano: os CInemons!'],
+ ['Criados a partir de amostras roubadas do laboratório secreto de Pedro, essas criaturas digitais são nossa', 'única esperança.'],
+ ['Sua missão? Reunir os fragmentos do Crachá Perdido do CIn, derrotando os capangas de Pedro que estão', 'espalhados pelo campus.'],
+ ['Cuidado: após cada batalha, visite o Centro de Cura para recuperar seus CInemons.'],
+ ['Quando o Crachá estiver completo, vá até a Balsa do CIn e enfrente Pedro Noites em uma batalha épica!'],
+ ['O futuro do curso está em suas mãos. Você está preparado?'],
+ ['Uma dica: há gemas espalhadas pelo mapa... dizem que juntando todas seus CInemons ficam mais fortes!']]
+
+
+ caminho_imagem_fundo = os.path.join("Desktop", "CInemon-IP", "graphics",'fotos', "fundo.png")
+ self.imagem_fundo = pygame.image.load(caminho_imagem_fundo)
+ imagem_fundo_scaled = pygame.transform.smoothscale(self.imagem_fundo,(LARGURA,ALTURA))
+
+ caminho_imagem = os.path.join("Desktop", "CInemon-IP", "graphics",'fotos', "milk.png")
+ self.imagem = pygame.image.load(caminho_imagem)
+ imagem_scaled = pygame.transform.smoothscale(self.imagem, (400, 300))
+
+
+
+ tela.blit(imagem_fundo_scaled,(0,0))
+ pygame.draw.rect(tela, BRANCO, (50, ALTURA - 200, LARGURA - 100, 150))
+ pygame.draw.rect(tela, PRETO, (50, ALTURA - 200, LARGURA - 100, 150), 2)
+ tela.blit(imagem_scaled,(750,220))
+
+ if len(self.mensagem_dialogo[self.dialogo_atual]) > 1:
+ texto = fonte.render(self.mensagem_dialogo[self.dialogo_atual][0], True, PRETO)
+ texto2 = fonte.render(self.mensagem_dialogo[self.dialogo_atual][1], True, PRETO)
+ tela.blit(texto, (70, ALTURA - 180))
+ tela.blit(texto2, (70, ALTURA - 150))
+ self.estado = 'dialogo_inicial'
+ instrucao = fonte.render("Pressione ESPAÇO para continuar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 100))
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_SPACE:
+ if self.dialogo_atual < len(self.mensagem_dialogo) - 1:
+ self.dialogo_atual += 1
+ else:
+ self.estado = "escolher_cinemon"
+ self.dialogo_atual = 0
+
+ else:
+ texto = fonte.render(self.mensagem_dialogo[self.dialogo_atual][0], True, PRETO)
+ tela.blit(texto, (70, ALTURA - 180))
+ self.estado = 'dialogo_inicial'
+ instrucao = fonte.render("Pressione ESPAÇO para continuar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 100))
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_SPACE:
+ if self.dialogo_atual < len(self.mensagem_dialogo) - 1:
+ self.dialogo_atual += 1
+ else:
+ self.estado = "escolher_cinemon"
+ self.dialogo_atual = 0
+
+
+
+
+
+
+ def _atualizar_camera(self):
+ x = self.jogador.x - (LARGURA // 2) / self.zoom
+ y = self.jogador.y - (ALTURA // 2) / self.zoom
+ x = max(0, min(x, self.map_width - LARGURA / self.zoom))
+ y = max(0, min(y, self.map_height - ALTURA / self.zoom))
+ self.camera.topleft = (x, y)
+
+ def ajustar_zoom(self, incremento):
+ self.zoom += incremento
+ self.zoom = max(0.5, min(self.zoom, 3.0))
+ self._atualizar_camera()
+
+ def menu_principal(self):
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_RETURN:
+ self.estado = "dialogo_inicial"
+ if evento.key == pygame.K_ESCAPE:
+ pygame.quit()
+ sys.exit()
+
+ tela.fill(VERDE)
+ titulo = fonte_grande.render("CINEMON IP - A Revolução", True, BRANCO)
+ subtitulo = fonte.render("Contra a Revolução de Pedro Manhães", True, BRANCO)
+ instrucao = fonte.render("Pressione ENTER para começar", True, BRANCO)
+
+ tela.blit(titulo, (LARGURA//2 - titulo.get_width()//2, 200))
+ tela.blit(subtitulo, (LARGURA//2 - subtitulo.get_width()//2, 300))
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, 400))
+
+ def tela_escolha_cinemon(self):
+ tela.fill((240, 240, 240))
+ titulo = fonte_grande.render("Escolha 3 CInemons", True, PRETO)
+ tela.blit(titulo, (LARGURA//2 - titulo.get_width()//2, 50))
+
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.MOUSEBUTTONDOWN:
+ if evento.button == 1:
+ for i, rect in enumerate(self.rects_cinemon):
+ if rect.collidepoint(evento.pos) and len(self.cinemons_escolhidos) < 3:
+ if i not in self.cinemons_escolhidos:
+ self.cinemons_escolhidos.append(i)
+ else:
+ self.cinemons_escolhidos.remove(i)
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_RETURN and len(self.cinemons_escolhidos) == 3:
+ self.jogador_cinemons = [self.cinemons_disponiveis[i] for i in self.cinemons_escolhidos]
+ self.estado = "mapa"
+ self.cinemon_jogador_atual = self.jogador_cinemons[0]
+
+ self.rects_cinemon = []
+ for i, cinemon in enumerate(self.cinemons_disponiveis):
+ x = 150 + (i % 5) * 180
+ y = 150 + (i // 5) * 180
+ rect = pygame.Rect(x, y, 150, 150)
+ self.rects_cinemon.append(rect)
+
+ cor_fundo = ROXO if i in self.cinemons_escolhidos else BRANCO
+ pygame.draw.rect(tela, cor_fundo, rect)
+ pygame.draw.rect(tela, PRETO, rect, 2)
+
+ nome = fonte.render(cinemon.nome, True, PRETO)
+ tipo = fonte.render(cinemon.tipo, True, cinemon.cor)
+ tela.blit(nome, (x + 75 - nome.get_width()//2, y + 20))
+ tela.blit(tipo, (x + 75 - tipo.get_width()//2, y + 50))
+
+ status = fonte.render(f"HP: {cinemon.hp} ATQ: {cinemon.ataques[0][1]}", True, PRETO)
+ tela.blit(status, (x + 75 - status.get_width()//2, y + 80))
+
+ instrucao = fonte.render(f"Selecionados: {len(self.cinemons_escolhidos)}/3 - ENTER para confirmar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 50))
+
+ def renderizar_dialogo(self):
+ tela.fill(AZUL_ESCURO)
+ pygame.draw.rect(tela, BRANCO, (50, ALTURA - 200, LARGURA - 100, 150))
+ pygame.draw.rect(tela, PRETO, (50, ALTURA - 200, LARGURA - 100, 150), 2)
+
+ texto = fonte.render(self.mensagem_dialogo[self.dialogo_atual], True, PRETO)
+ tela.blit(texto, (70, ALTURA - 180))
+
+ instrucao = fonte.render("Pressione ESPAÇO para continuar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 50))
+
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN and evento.key == pygame.K_SPACE:
+ self.dialogo_atual += 1
+ if self.dialogo_atual >= len(self.mensagem_dialogo):
+ self.estado = "batalha"
+ self.iniciar_batalha()
+
+ def renderizar_dialogo_npc(self):
+ tela.fill(AZUL_ESCURO)
+ pygame.draw.rect(tela, BRANCO, (50, ALTURA - 200, LARGURA - 100, 150))
+ pygame.draw.rect(tela, PRETO, (50, ALTURA - 200, LARGURA - 100, 150), 2)
+
+ texto = fonte.render(self.mensagem_dialogo[self.dialogo_atual], True, PRETO)
+ tela.blit(texto, (70, ALTURA - 180))
+
+ if self.dialogo_atual == 1 and self.jogador.dinheiro >= 50:
+ instrucao = fonte.render("S para Sim | N para Não", True, PRETO)
+ else:
+ instrucao = fonte.render("Pressione ESPAÇO para continuar", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 50))
+
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_SPACE:
+ if self.dialogo_atual < len(self.mensagem_dialogo) - 1:
+ self.dialogo_atual += 1
+ else:
+ self.em_dialogo_npc = False
+ self.estado = "mapa"
+ elif self.dialogo_atual == 1 and self.jogador.dinheiro >= 50:
+ if evento.key == pygame.K_s:
+ self.responder_dialogo_npc('sim')
+ elif evento.key == pygame.K_n:
+ self.responder_dialogo_npc('nao')
+
+ def mostrar_status_cinemons(self):
+ tela.fill(AZUL_ESCURO)
+ pygame.draw.rect(tela, BRANCO, (50, 50, LARGURA - 100, ALTURA - 100))
+ pygame.draw.rect(tela, PRETO, (50, 50, LARGURA - 100, ALTURA - 100), 2)
+
+ titulo = fonte_grande.render("Seus CInemons", True, PRETO)
+ tela.blit(titulo, (LARGURA//2 - titulo.get_width()//2, 70))
+
+ for i, cinemon in enumerate(self.jogador_cinemons):
+ y_pos = 150 + i * 100
+ nome = fonte.render(f"Nome: {cinemon.nome}", True, PRETO)
+ hp = fonte.render(f"HP: {cinemon.hp}/{cinemon.hp_max}", True, PRETO if cinemon.hp > 0 else VERMELHO)
+ status = fonte.render("Vivo" if cinemon.hp > 0 else "Morto", True, VERDE if cinemon.hp > 0 else VERMELHO)
+
+ tela.blit(nome, (100, y_pos))
+ tela.blit(hp, (100, y_pos + 30))
+ tela.blit(status, (100, y_pos + 60))
+
+ instrucao = fonte.render("Pressione ESC para voltar ao mapa", True, PRETO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 70))
+
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_ESCAPE:
+ self.mostrar_status = False
+
+ def verificar_coleta_gemas(self):
+ for gema in self.gemas:
+ if not gema.collected and self.jogador.rect.colliderect(gema.rect):
+ gema.collected = True
+ self.gemas_coletadas += 1
+ print(f"Gema coletada! Total: {self.gemas_coletadas}")
+
+ if self.gemas_coletadas == 4:
+ for cinemon in self.jogador_cinemons:
+ cinemon.hp_max += 20
+ cinemon.hp = cinemon.hp_max
+ self.mostrar_mensagem_gemas = True
+ self.tempo_mensagem_gemas = 180
+
+ def verificar_interacao_npc(self):
+ for npc in self.npcs:
+ distancia = math.sqrt((self.jogador.x - npc.x)**2 + (self.jogador.y - npc.y)**2)
+ if self.mapa_atual == 'basic.tmx' and distancia < 50: # Distância de interação
+ self.npc_atual = npc # Armazena o NPC atual interagido
+ return True
+ return False
+
+ def processar_dialogo_npc(self):
+ if not hasattr(self, 'npc_atual') or self.npc_atual is None:
+ return
+ if self.jogador.dinheiro >= 50:
+ self.mensagem_dialogo = [
+ f"{self.npc_atual.nome}: Quer gastar 50 créditos para reanimar e curar seus CInemons?",
+ "Pressione S para Sim ou N para Não"
+ ]
+ else:
+ self.mensagem_dialogo = [
+ f"{self.npc_atual.nome}: Você não tem créditos suficientes!",
+ "Volte quando tiver pelo menos 50 créditos."
+ ]
+ self.em_dialogo_npc = True
+ self.dialogo_atual = 0
+ self.resposta_npc = None
+
+ def mapa(self):
+ for evento in pygame.event.get():
+ if evento.type == pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+ if evento.type == pygame.KEYDOWN:
+ if evento.key == pygame.K_ESCAPE:
+ self.mostrar_status = not self.mostrar_status
+ elif evento.key == pygame.K_z:
+ print(f"Zoom antes: {self.zoom}")
+ self.ajustar_zoom(0.1)
+ print(f"Zoom depois: {self.zoom}")
+ elif evento.key == pygame.K_x:
+ print(f"Zoom antes: {self.zoom}")
+ self.ajustar_zoom(-0.1)
+ print(f"Zoom depois: {self.zoom}")
+ elif evento.key == pygame.K_SPACE and self.verificar_interacao_npc():
+ self.estado = "dialogo_npc"
+ self.processar_dialogo_npc()
+
+ if self.mostrar_status:
+ self.mostrar_status_cinemons()
+ return
+
+ keys = pygame.key.get_pressed()
+ dx, dy = 0, 0
+ if keys[pygame.K_LEFT] or keys[pygame.K_a]:
+ dx = -1
+ if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
+ dx = 1
+ if keys[pygame.K_UP] or keys[pygame.K_w]:
+ dy = -1
+ if keys[pygame.K_DOWN] or keys[pygame.K_s]:
+ dy = 1
+
+ self.jogador.mover(dx, dy)
+ self.verificar_colisao_barreiras()
+ self.verificar_colisao()
+ self.verificar_colisao_porta() # Verifica portas de ida
+ self.verificar_colisao_porta_retorno() # Verifica portas de volta
+ self.verificar_coleta_gemas()
+ self._atualizar_camera()
+
+ tela.fill((0, 0, 0))
+ mapa_surface = pygame.Surface((self.map_width, self.map_height))
+ for layer in self.tmx_data.visible_layers:
+ if hasattr(layer, 'tiles'):
+ for x, y, surf in layer.tiles():
+ if surf:
+ mapa_surface.blit(surf, (x * self.tmx_data.tilewidth, y * self.tmx_data.tileheight))
+
+ scaled_width = int(self.map_width * self.zoom)
+ scaled_height = int(self.map_height * self.zoom)
+ mapa_scaled = pygame.transform.scale(mapa_surface, (scaled_width, scaled_height))
+ camera_x = int(self.camera.x * self.zoom)
+ camera_y = int(self.camera.y * self.zoom)
+ tela.blit(mapa_scaled, (0, 0), (camera_x, camera_y, LARGURA, ALTURA))
+
+ self.jogador.desenhar(tela, self.camera, self.zoom)
+
+ if self.mapa_atual == 'cin.tmx':
+ self.pedro.desenhar(tela, self.camera, self.zoom)
+ elif self.mapa_atual == 'basic.tmx':
+ self.Sergio.desenhar(tela, self.camera, self.zoom)
+ self.Fernanda.desenhar(tela, self.camera, self.zoom)
+ self.Ricardo.desenhar(tela,self.camera, self.zoom)
+ for npc in self.npcs: # Desenha todos os NPCs
+ npc.desenhar(tela, self.camera, self.zoom)
+
+ for gema in self.gemas:
+ if self.mapa_atual == 'basic.tmx':
+ gema.desenhar(tela, self.camera, self.zoom)
+
+ instrucao = fonte.render("WASD/Setas: Mover | ESC: Status | ESPAÇO: Falar com NPC", True, BRANCO)
+ tela.blit(instrucao, (LARGURA//2 - instrucao.get_width()//2, ALTURA - 30))
+
+ if self.cinemon_jogador_atual:
+ cinemon_info = fonte.render(
+ f"CInemon atual: {self.cinemon_jogador_atual.nome} (HP: {self.cinemon_jogador_atual.hp}/{self.cinemon_jogador_atual.hp_max})",
+ True, BRANCO)
+ tela.blit(cinemon_info, (10, 10))
+
+ if self.batalha_vencida_pedro:
+ mensagem = fonte.render("Você já derrotou Pedro Manhães!", True, AZUL)
+ tela.blit(mensagem, (LARGURA//2 - mensagem.get_width()//2, 50))
+
+ if self.batalha_vencida_Sergio:
+ mensagem = fonte.render("Você já derrotou Sergio!", True, VERDE)
+ tela.blit(mensagem, (LARGURA//2 - mensagem.get_width()//2, 90))
+
+ if self.batalha_vencida_Fernanda:
+ mensagem = fonte.render("Você já derrotou Fernanda!", True, VERMELHO)
+ tela.blit(mensagem, (LARGURA//2 - mensagem.get_width()//2, 110))
+ if self.batalha_vencida_Ricardo:
+ mensagem = fonte.render("Você já derrotou Ricardo!", True, VERMELHO)
+ tela.blit(mensagem, (LARGURA//2 - mensagem.get_width()//2, 130))
+
+ texto_dinheiro = fonte.render(f'Você tem {self.jogador.dinheiro} créditos', True, AMARELO)
+ tela.blit(texto_dinheiro, (10, 40))
+
+ texto_gemas = fonte.render(f"Gemas: {self.gemas_coletadas}", True, AMARELO)
+ tela.blit(texto_gemas, (10, 70))
+
+ # Novo: Exibir pedaços de crachá apenas se o crachá não estiver completo
+ if self.cracha_completo == 0:
+ texto_pedacos_cracha = fonte.render(f"Pedaços de Crachá: {self.pedacos_cracha}/3", True, AMARELO)
+ tela.blit(texto_pedacos_cracha, (10, 100))
+ else:
+ texto_cracha_completo = fonte.render("Crachá Completo", True, AMARELO)
+ tela.blit(texto_cracha_completo, (10, 100))
+
+ if self.gemas_coletadas >= 4 and self.mostrar_mensagem_gemas:
+ mensagem = fonte_grande.render("Parabéns! Você pegou as 4 gemas!", True, VERDE)
+ mensagem2 = fonte.render("Seus CInemons ganharam 20 de HP máximo!", True, VERDE)
+ tela.blit(mensagem, (LARGURA//2 - mensagem.get_width()//2, ALTURA//2 - 50))
+ tela.blit(mensagem2, (LARGURA//2 - mensagem2.get_width()//2, ALTURA//2 + 10))
+ self.tempo_mensagem_gemas -= 1
+ if self.tempo_mensagem_gemas <= 0:
+ self.mostrar_mensagem_gemas = False
+
+ def rodar(self):
+ while True:
+ if self.estado == "menu":
+ self.menu_principal()
+ elif self.estado == "escolher_cinemon":
+ self.tela_escolha_cinemon()
+ elif self.estado == "mapa":
+ self.mapa()
+ elif self.estado == "batalha":
+ self.batalha_ui.processar_batalha(self)
+ self.batalha_ui.renderizar_batalha(self)
+ elif self.estado == "trocar_cinemon":
+ self.batalha_ui.tela_trocar_cinemon(self)
+ elif self.estado == 'dialogo_inicial':
+ self.renderizar_dialogo_inicial()
+ elif self.estado == "dialogo":
+ self.renderizar_dialogo()
+ elif self.estado == "dialogo_npc":
+ self.renderizar_dialogo_npc()
+
+ pygame.display.flip()
+ relogio.tick(60)
+
+def main():
+ jogo = JogoUI()
+ jogo.rodar()
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/CInemon-IP/code/main.py b/CInemon-IP/code/main.py
new file mode 100644
index 0000000..79cf994
--- /dev/null
+++ b/CInemon-IP/code/main.py
@@ -0,0 +1,11 @@
+import sys
+from jogo_ui import JogoUI
+from config import (tela, fonte, fonte_grande, relogio, BRANCO, PRETO, VERMELHO, AZUL, VERDE, AMARELO,
+ CINZA, ROXO, LARANJA, MARROM, AZUL_ESCURO, LARGURA, ALTURA, SISTEMA_DE_TIPOS)
+
+def main():
+ jogo = JogoUI()
+ jogo.rodar()
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/CInemon-IP/code/npc.py b/CInemon-IP/code/npc.py
new file mode 100644
index 0000000..e74f93d
--- /dev/null
+++ b/CInemon-IP/code/npc.py
@@ -0,0 +1,33 @@
+import pygame
+import os
+
+class NPC:
+ def __init__(self, x, y, nome, sprite_file="spr_fernanda_madeiral.png"):
+ self.x = x
+ self.y = y
+ self.nome = nome
+ self.width = 32
+ self.height = 32
+ self.rect = pygame.Rect(self.x + 8, self.y + 18, 24, 36) # Hitbox ajustada
+
+ try:
+ sprite_path = os.path.join("Desktop", "CInemon-IP", "sprites", sprite_file)
+ self.sprite = pygame.image.load(sprite_path).convert_alpha()
+ self.sprite = pygame.transform.scale(self.sprite, (self.width, self.height))
+ except Exception as e:
+ print(f"Erro ao carregar sprite do NPC {self.nome}: {e}")
+ self.sprite = None
+ self.cor = (0, 255, 255) # Ciano como fallback
+
+ def desenhar(self, tela, camera, zoom):
+ pos_x = (self.x - camera.x) * zoom
+ pos_y = (self.y - camera.y) * zoom
+ scaled_width = int(self.width * zoom)
+ scaled_height = int(self.height * zoom)
+
+ if self.sprite:
+ sprite_scaled = pygame.transform.scale(self.sprite, (scaled_width, scaled_height))
+ tela.blit(sprite_scaled, (pos_x, pos_y))
+ else:
+ rect_scaled = pygame.Rect(pos_x, pos_y, scaled_width, scaled_height)
+ pygame.draw.rect(tela, self.cor, rect_scaled)
\ No newline at end of file
diff --git a/CInemon-IP/code/personagem.py b/CInemon-IP/code/personagem.py
new file mode 100644
index 0000000..f7675fb
--- /dev/null
+++ b/CInemon-IP/code/personagem.py
@@ -0,0 +1,109 @@
+import pygame
+import os
+from config import BRANCO, PRETO, VERMELHO, AZUL, VERDE, AMARELO, CINZA, ROXO, LARANJA, MARROM, AZUL_ESCURO
+
+class Personagem:
+ def __init__(self, x, y, map_width, map_height):
+ self.x = x
+ self.y = y
+ self.x_anterior = x
+ self.y_anterior = y
+ self.velocidade = 5
+ self.map_width = map_width
+ self.map_height = map_height
+ self.hitbox_width = 8
+ self.hitbox_height = 8
+ self.rect = pygame.Rect(self.x + 16, self.y + 26, self.hitbox_width, self.hitbox_height)
+ self.direcao = "baixo"
+ self.dinheiro = 0
+
+ # Variáveis para animação
+ self.frame = 0 # Índice do frame atual
+ self.anim_speed = 0.2 # Velocidade da animação (quanto menor, mais rápido)
+ self.anim_counter = 0 # Contador para controlar a troca de frames
+
+ # Dicionário com sprites para cada direção
+ self.sprites = {
+ "direita": [
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_direita.png")).convert_alpha(),
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_andar_direita.png")).convert_alpha()
+ ],
+ "esquerda": [
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_esquerda.png")).convert_alpha(),
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_andar_esquerda.png")).convert_alpha()
+ ],
+ "baixo": [
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_frente.png")).convert_alpha(),
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_andar_baixo.png")).convert_alpha()
+ ],
+ "cima": [
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_costas.png")).convert_alpha(),
+ pygame.image.load(os.path.join("Desktop", "CInemon-IP", "sprites", "Protagonista", "protagonista_andar_cima.png")).convert_alpha()
+ ]
+ }
+
+ # Redimensiona todos os sprites para 32x32
+ for direcao in self.sprites:
+ for i in range(len(self.sprites[direcao])):
+ self.sprites[direcao][i] = pygame.transform.scale(self.sprites[direcao][i], (32, 32))
+
+ # Sprite inicial
+ self.sprite_atual = self.sprites["baixo"][0]
+
+ def mover(self, dx, dy):
+ self.x_anterior = self.x
+ self.y_anterior = self.y
+
+ self.x += dx * self.velocidade
+ self.y += dy * self.velocidade
+
+ # Atualiza direção
+ if dx > 0:
+ self.direcao = "direita"
+ elif dx < 0:
+ self.direcao = "esquerda"
+ elif dy > 0:
+ self.direcao = "baixo"
+ elif dy < 0:
+ self.direcao = "cima"
+
+ # Limites do mapa
+ self.x = max(0, min(self.map_width - 40, self.x))
+ self.y = max(0, min(self.map_height - 60, self.y))
+
+ # Atualiza o hitbox
+ self.rect.x = self.x + 16
+ self.rect.y = self.y + 26
+
+ # Animação: se está se movendo, alterna os frames
+ if dx != 0 or dy != 0:
+ self.anim_counter += self.anim_speed
+ if self.anim_counter >= 1:
+ self.anim_counter = 0
+ self.frame = (self.frame + 1) % 2 # Alterna entre 0 (parado) e 1 (andando)
+ self.sprite_atual = self.sprites[self.direcao][self.frame]
+ else:
+ # Se parado, usa o sprite "parado" (frame 0)
+ self.frame = 0
+ self.anim_counter = 0
+ self.sprite_atual = self.sprites[self.direcao][0]
+
+ def desenhar(self, tela, camera, zoom):
+ pos_x = (self.x - camera.x) * zoom
+ pos_y = (self.y - camera.y) * zoom
+
+ scaled_width = int(20 * zoom)
+ scaled_height = int(30 * zoom)
+ sprite_scaled = pygame.transform.scale(self.sprite_atual, (scaled_width, scaled_height))
+
+ # Inverte o sprite para a esquerda
+
+
+ tela.blit(sprite_scaled, (pos_x, pos_y))
+
+ # Desenha o hitbox (opcional, para debug)
+ hitbox_pos_x = (self.rect.x - camera.x) * zoom
+ hitbox_pos_y = (self.rect.y - camera.y) * zoom
+ hitbox_scaled_width = int(self.hitbox_width * zoom)
+ hitbox_scaled_height = int(self.hitbox_height * zoom)
+ hitbox_scaled = pygame.Rect(hitbox_pos_x, hitbox_pos_y, hitbox_scaled_width, hitbox_scaled_height)
\ No newline at end of file
diff --git a/CInemon-IP/data/Objects.tsx b/CInemon-IP/data/Objects.tsx
new file mode 100644
index 0000000..2b3626e
--- /dev/null
+++ b/CInemon-IP/data/Objects.tsx
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CInemon-IP/data/basic.tmx b/CInemon-IP/data/basic.tmx
new file mode 100644
index 0000000..efa3fa8
--- /dev/null
+++ b/CInemon-IP/data/basic.tmx
@@ -0,0 +1,200 @@
+
+
diff --git a/CInemon-IP/data/basic.tmx.tiled-project b/CInemon-IP/data/basic.tmx.tiled-project
new file mode 100644
index 0000000..953ae34
--- /dev/null
+++ b/CInemon-IP/data/basic.tmx.tiled-project
@@ -0,0 +1,14 @@
+{
+ "automappingRulesFile": "",
+ "commands": [
+ ],
+ "compatibilityVersion": 1100,
+ "extensionsPath": "extensions",
+ "folders": [
+ "."
+ ],
+ "properties": [
+ ],
+ "propertyTypes": [
+ ]
+}
diff --git a/CInemon-IP/data/basic.tmx.tiled-session b/CInemon-IP/data/basic.tmx.tiled-session
new file mode 100644
index 0000000..65234ae
--- /dev/null
+++ b/CInemon-IP/data/basic.tmx.tiled-session
@@ -0,0 +1,239 @@
+{
+ "Map/SizeTest": {
+ "height": 4300,
+ "width": 2
+ },
+ "activeFile": "C:/Users/PC/Downloads/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx",
+ "expandedProjectPaths": [
+ "."
+ ],
+ "file.lastUsedOpenFilter": "Todos os Ficheiros (*)",
+ "fileStates": {
+ "": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "#arroz": {
+ "dynamicWrapping": true
+ },
+ "#castle": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1
+ },
+ "#objetos": {
+ "dynamicWrapping": true,
+ "scaleInDock": 1
+ },
+ "#tree_1": {
+ "scaleInDock": 1
+ },
+ "#tree_2": {
+ "scaleInDock": 1
+ },
+ "#tree_3": {
+ "scaleInDock": 1
+ },
+ "C:/Users/Matheus/Desktop/Gabrielzao/data/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx": {
+ "dynamicWrapping": true,
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/CINEMON/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/Objects.tsx": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx": {
+ "scale": 0.45718749999999997,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 807.1086807928914,
+ "y": 872.7272727272727
+ }
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx#fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx#iki_town__tile_test__by_kingtapir_ddhlarg-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx#my_first_map__by_midnitez_remix_d6nwagg-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx#pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (1).tmx#tiles": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx": {
+ "scale": 0.2414583333333333,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 960.8283002588439,
+ "y": 639.8619499568593
+ }
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx#fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx#iki_town__tile_test__by_kingtapir_ddhlarg-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx#my_first_map__by_midnitez_remix_d6nwagg-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx#pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic (2).tmx#tiles": {
+ "scaleInDock": 1
+ },
+ "C:/Users/PC/Downloads/basic.tmx": {
+ "scale": 0.45718749999999997,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 960.2187286397814,
+ "y": 951.4695830485305
+ }
+ },
+ "C:/Users/PC/Downloads/basic.tmx#fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/basic.tmx#iki_town__tile_test__by_kingtapir_ddhlarg-fullview": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/basic.tmx#my_first_map__by_midnitez_remix_d6nwagg-fullview": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/basic.tmx#pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/basic.tmx#tiles": {
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1,
+ "scaleInEditor": 1
+ },
+ "C:/Users/PC/Downloads/tiles padrao.tsx": {
+ "scaleInDock": 1
+ },
+ "Objects.tsx": {
+ "dynamicWrapping": true,
+ "scaleInDock": 0.25
+ },
+ "arroz.tmx": {
+ "scale": 0.15734374999999998,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 514.7964250248265,
+ "y": 508.4409136047666
+ }
+ },
+ "basic.tmx": {
+ "scale": 1,
+ "selectedLayer": 3,
+ "viewCenter": {
+ "x": 863,
+ "y": 928
+ }
+ },
+ "basic.tmx#fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre": {
+ "dynamicWrapping": false,
+ "scaleInDock": 0.75
+ },
+ "basic.tmx#iki_town__tile_test__by_kingtapir_ddhlarg-fullview": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1
+ },
+ "basic.tmx#my_first_map__by_midnitez_remix_d6nwagg-fullview": {
+ "scaleInDock": 1
+ },
+ "basic.tmx#neo_islands_template_city_by_fallen_angel_snoops_d3hbnjc-375w": {
+ "scaleInDock": 1
+ },
+ "basic.tmx#pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1.5
+ },
+ "basic.tmx#pokemon_style_monster_mmorpg_map_volcano_cave_2f_by_monstermmorpg_d4ah3ga (1)": {
+ "dynamicWrapping": false
+ },
+ "basic.tmx#pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1
+ },
+ "basic.tmx#tiles": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1
+ },
+ "cin.tmx": {
+ "scale": 0.8349609375,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 511.40116959064324,
+ "y": 353.3099415204679
+ }
+ },
+ "objetos.tmx": {
+ "scale": 0.66796875,
+ "selectedLayer": 0,
+ "viewCenter": {
+ "x": 401.2163742690059,
+ "y": 639.2514619883041
+ }
+ },
+ "objetos.tmx#arroz": {
+ "dynamicWrapping": true,
+ "scaleInEditor": 0.25
+ },
+ "pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx": {
+ "dynamicWrapping": false,
+ "scaleInDock": 1.5,
+ "scaleInEditor": 1
+ },
+ "tiles padrao.tsx": {
+ "dynamicWrapping": false,
+ "scaleInDock": 0.0625,
+ "scaleInEditor": 0.25
+ }
+ },
+ "last.externalTilesetPath": "C:/Users/PC/Desktop/CInemon-IP/data",
+ "last.imagePath": "C:/Users/PC/Desktop/CInemon-IP/graphics/tilesets",
+ "map.height": 100,
+ "map.lastUsedFormat": "tmx",
+ "map.tileHeight": 128,
+ "map.tileWidth": 128,
+ "map.width": 100,
+ "openFiles": [
+ "basic.tmx",
+ "C:/Users/PC/Downloads/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx"
+ ],
+ "project": "basic.tmx.tiled-project",
+ "property.type": "int",
+ "recentFiles": [
+ "basic.tmx",
+ "C:/Users/PC/Downloads/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx",
+ "cin.tmx",
+ "C:/Users/PC/Downloads/basic (1).tmx",
+ "arroz.tmx",
+ "tiles padrao.tsx",
+ "C:/Users/PC/Downloads/basic (2).tmx",
+ "pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx",
+ "objetos.tmx"
+ ],
+ "tileset.embedInMap": true,
+ "tileset.lastUsedFormat": "tsx",
+ "tileset.tileSize": {
+ "height": 32,
+ "width": 32
+ },
+ "tileset.type": 0
+}
diff --git a/CInemon-IP/data/cin.tmx b/CInemon-IP/data/cin.tmx
new file mode 100644
index 0000000..23e0538
--- /dev/null
+++ b/CInemon-IP/data/cin.tmx
@@ -0,0 +1,148 @@
+
+
diff --git a/CInemon-IP/data/objetos.tmx b/CInemon-IP/data/objetos.tmx
new file mode 100644
index 0000000..31909e2
--- /dev/null
+++ b/CInemon-IP/data/objetos.tmx
@@ -0,0 +1,19 @@
+
+
diff --git a/CInemon-IP/data/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx b/CInemon-IP/data/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx
new file mode 100644
index 0000000..61b5a54
--- /dev/null
+++ b/CInemon-IP/data/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.tsx
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CInemon-IP/data/tiles padrao.tsx b/CInemon-IP/data/tiles padrao.tsx
new file mode 100644
index 0000000..7774fbb
--- /dev/null
+++ b/CInemon-IP/data/tiles padrao.tsx
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CInemon-IP/graphics/Fotos/fundo.png b/CInemon-IP/graphics/Fotos/fundo.png
new file mode 100644
index 0000000..f3d6989
Binary files /dev/null and b/CInemon-IP/graphics/Fotos/fundo.png differ
diff --git a/CInemon-IP/graphics/Fotos/milk.png b/CInemon-IP/graphics/Fotos/milk.png
new file mode 100644
index 0000000..d10dd2b
Binary files /dev/null and b/CInemon-IP/graphics/Fotos/milk.png differ
diff --git a/CInemon-IP/graphics/objects/castle.png b/CInemon-IP/graphics/objects/castle.png
new file mode 100644
index 0000000..3ce538a
Binary files /dev/null and b/CInemon-IP/graphics/objects/castle.png differ
diff --git a/CInemon-IP/graphics/objects/mushroom_1.png b/CInemon-IP/graphics/objects/mushroom_1.png
new file mode 100644
index 0000000..3066e55
Binary files /dev/null and b/CInemon-IP/graphics/objects/mushroom_1.png differ
diff --git a/CInemon-IP/graphics/objects/mushroom_2.png b/CInemon-IP/graphics/objects/mushroom_2.png
new file mode 100644
index 0000000..38b33c1
Binary files /dev/null and b/CInemon-IP/graphics/objects/mushroom_2.png differ
diff --git a/CInemon-IP/graphics/objects/mushroom_3.png b/CInemon-IP/graphics/objects/mushroom_3.png
new file mode 100644
index 0000000..b6d3640
Binary files /dev/null and b/CInemon-IP/graphics/objects/mushroom_3.png differ
diff --git a/CInemon-IP/graphics/objects/tower.png b/CInemon-IP/graphics/objects/tower.png
new file mode 100644
index 0000000..3ff1ebc
Binary files /dev/null and b/CInemon-IP/graphics/objects/tower.png differ
diff --git a/CInemon-IP/graphics/objects/tree_1.png b/CInemon-IP/graphics/objects/tree_1.png
new file mode 100644
index 0000000..1d6ffec
Binary files /dev/null and b/CInemon-IP/graphics/objects/tree_1.png differ
diff --git a/CInemon-IP/graphics/objects/tree_2.png b/CInemon-IP/graphics/objects/tree_2.png
new file mode 100644
index 0000000..84b1bb1
Binary files /dev/null and b/CInemon-IP/graphics/objects/tree_2.png differ
diff --git a/CInemon-IP/graphics/objects/tree_3.png b/CInemon-IP/graphics/objects/tree_3.png
new file mode 100644
index 0000000..78aae38
Binary files /dev/null and b/CInemon-IP/graphics/objects/tree_3.png differ
diff --git a/CInemon-IP/graphics/tilesets/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg b/CInemon-IP/graphics/tilesets/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg
new file mode 100644
index 0000000..bfec14f
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg differ
diff --git a/CInemon-IP/graphics/tilesets/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg b/CInemon-IP/graphics/tilesets/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg
new file mode 100644
index 0000000..1e7a02a
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg differ
diff --git a/CInemon-IP/graphics/tilesets/my_first_map__by_midnitez_remix_d6nwagg-fullview.jpg b/CInemon-IP/graphics/tilesets/my_first_map__by_midnitez_remix_d6nwagg-fullview.jpg
new file mode 100644
index 0000000..9f09898
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/my_first_map__by_midnitez_remix_d6nwagg-fullview.jpg differ
diff --git a/CInemon-IP/graphics/tilesets/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg b/CInemon-IP/graphics/tilesets/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg
new file mode 100644
index 0000000..517c1f4
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg differ
diff --git a/CInemon-IP/graphics/tilesets/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.png b/CInemon-IP/graphics/tilesets/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.png
new file mode 100644
index 0000000..6fdac4f
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/pokemon_tileset_from_public_tiles_32x32_by_chaoticcherrycake_dab2byf.png differ
diff --git a/CInemon-IP/graphics/tilesets/terrain_corner.png b/CInemon-IP/graphics/tilesets/terrain_corner.png
new file mode 100644
index 0000000..72ed700
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/terrain_corner.png differ
diff --git a/CInemon-IP/graphics/tilesets/terrain_edges.png b/CInemon-IP/graphics/tilesets/terrain_edges.png
new file mode 100644
index 0000000..1afc0c8
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/terrain_edges.png differ
diff --git a/CInemon-IP/graphics/tilesets/tiles.png b/CInemon-IP/graphics/tilesets/tiles.png
new file mode 100644
index 0000000..0592430
Binary files /dev/null and b/CInemon-IP/graphics/tilesets/tiles.png differ
diff --git a/CInemon-IP/maps tiled/Screenshot_7.png b/CInemon-IP/maps tiled/Screenshot_7.png
new file mode 100644
index 0000000..c4e1ccd
Binary files /dev/null and b/CInemon-IP/maps tiled/Screenshot_7.png differ
diff --git a/CInemon-IP/maps tiled/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg b/CInemon-IP/maps tiled/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg
new file mode 100644
index 0000000..ee3ae07
Binary files /dev/null and b/CInemon-IP/maps tiled/fakemon_region_starting_town___nuevo_town_by_stopdrawingcartoons_dek37jy-pre.jpg differ
diff --git a/CInemon-IP/maps tiled/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg b/CInemon-IP/maps tiled/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg
new file mode 100644
index 0000000..b2a3c9a
Binary files /dev/null and b/CInemon-IP/maps tiled/iki_town__tile_test__by_kingtapir_ddhlarg-fullview.jpg differ
diff --git a/CInemon-IP/maps tiled/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg b/CInemon-IP/maps tiled/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg
new file mode 100644
index 0000000..2853572
Binary files /dev/null and b/CInemon-IP/maps tiled/pokemon_bw3__nuvema_town_by_midnitez_remix_d9wq577-fullview.jpg differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_andar_baixo.png b/CInemon-IP/sprites/Protagonista/protagonista_andar_baixo.png
new file mode 100644
index 0000000..1eb3cfe
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_andar_baixo.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_andar_cima.png b/CInemon-IP/sprites/Protagonista/protagonista_andar_cima.png
new file mode 100644
index 0000000..d9113ad
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_andar_cima.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_andar_direita.png b/CInemon-IP/sprites/Protagonista/protagonista_andar_direita.png
new file mode 100644
index 0000000..c0847b5
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_andar_direita.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_andar_esquerda.png b/CInemon-IP/sprites/Protagonista/protagonista_andar_esquerda.png
new file mode 100644
index 0000000..1175fe6
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_andar_esquerda.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_costas.png b/CInemon-IP/sprites/Protagonista/protagonista_costas.png
new file mode 100644
index 0000000..bce2b0f
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_costas.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_direita.png b/CInemon-IP/sprites/Protagonista/protagonista_direita.png
new file mode 100644
index 0000000..1b3cf1b
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_direita.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_esquerda.png b/CInemon-IP/sprites/Protagonista/protagonista_esquerda.png
new file mode 100644
index 0000000..a4fec96
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_esquerda.png differ
diff --git a/CInemon-IP/sprites/Protagonista/protagonista_frente.png b/CInemon-IP/sprites/Protagonista/protagonista_frente.png
new file mode 100644
index 0000000..d6b02e1
Binary files /dev/null and b/CInemon-IP/sprites/Protagonista/protagonista_frente.png differ
diff --git a/CInemon-IP/sprites/spr_cracha_coletavel.png b/CInemon-IP/sprites/spr_cracha_coletavel.png
new file mode 100644
index 0000000..906b1f7
Binary files /dev/null and b/CInemon-IP/sprites/spr_cracha_coletavel.png differ
diff --git a/CInemon-IP/sprites/spr_enfermeira_joy.png b/CInemon-IP/sprites/spr_enfermeira_joy.png
new file mode 100644
index 0000000..b0d2a27
Binary files /dev/null and b/CInemon-IP/sprites/spr_enfermeira_joy.png differ
diff --git a/CInemon-IP/sprites/spr_fernanda_madeiral_2.1.png b/CInemon-IP/sprites/spr_fernanda_madeiral_2.1.png
new file mode 100644
index 0000000..ea8929b
Binary files /dev/null and b/CInemon-IP/sprites/spr_fernanda_madeiral_2.1.png differ
diff --git "a/CInemon-IP/sprites/spr_gema_colet\303\241vel_2.png" "b/CInemon-IP/sprites/spr_gema_colet\303\241vel_2.png"
new file mode 100644
index 0000000..c1980c7
Binary files /dev/null and "b/CInemon-IP/sprites/spr_gema_colet\303\241vel_2.png" differ
diff --git a/CInemon-IP/sprites/spr_pedro_manhaes2.png b/CInemon-IP/sprites/spr_pedro_manhaes2.png
new file mode 100644
index 0000000..bce5af2
Binary files /dev/null and b/CInemon-IP/sprites/spr_pedro_manhaes2.png differ
diff --git a/CInemon-IP/sprites/spr_ricardo_2.1-export.png b/CInemon-IP/sprites/spr_ricardo_2.1-export.png
new file mode 100644
index 0000000..9a86eac
Binary files /dev/null and b/CInemon-IP/sprites/spr_ricardo_2.1-export.png differ
diff --git a/CInemon-IP/sprites/spr_sergio_soares.png b/CInemon-IP/sprites/spr_sergio_soares.png
new file mode 100644
index 0000000..0d57042
Binary files /dev/null and b/CInemon-IP/sprites/spr_sergio_soares.png differ