// lib/providers/game_state_provider.dart import 'package:flutter/material.dart'; import 'dart:math'; import 'package:kzeduca_app/models/character.dart'; import 'package:kzeduca_app/models/attributes.dart'; import 'package:kzeduca_app/models/game_event.dart'; /// Um provedor de estado que gerencia o estado completo do jogo. /// Ele usa a arquitetura Provider (ChangeNotifier) para notificar a UI /// sobre mudanças no estado do jogo. class GameStateProvider extends ChangeNotifier { Character? _playerCharacter; List _availableEvents = []; List _unseenEvents = []; int _currentDay = 1; bool _isGameOver = false; // Getters para aceder ao estado do jogo Character? get playerCharacter => _playerCharacter; List get availableEvents => _availableEvents; int get currentDay => _currentDay; bool get isGameOver => _isGameOver; /// Lista de todos os eventos possíveis no jogo. // lib/providers/game_state_provider.dart final List _allPossibleEvents = [ // ======================================================================= // === EVENTOS PARA O CENÁRIO 'LUANDA' (ESTUDANTE, CHEFE DE FAMÍLIA) === // ======================================================================= GameEvent( title: "Aumento da Renda", description: "O proprietário subiu o preço da renda. Paga ou procura um lugar mais barato?", scenario: "Luanda", decisions: [ Decision( text: "Pagar o novo valor (-20.000 Kz)", consequenceText: "O seu orçamento ficou mais apertado, mas a moradia está garantida.", effect: Attributes(money: -20000.0), ), Decision( text: "Procurar outro lugar", consequenceText: "Você gasta tempo e energia a procurar, mas pode economizar a longo prazo.", effect: Attributes(health: -0.1, happiness: -0.1), ), ], ), GameEvent( title: "Problema de Saúde na Família", description: "Um membro da família ficou doente e precisa de remédios caros. Você tem que ajudar.", scenario: "Luanda", decisions: [ Decision( text: "Pagar pelos remédios (-15.000 Kz)", consequenceText: "A família ficou grata, mas a despesa foi pesada. A saúde da pessoa melhorou.", effect: Attributes(money: -15000.0, happiness: 0.2), ), Decision( text: "Procurar apoio do posto de saúde", consequenceText: "Você conseguiu ajuda, mas o processo foi demorado e a pessoa demorou a melhorar.", effect: Attributes(health: -0.1), ), ], ), GameEvent( title: "Oportunidade de Trabalho", description: "Há um trabalho de meio período na universidade. Pode ajudar a pagar as contas.", scenario: "Luanda", decisions: [ Decision( text: "Aceitar o trabalho (+10.000 Kz)", consequenceText: "Você ganhou mais dinheiro e experiência profissional, mas o tempo para a diversão diminuiu.", effect: Attributes(money: 10000.0, professionalExperience: 0.1, happiness: -0.1), ), Decision( text: "Recusar e focar nos estudos", consequenceText: "Sua vida académica melhorou, mas o dinheiro continua apertado.", effect: Attributes(education: 0.1), ), ], ), GameEvent( title: "Convite para Casamento", description: "Um parente distante convida para o seu casamento. O presente e a viagem serão caros.", scenario: "Luanda", decisions: [ Decision( text: "Ir ao casamento (-10.000 Kz)", consequenceText: "Você gastou dinheiro, mas a sua felicidade aumentou e a família ficou satisfeita.", effect: Attributes(money: -10000.0, happiness: 0.2), ), Decision( text: "Não ir e dar uma desculpa", consequenceText: "Você economizou, mas a família ficou um pouco desapontada.", effect: Attributes(happiness: -0.1), ), ], ), GameEvent( title: "Quebra de Geladeira", description: "A sua geladeira quebrou e a comida pode estragar. Conserta ou compra uma nova?", scenario: "Luanda", decisions: [ Decision( text: "Consertar a antiga (-5.000 Kz)", consequenceText: "O conserto é mais barato, mas pode não durar muito.", effect: Attributes(money: -5000.0), ), Decision( text: "Comprar uma nova (-30.000 Kz)", consequenceText: "A nova geladeira é segura e eficiente, mas a despesa é grande.", effect: Attributes(money: -30000.0, happiness: 0.1), ), ], ), GameEvent( title: "Problema com a Água", description: "A fatura da água chegou com um valor muito alto. Há um vazamento no prédio.", scenario: "Luanda", decisions: [ Decision( text: "Pagar a fatura completa (-10.000 Kz)", consequenceText: "Você evitou o corte de água, mas pagou caro pelo problema.", effect: Attributes(money: -10000.0), ), Decision( text: "Contestar a fatura", consequenceText: "A fatura foi reavaliada, mas o processo foi demorado e estressante.", effect: Attributes(happiness: -0.1), ), ], ), GameEvent( title: "Concurso de Estudos", description: "Um concurso académico oferece um prémio em dinheiro. Participa para ganhar ou foca nas tarefas do dia a dia?", scenario: "Luanda", decisions: [ Decision( text: "Participar do concurso (+10.000 Kz)", consequenceText: "Você ganhou o concurso, melhorando as suas finanças e reputação académica.", effect: Attributes(money: 10000.0, education: 0.2), ), Decision( text: "Focar em outras responsabilidades", consequenceText: "Você não ganhou dinheiro extra, mas conseguiu lidar com o resto do seu trabalho e tarefas.", effect: Attributes(), ), ], ), GameEvent( title: "Convite de Negócio", description: "Um amigo te convida para se juntar a ele em um pequeno negócio. Você vai arriscar?", scenario: "Luanda", decisions: [ Decision( text: "Investir 5.000 Kz para começar", consequenceText: "O investimento foi um sucesso, e o seu dinheiro aumentou.", effect: Attributes(money: 5000.0, professionalExperience: 0.1), ), Decision( text: "Não arriscar. Não tem tempo.", consequenceText: "Você não perdeu dinheiro, mas a oportunidade foi perdida.", effect: Attributes(), ), ], ), GameEvent( title: "Festa de Aniversário", description: "A sua festa de aniversário está a chegar. Vai fazer uma festa grande ou uma celebração pequena?", scenario: "Luanda", decisions: [ Decision( text: "Fazer uma festa grande (-20.000 Kz)", consequenceText: "A festa foi ótima e a sua felicidade aumentou, mas o seu dinheiro diminuiu.", effect: Attributes(money: -20000.0, happiness: 0.2), ), Decision( text: "Fazer uma celebração pequena", consequenceText: "Você economizou, mas a celebração não foi tão divertida quanto o planeado.", effect: Attributes(happiness: 0.05), ), ], ), GameEvent( title: "Dívida Inesperada", description: "Você recebeu uma notificação de uma dívida antiga que tinha esquecido. Você precisa pagar agora.", scenario: "Luanda", decisions: [ Decision( text: "Pagar a dívida (-10.000 Kz)", consequenceText: "Você pagou, aliviando o stress, mas o seu dinheiro foi afetado.", effect: Attributes(money: -10000.0, happiness: 0.1), ), Decision( text: "Tentar negociar um plano de pagamento", consequenceText: "A negociação foi bem sucedida, e você conseguiu pagar menos, mas o processo foi longo.", effect: Attributes(money: -5000.0, health: -0.05), ), ], ), GameEvent( title: "Aumento nos Preços", description: "O preço dos produtos no mercado subiu. Você precisa lidar com a inflação.", scenario: "Luanda", decisions: [ Decision( text: "Comprar em quantidade (-5.000 Kz)", consequenceText: "Você gastou mais agora, mas economizará a longo prazo.", effect: Attributes(money: -5000.0), ), Decision( text: "Comprar apenas o essencial", consequenceText: "Você economizou, mas pode ter que comprar mais produtos no futuro por um preço mais alto.", effect: Attributes(money: 0.0), ), ], ), GameEvent( title: "Venda de Carro", description: "O seu carro está velho e está a dar muitos problemas. Vende ou conserta?", scenario: "Luanda", decisions: [ Decision( text: "Vender o carro (+20.000 Kz)", consequenceText: "Você ganhou um dinheiro extra, mas agora terá que usar transporte público.", effect: Attributes(money: 20000.0, happiness: -0.1), ), Decision( text: "Consertar o carro (-15.000 Kz)", consequenceText: "O carro está a funcionar, mas o conserto foi caro e pode dar problemas novamente.", effect: Attributes(money: -15000.0), ), ], ), GameEvent( title: "Despesa de Transporte", description: "O preço dos bilhetes de táxi subiu devido à inflação. Como vai lidar com isso?", scenario: "Luanda", decisions: [ Decision( text: "Pagar o preço total (-500 Kz)", consequenceText: "Você pagou, mas o seu orçamento ficou mais apertado.", effect: Attributes(money: -500.0), ), Decision( text: "Caminhar para economizar", consequenceText: "Você economizou dinheiro, mas a sua saúde e felicidade diminuíram.", effect: Attributes(money: 0.0, happiness: -0.2, health: -0.2), ), ], ), GameEvent( title: "Oportunidade de Negócio", description: "Um amigo sugere que você comece um pequeno negócio online para vender roupas. Vai arriscar?", scenario: "Luanda", decisions: [ Decision( text: "Investir 5.000 Kz para começar (+5.000 Kz de potencial)", consequenceText: "Você investiu. Há um potencial de lucro, mas também de perda. A experiência aumentou.", effect: Attributes(money: -5000.0, professionalExperience: 0.2), ), Decision( text: "Não arriscar. Não tem tempo.", consequenceText: "Você não arriscou. A sua situação financeira e experiência profissional não mudaram.", effect: Attributes(), ), ], ), GameEvent( title: "Livros e Materiais de Estudo", description: "A bibliografia do curso é cara. Compra tudo ou procura versões digitais?", scenario: "Luanda", decisions: [ Decision( text: "Comprar os livros originais (-10.000 Kz)", consequenceText: "Os livros são caros, mas o seu desempenho académico pode melhorar.", effect: Attributes(money: -10000.0, education: 0.1), ), Decision( text: "Procurar versões digitais gratuitas", consequenceText: "Você economizou, mas a pesquisa tomou tempo e a qualidade pode ser inferior.", effect: Attributes(happiness: -0.05, education: -0.05), ), ], ), GameEvent( title: "Convite para Festa", description: "Um colega convida para uma festa. Vai socializar ou ficar em casa a estudar?", scenario: "Luanda", decisions: [ Decision( text: "Ir à festa (-2.000 Kz)", consequenceText: "Você divertiu-se e fez novas amizades, mas gastou dinheiro.", effect: Attributes(money: -2000.0, happiness: 0.2), ), Decision( text: "Ficar em casa e estudar", consequenceText: "Você não gastou dinheiro e dedicou-se aos estudos, mas sentiu-se um pouco solitário.", effect: Attributes(happiness: -0.1, education: 0.1), ), ], ), GameEvent( title: "Problema de Saúde", description: "Você está com uma gripe. Vai ao médico ou trata-se em casa?", scenario: "Luanda", decisions: [ Decision( text: "Ir à clínica privada (-8.000 Kz)", consequenceText: "A clínica privada é cara, mas a recuperação é mais rápida.", effect: Attributes(money: -8000.0, health: 0.2), ), Decision( text: "Tratar em casa com chás e descanso", consequenceText: "Você economizou, mas a recuperação será mais lenta e a saúde fica em risco.", effect: Attributes(health: -0.1), ), ], ), GameEvent( title: "Reparo no Computador", description: "O seu computador estragou e você precisa dele para fazer o trabalho da faculdade.", scenario: "Luanda", decisions: [ Decision( text: "Levar à assistência técnica (-15.000 Kz)", consequenceText: "O computador foi reparado rapidamente, mas pesou no orçamento.", effect: Attributes(money: -15000.0, happiness: -0.1), ), Decision( text: "Tentar reparar por conta própria", consequenceText: "Você economizou dinheiro, mas a tentativa de reparo falhou, perdendo mais tempo.", effect: Attributes(happiness: -0.15, health: -0.05), ), ], ), GameEvent( title: "Bolsa de Estudo", description: "Você se qualificou para uma bolsa de estudo. Ela oferece um valor fixo mensal.", scenario: "Luanda", decisions: [ Decision( text: "Aceitar a bolsa (+10.000 Kz)", consequenceText: "A bolsa aliviou a sua carga financeira, mas agora você precisa manter notas altas para não a perder.", effect: Attributes(money: 10000.0, education: 0.1), ), Decision( text: "Recusar a bolsa", consequenceText: "Você recusa a bolsa por não querer se sentir pressionado. Sua situação financeira e felicidade não mudam.", effect: Attributes(), ), ], ), GameEvent( title: "Desconto na Renda", description: "O proprietário do seu quarto oferece um desconto se você pagar 3 meses adiantado.", scenario: "Luanda", decisions: [ Decision( text: "Pagar adiantado (-45.000 Kz)", consequenceText: "Você conseguiu um bom desconto e não terá que se preocupar com a renda por algum tempo.", effect: Attributes(money: -45000.0, happiness: 0.1), ), Decision( text: "Pagar mensalmente", consequenceText: "Você mantém a flexibilidade, mas não aproveita o desconto.", effect: Attributes(money: -15000.0), ), ], ), GameEvent( title: "Venda de Livros Usados", description: "Você tem livros do semestre anterior que pode vender para outros estudantes.", scenario: "Luanda", decisions: [ Decision( text: "Vender os livros (+5.000 Kz)", consequenceText: "Você vendeu os livros, ganhando um dinheiro extra e desocupando espaço.", effect: Attributes(money: 5000.0, happiness: 0.05), ), Decision( text: "Guardar os livros", consequenceText: "Você mantém os livros para consulta futura, mas perde a oportunidade de dinheiro extra.", effect: Attributes(education: 0.05), ), ], ), GameEvent( title: "Projeto de Grupo", description: "Seu grupo para o projeto final não está a colaborar. Você pode fazer tudo sozinho ou tentar motivá-los.", scenario: "Luanda", decisions: [ Decision( text: "Fazer tudo sozinho", consequenceText: "Você garantiu uma nota alta, mas o stress afetou sua saúde e felicidade.", effect: Attributes(education: 0.2, health: -0.1, happiness: -0.1), ), Decision( text: "Tentar motivá-los", consequenceText: "A colaboração melhorou, e vocês entregaram um bom projeto. Sua experiência de trabalho em equipa aumentou.", effect: Attributes(education: 0.1, professionalExperience: 0.1, happiness: 0.05), ), ], ), // ======================================================================= // === EVENTOS PARA O CENÁRIO 'BENGUELA' (EMPREENDEDOR, ARTISTA) === // ======================================================================= GameEvent( title: "Problema com Fornecedor", description: "O seu fornecedor de matéria-prima está atrasado. Isso pode atrasar a produção e irritar os clientes.", scenario: "Benguela", decisions: [ Decision( text: "Pagar mais por uma entrega expressa (-10.000 Kz)", consequenceText: "A entrega foi rápida e você evitou o problema, mas a margem de lucro diminuiu.", effect: Attributes(money: -10000.0), ), Decision( text: "Explicar a situação aos clientes e negociar", consequenceText: "Alguns clientes entenderam, outros cancelaram os pedidos. Sua reputação ficou um pouco abalada.", effect: Attributes(money: 500.0, happiness: -0.1), ), ], ), GameEvent( title: "Oportunidade de Mercado", description: "Uma nova feira de negócios foi anunciada na cidade. Participar pode atrair novos clientes.", scenario: "Benguela", decisions: [ Decision( text: "Alugar um stand (-20.000 Kz)", consequenceText: "O investimento foi alto, mas você fez muitos contatos e conseguiu novas vendas.", effect: Attributes(money: -20000.0, happiness: 0.2, professionalExperience: 0.2), ), Decision( text: "Não participar", consequenceText: "Você economizou dinheiro, mas perdeu uma grande oportunidade de networking e crescimento.", effect: Attributes(), ), ], ), GameEvent( title: "Contratação de Funcionário", description: "A demanda pelo seu produto está a crescer. Você precisa de ajuda para dar conta do recado.", scenario: "Benguela", decisions: [ Decision( text: "Contratar um funcionário em part-time (-5.000 Kz/semana)", consequenceText: "O funcionário aumenta a sua capacidade de produção, mas o salário é uma despesa fixa.", effect: Attributes(money: -5000.0, professionalExperience: 0.1), ), Decision( text: "Continuar a fazer tudo sozinho", consequenceText: "Você não tem despesas extras, mas a carga de trabalho está a afetar a sua saúde e felicidade.", effect: Attributes(happiness: -0.15, health: -0.1), ), ], ), GameEvent( title: "Problema com o Pagamento", description: "Um cliente fez uma grande encomenda, mas o pagamento está atrasado. O que você faz?", scenario: "Benguela", decisions: [ Decision( text: "Enviar um lembrete educado", consequenceText: "O cliente pagou no dia seguinte, e a relação permaneceu boa.", effect: Attributes(money: 10000.0), ), Decision( text: "Cobrar de forma agressiva", consequenceText: "O cliente pagou, mas nunca mais comprou de você. Sua reputação no mercado foi danificada.", effect: Attributes(money: 10000.0, happiness: -0.1), ), ], ), GameEvent( title: "Investimento em Publicidade", description: "Você pode investir 10.000 Kz em publicidade online para o seu negócio.", scenario: "Benguela", decisions: [ Decision( text: "Fazer o investimento (-10.000 Kz)", consequenceText: "O investimento gerou muitas novas vendas e aumentou o seu alcance.", effect: Attributes(money: -10000.0, happiness: 0.1, professionalExperience: 0.1), ), Decision( text: "Não investir", consequenceText: "Você economizou dinheiro, mas perdeu a oportunidade de crescer o seu negócio.", effect: Attributes(), ), ], ), GameEvent( title: "Inspeção Fiscal", description: "Uma inspeção fiscal inesperada pode revelar irregularidades e resultar em multas.", scenario: "Benguela", decisions: [ Decision( text: "Apresentar a documentação completa", consequenceText: "Você estava em ordem, e a inspeção foi rápida. A sua experiência profissional em burocracia aumentou.", effect: Attributes(professionalExperience: 0.1), ), Decision( text: "Pagar uma pequena propina para simplificar (-5.000 Kz)", consequenceText: "Você evitou problemas imediatos, mas a sua felicidade e integridade diminuíram.", effect: Attributes(money: -5000.0, happiness: -0.2), ), ], ), GameEvent( title: "Concorrência Desleal", description: "Um concorrente está a vender o mesmo produto a um preço irrealista para roubar seus clientes.", scenario: "Benguela", decisions: [ Decision( text: "Reduzir o seu preço também", consequenceText: "Você manteve seus clientes, mas a margem de lucro diminuiu, afetando o seu dinheiro.", effect: Attributes(money: -5000.0), ), Decision( text: "Focar na qualidade do seu produto", consequenceText: "Seus clientes fiéis valorizaram a qualidade, mas você perdeu alguns novos clientes para a concorrência. A sua reputação de qualidade aumentou.", effect: Attributes(professionalExperience: 0.1), ), ], ), GameEvent( title: "Problema de Logística", description: "A entrega de um grande pedido para uma cidade vizinha teve um problema. Você precisa resolver isso.", scenario: "Benguela", decisions: [ Decision( text: "Contratar uma nova transportadora (-15.000 Kz)", consequenceText: "O problema foi resolvido rapidamente, mas custou mais dinheiro do que o esperado.", effect: Attributes(money: -15000.0), ), Decision( text: "Levar o pedido pessoalmente", consequenceText: "Você economizou dinheiro, mas a viagem foi longa e cansativa, afetando sua saúde e felicidade.", effect: Attributes(health: -0.1, happiness: -0.1), ), ], ), GameEvent( title: "Expansão do Negócio", description: "Você tem a oportunidade de abrir uma nova filial em outra área de Benguela.", scenario: "Benguela", decisions: [ Decision( text: "Arriscar e expandir (-50.000 Kz)", consequenceText: "A nova filial teve um bom começo, aumentando o seu alcance e potencial de lucro.", effect: Attributes(money: -50000.0, professionalExperience: 0.2, happiness: 0.1), ), Decision( text: "Manter-se como está", consequenceText: "Você permaneceu seguro, mas a oportunidade de crescimento foi perdida.", effect: Attributes(), ), ], ), GameEvent( title: "Reparo de Equipamento", description: "Uma das suas máquinas de produção quebrou e precisa de um conserto caro.", scenario: "Benguela", decisions: [ Decision( text: "Consertar imediatamente (-20.000 Kz)", consequenceText: "A produção voltou ao normal rapidamente, mas o conserto pesou no seu dinheiro.", effect: Attributes(money: -20000.0), ), Decision( text: "Tentar consertar sozinho", consequenceText: "Você conseguiu consertar, economizando dinheiro, mas a máquina ainda não está a 100%.", effect: Attributes(professionalExperience: 0.1), ), ], ), GameEvent( title: "Galeria de Arte", description: "Uma galeria de arte local convida-o para exibir o seu trabalho. Há uma taxa de entrada, mas a exposição pode atrair compradores.", scenario: "Benguela", decisions: [ Decision( text: "Pagar a taxa e expor (-10.000 Kz)", consequenceText: "A exposição gerou boas vendas e aumentou a sua reputação.", effect: Attributes(money: 20000.0, happiness: 0.1, professionalExperience: 0.2), ), Decision( text: "Recusar a exposição", consequenceText: "Você economizou, mas perdeu a oportunidade de mostrar a sua arte.", effect: Attributes(), ), ], ), GameEvent( title: "Comissão de Pintura", description: "Um cliente importante encomenda uma pintura. O prazo é apertado, mas o pagamento é generoso.", scenario: "Benguela", decisions: [ Decision( text: "Aceitar a comissão (+30.000 Kz)", consequenceText: "Você entregou a pintura a tempo, ganhando muito dinheiro, mas ficou exausto.", effect: Attributes(money: 30000.0, health: -0.1), ), Decision( text: "Recusar a comissão", consequenceText: "Você não se sobrecarregou, mas perdeu uma grande oportunidade financeira.", effect: Attributes(happiness: 0.05), ), ], ), GameEvent( title: "Oficina de Escultura", description: "Uma oportunidade para fazer uma oficina de escultura para iniciantes surgiu. Isso pode te dar um dinheiro extra e experiência de ensino.", scenario: "Benguela", decisions: [ Decision( text: "Fazer a oficina (+5.000 Kz)", consequenceText: "A oficina foi um sucesso, você ganhou um dinheiro extra e a felicidade dos alunos te fez muito feliz.", effect: Attributes(money: 5000.0, happiness: 0.15, professionalExperience: 0.1), ), Decision( text: "Não fazer a oficina", consequenceText: "Você optou por não ensinar, focando na sua própria arte. Sua situação não mudou.", effect: Attributes(), ), ], ), GameEvent( title: "Crise Criativa", description: "Você está sem inspiração e não consegue criar nada novo. A pressão para produzir está a aumentar.", scenario: "Benguela", decisions: [ Decision( text: "Tirar um tempo para si e viajar (-2.000 Kz)", consequenceText: "A viagem revigorou a sua mente, mas pesou no seu bolso.", effect: Attributes(money: -2000.0, happiness: 0.2), ), Decision( text: "Forçar-se a trabalhar", consequenceText: "Você se esforçou, mas o resultado foi um trabalho sem paixão, que afetou sua felicidade e experiência.", effect: Attributes(happiness: -0.1, professionalExperience: -0.05), ), ], ), GameEvent( title: "Venda de Materiais de Arte", description: "Há um evento de vendas de materiais de arte na cidade. É uma chance de comprar materiais de alta qualidade com desconto.", scenario: "Benguela", decisions: [ Decision( text: "Comprar os materiais (-8.000 Kz)", consequenceText: "Você investiu em melhores materiais, o que pode melhorar a qualidade de sua arte.", effect: Attributes(money: -8000.0, professionalExperience: 0.1), ), Decision( text: "Não comprar", consequenceText: "Você economizou, mas perdeu a chance de melhorar suas ferramentas de trabalho.", effect: Attributes(), ), ], ), GameEvent( title: "Problema com Equipamento de Arte", description: "Seu aerógrafo quebrou. Consertar custa dinheiro, mas é essencial para suas obras.", scenario: "Benguela", decisions: [ Decision( text: "Consertar o equipamento (-12.000 Kz)", consequenceText: "Você consertou o equipamento e pode voltar a criar.", effect: Attributes(money: -12000.0), ), Decision( text: "Tentar uma nova técnica sem ele", consequenceText: "Você explorou uma nova forma de arte e se sentiu inspirado. Sua felicidade e experiência aumentaram.", effect: Attributes(happiness: 0.15, professionalExperience: 0.1), ), ], ), GameEvent( title: "Networking com Outros Artistas", description: "Um encontro de artistas locais está a acontecer. É uma oportunidade para trocar ideias e fazer contatos.", scenario: "Benguela", decisions: [ Decision( text: "Ir ao encontro (-3.000 Kz)", consequenceText: "Você fez novos amigos e encontrou inspiração. Sua felicidade e experiência profissional aumentaram.", effect: Attributes(money: -3000.0, happiness: 0.1, professionalExperience: 0.1), ), Decision( text: "Ficar em casa e trabalhar", consequenceText: "Você aproveitou o tempo para focar nas suas obras, mas perdeu a oportunidade de networking.", effect: Attributes(), ), ], ), GameEvent( title: "Desconto em Materiais", description: "Uma loja de materiais de arte está com uma promoção de 'pague 2, leve 3'.", scenario: "Benguela", decisions: [ Decision( text: "Aproveitar a oferta (-5.000 Kz)", consequenceText: "Você investiu em materiais para o futuro, o que lhe dá uma sensação de segurança.", effect: Attributes(money: -5000.0, happiness: 0.05), ), Decision( text: "Não comprar", consequenceText: "Você economizou, mas pode ter que comprar os mesmos materiais por um preço mais alto no futuro.", effect: Attributes(), ), ], ), GameEvent( title: "Concurso de Arte", description: "Um concurso nacional de arte foi anunciado. Ganhar pode te dar fama e dinheiro.", scenario: "Benguela", decisions: [ Decision( text: "Participar do concurso", consequenceText: "Você se dedicou ao concurso e ganhou um prémio. Sua fama e dinheiro aumentaram.", effect: Attributes(money: 10000.0, professionalExperience: 0.2, happiness: 0.1), ), Decision( text: "Não participar", consequenceText: "Você evitou o stress da competição, mas perdeu uma grande oportunidade.", effect: Attributes(), ), ], ), GameEvent( title: "Vandalismo de Obra", description: "Uma das suas obras de arte de rua foi vandalizada. Isso te deixa triste e com raiva.", scenario: "Benguela", decisions: [ Decision( text: "Restaurar a obra (-3.000 Kz)", consequenceText: "A obra está como nova, mas você gastou dinheiro e a sua felicidade diminuiu.", effect: Attributes(money: -3000.0, happiness: -0.1), ), Decision( text: "Deixar como está", consequenceText: "Você decidiu não gastar dinheiro, mas a tristeza e a raiva permanecem.", effect: Attributes(happiness: -0.2), ), ], ), // ======================================================================= // === EVENTOS PARA O CENÁRIO 'HUAMBO' (PROFISSIONAL, JORNALISTA, PROFESSOR) === // ======================================================================= GameEvent( title: "Curso Profissional", description: "Sua empresa oferece um curso de especialização que pode alavancar sua carreira. O custo é alto, mas a empresa cobre metade.", scenario: "Huambo", decisions: [ Decision( text: "Pagar a sua parte e fazer o curso (-15.000 Kz)", consequenceText: "O curso te tornou um profissional mais qualificado e abriu portas para uma promoção.", effect: Attributes(money: -15000.0, professionalExperience: 0.3), ), Decision( text: "Recusar a oferta", consequenceText: "Você evitou a despesa, mas pode perder oportunidades de crescimento na empresa.", effect: Attributes(), ), ], ), GameEvent( title: "Viagem de Negócios", description: "Você é convidado para uma conferência em Luanda. A viagem é importante para networking.", scenario: "Huambo", decisions: [ Decision( text: "Aceitar e viajar (-25.000 Kz)", consequenceText: "A viagem foi um sucesso, você fez contatos valiosos e ganhou reputação na sua área.", effect: Attributes(money: -25000.0, professionalExperience: 0.2, happiness: 0.1), ), Decision( text: "Ficar para economizar", consequenceText: "Você economizou, mas perdeu uma grande oportunidade de networking.", effect: Attributes(), ), ], ), GameEvent( title: "Investimento em Ações", description: "Um colega sugere que você invista em ações de uma empresa promissora na bolsa de valores.", scenario: "Huambo", decisions: [ Decision( text: "Investir 50.000 Kz", consequenceText: "Você investiu e a empresa se valorizou, gerando um bom lucro.", effect: Attributes(money: -50000.0, professionalExperience: 0.1), ), Decision( text: "Não investir", consequenceText: "Você manteve seu dinheiro seguro, mas perdeu uma oportunidade de crescimento financeiro.", effect: Attributes(), ), ], ), GameEvent( title: "Despesa Imprevista", description: "O seu carro precisa de um conserto caro e urgente.", scenario: "Huambo", decisions: [ Decision( text: "Pagar o conserto integralmente (-30.000 Kz)", consequenceText: "O carro foi consertado, mas o seu orçamento ficou muito apertado.", effect: Attributes(money: -30000.0), ), Decision( text: "Pedir um empréstimo rápido no banco", consequenceText: "Você conseguiu o dinheiro, mas terá que pagar juros, o que afeta suas finanças a longo prazo.", effect: Attributes(money: -32000.0, happiness: -0.1), ), ], ), GameEvent( title: "Ajuda a um Colega", description: "Um colega de trabalho pede ajuda com um projeto importante. Ajudar pode te dar um bom reconhecimento, mas também tomará seu tempo.", scenario: "Huambo", decisions: [ Decision( text: "Ajudar o colega", consequenceText: "Você ajudou o colega, e o seu chefe notou o seu espírito de equipa. A sua reputação no trabalho melhorou.", effect: Attributes(happiness: 0.1, professionalExperience: 0.1), ), Decision( text: "Dizer que está muito ocupado", consequenceText: "Você não perdeu tempo, mas a oportunidade de mostrar suas habilidades e trabalho em equipa foi perdida.", effect: Attributes(happiness: -0.05), ), ], ), GameEvent( title: "Plano de Aposentadoria", description: "Você pode começar a investir em um plano de aposentadoria para garantir seu futuro. Isso exige um investimento inicial.", scenario: "Huambo", decisions: [ Decision( text: "Investir agora (-10.000 Kz)", consequenceText: "Você se sente mais seguro com seu futuro financeiro e a felicidade aumenta.", effect: Attributes(money: -10000.0, happiness: 0.1), ), Decision( text: "Deixar para depois", consequenceText: "Você mantém seu dinheiro no presente, mas a sua insegurança aumenta.", effect: Attributes(happiness: -0.05), ), ], ), GameEvent( title: "Problema no Computador do Escritório", description: "O seu computador está com um vírus. Você pode pedir ajuda ao suporte técnico ou tentar resolver sozinho para mostrar iniciativa.", scenario: "Huambo", decisions: [ Decision( text: "Chamar o suporte técnico", consequenceText: "O problema foi resolvido, e você pode voltar ao trabalho sem perder tempo.", effect: Attributes(), ), Decision( text: "Resolver sozinho", consequenceText: "Você passou muito tempo a tentar resolver o problema, mas no final conseguiu. Seu esforço foi reconhecido, mas a sua felicidade diminuiu.", effect: Attributes(happiness: -0.1, professionalExperience: 0.05), ), ], ), GameEvent( title: "Seminário de Liderança", description: "Um seminário de liderança está a acontecer na sua empresa. É uma ótima chance para se desenvolver.", scenario: "Huambo", decisions: [ Decision( text: "Participar do seminário", consequenceText: "Você aprendeu novas habilidades e se tornou um candidato mais forte para posições de liderança.", effect: Attributes(education: 0.1, professionalExperience: 0.1), ), Decision( text: "Não participar", consequenceText: "Você perdeu a oportunidade de aprender, mas teve mais tempo livre.", effect: Attributes(happiness: 0.05), ), ], ), GameEvent( title: "Férias no Interior", description: "Você está com a oportunidade de tirar uns dias de folga para descansar. Você vai aceitar ou continuar a trabalhar?", scenario: "Huambo", decisions: [ Decision( text: "Tirar férias (-5.000 Kz)", consequenceText: "O descanso melhorou a sua saúde e felicidade, mas gastou dinheiro.", effect: Attributes(money: -5000.0, health: 0.2, happiness: 0.2), ), Decision( text: "Continuar a trabalhar", consequenceText: "Você não gastou dinheiro, mas o cansaço acumulado afetou a sua saúde.", effect: Attributes(health: -0.1), ), ], ), GameEvent( title: "Networking Empresarial", description: "Um evento de networking com profissionais de alto nível está a acontecer. A entrada é cara, mas pode ser um bom investimento.", scenario: "Huambo", decisions: [ Decision( text: "Comprar o bilhete (-10.000 Kz)", consequenceText: "Você conheceu pessoas importantes e fez um contato que pode levar a um novo emprego.", effect: Attributes(money: -10000.0, professionalExperience: 0.15), ), Decision( text: "Não ir", consequenceText: "Você economizou, mas perdeu uma oportunidade valiosa de expandir sua rede de contatos.", effect: Attributes(), ), ], ), GameEvent( title: "Reportagem Exclusiva", description: "Você conseguiu uma fonte anónima com informações cruciais sobre um caso de corrupção. A publicação pode ser perigosa.", scenario: "Huambo", decisions: [ Decision( text: "Publicar a reportagem", consequenceText: "A reportagem foi um sucesso, rendendo-lhe um prémio de jornalismo e um aumento, mas sua saúde foi afetada pelo stress.", effect: Attributes(money: 20000.0, professionalExperience: 0.3, health: -0.1), ), Decision( text: "Não publicar", consequenceText: "Você decidiu não arriscar, preservando sua segurança e saúde, mas perdeu uma grande oportunidade de carreira.", effect: Attributes(happiness: 0.05), ), ], ), GameEvent( title: "Entrevista com Político", description: "Um político influente concordou em dar-lhe uma entrevista. É uma grande oportunidade para a sua carreira.", scenario: "Huambo", decisions: [ Decision( text: "Preparar a entrevista com cuidado", consequenceText: "A entrevista foi impecável, aumentando sua reputação e seu profissionalismo.", effect: Attributes(professionalExperience: 0.15, happiness: 0.05), ), Decision( text: "Improvisar", consequenceText: "Você não se preparou o suficiente, e a entrevista foi um desastre. Sua reputação ficou manchada.", effect: Attributes(happiness: -0.1, professionalExperience: -0.1), ), ], ), GameEvent( title: "Problema com os Alunos", description: "Um grupo de alunos está a ter problemas de comportamento. Você precisa lidar com a situação.", scenario: "Huambo", decisions: [ Decision( text: "Confrontar os alunos", consequenceText: "A situação foi resolvida, e a sua experiência profissional aumentou, mas o stress afetou a sua saúde.", effect: Attributes(professionalExperience: 0.1, health: -0.05), ), Decision( text: "Ignorar o problema", consequenceText: "O problema de comportamento continua, e a sua reputação como professor foi afetada.", effect: Attributes(happiness: -0.1), ), ], ), GameEvent( title: "Oportunidade de Ensino", description: "Uma universidade oferece a oportunidade de dar aulas para um curso avançado. O salário é bom, mas o tempo para a diversão diminui.", scenario: "Huambo", decisions: [ Decision( text: "Aceitar a oferta (+15.000 Kz)", consequenceText: "O seu salário e experiência profissional aumentaram, mas o seu tempo livre diminuiu.", effect: Attributes(money: 15000.0, professionalExperience: 0.2, happiness: -0.1), ), Decision( text: "Recusar a oferta", consequenceText: "Você manteve o seu tempo livre, mas perdeu a oportunidade de crescer na sua carreira.", effect: Attributes(happiness: 0.05), ), ], ), GameEvent( title: "Problema com o Empregador", description: "O seu chefe está a ser injusto. Você precisa lidar com a situação.", scenario: "Huambo", decisions: [ Decision( text: "Confrontar o chefe", consequenceText: "A situação foi resolvida, e a sua reputação no trabalho melhorou, mas o stress afetou a sua saúde.", effect: Attributes(professionalExperience: 0.1, health: -0.05), ), Decision( text: "Ignorar o problema", consequenceText: "O problema continua e a sua felicidade e a sua saúde diminuíram.", effect: Attributes(happiness: -0.1, health: -0.1), ), ], ), GameEvent( title: "Problema com o Jornal", description: "O jornal em que você trabalha está a ter problemas financeiros. Você pode ser despedido a qualquer momento.", scenario: "Huambo", decisions: [ Decision( text: "Procurar outro emprego", consequenceText: "Você conseguiu um novo emprego, mas o salário é mais baixo.", effect: Attributes(money: -5000.0, happiness: -0.1), ), Decision( text: "Continuar a trabalhar e esperar o melhor", consequenceText: "Você não perdeu o emprego, mas a sua insegurança aumentou e a sua felicidade diminuiu.", effect: Attributes(happiness: -0.2), ), ], ), GameEvent( title: "Crise na Família", description: "Houve uma discussão séria entre membros da sua família. Você precisa intervir.", scenario: "Huambo", decisions: [ Decision( text: "Tentar mediar a discussão", consequenceText: "A discussão foi resolvida, e a sua felicidade aumentou, mas o stress afetou a sua saúde.", effect: Attributes(happiness: 0.1, health: -0.05), ), Decision( text: "Não intervir", consequenceText: "A discussão continua e a sua felicidade e a da família diminuíram.", effect: Attributes(happiness: -0.1), ), ], ), GameEvent( title: "Problema com a Vizinhança", description: "Os seus vizinhos estão a fazer muito barulho. Você precisa lidar com a situação.", scenario: "Huambo", decisions: [ Decision( text: "Pedir para pararem", consequenceText: "Eles pararam, e a sua felicidade aumentou, mas a relação com os vizinhos foi afetada.", effect: Attributes(happiness: 0.1), ), Decision( text: "Chamar a polícia", consequenceText: "A polícia interveio, mas a sua relação com os vizinhos foi severamente afetada.", effect: Attributes(happiness: -0.05), ), ], ), GameEvent( title: "Problema no Visto de Trabalho", description: "Você está a ter problemas com o seu visto de trabalho. Isso pode afetar o seu emprego.", scenario: "Huambo", decisions: [ Decision( text: "Contratar um advogado (-10.000 Kz)", consequenceText: "O advogado ajudou a resolver o problema, mas a sua felicidade e dinheiro foram afetados.", effect: Attributes(money: -10000.0, happiness: -0.1), ), Decision( text: "Tentar resolver sozinho", consequenceText: "O problema não foi resolvido, e o seu visto de trabalho foi cancelado. Você perdeu o emprego.", effect: Attributes(money: -5000.0, happiness: -0.2, professionalExperience: -0.1), ), ], ), GameEvent( title: "Oportunidade de Ensino", description: "Uma universidade oferece a oportunidade de dar aulas para um curso avançado. O salário é bom, mas o tempo para a diversão diminui.", scenario: "Huambo", decisions: [ Decision( text: "Aceitar a oferta (+15.000 Kz)", consequenceText: "O seu salário e experiência profissional aumentaram, mas o seu tempo livre diminuiu.", effect: Attributes(money: 15000.0, professionalExperience: 0.2, happiness: -0.1), ), Decision( text: "Recusar a oferta", consequenceText: "Você manteve o seu tempo livre, mas perdeu a oportunidade de crescer na sua carreira.", effect: Attributes(happiness: 0.05), ), ], ), ]; /// Gera os eventos iniciais com base no tipo de personagem. List _generateInitialEvents(CharacterType type) { switch (type) { case CharacterType.estudante: return [ GameEvent( title: "Mensalidade da Universidade", description: "A mensalidade do próximo mês está a aproximar-se. O que vai fazer?", scenario: "Luanda", decisions: [ Decision( text: "Pagar a mensalidade integralmente (-25.000 Kz)", consequenceText: "Você pagou a mensalidade. Sua educação está garantida, mas o dinheiro está apertado.", effect: Attributes(money: -25000.0, happiness: -0.1), ), Decision( text: "Trabalhar em part-time para pagar (+10.000 Kz)", consequenceText: "Você conseguiu um part-time para pagar, mas o seu stress e saúde diminuíram.", effect: Attributes(money: 10000.0, happiness: -0.2, health: -0.2, professionalExperience: 0.1), ), ], ), ]; case CharacterType.empreendedor: return [ GameEvent( title: "Crédito para Iniciar o Negócio", description: "Você precisa de um capital inicial para dar vida à sua ideia de negócio.", scenario: "Benguela", decisions: [ Decision( text: "Pegar um crédito no banco (-10.000 Kz de juros)", consequenceText: "Você conseguiu o dinheiro para começar, mas terá que pagar juros a longo prazo.", effect: Attributes(money: 50000.0, happiness: 0.1, professionalExperience: 0.1), ), Decision( text: "Pedir dinheiro à família", consequenceText: "Você conseguiu o dinheiro sem juros, mas a pressão sobre a família aumenta.", effect: Attributes(money: 50000.0, happiness: -0.1), ), ], ), ]; case CharacterType.profissional: return [ GameEvent( title: "Promoção no Trabalho", description: "Você recebeu uma oferta de promoção. Ela aumenta o seu salário, mas também a sua responsabilidade e o stress.", scenario: "Huambo", decisions: [ Decision( text: "Aceitar a promoção (+20.000 Kz)", consequenceText: "A promoção aumentou o seu salário e experiência, mas o stress afetou a sua saúde.", effect: Attributes(money: 20000.0, happiness: -0.1, health: -0.1, professionalExperience: 0.2), ), Decision( text: "Recusar a promoção", consequenceText: "Você recusa para manter a sua paz de espírito. Sua situação financeira não mudou.", effect: Attributes(happiness: 0.1), ), ], ), ]; case CharacterType.artista: return [ GameEvent( title: "Primeira Venda de Arte", description: "Um turista gostou da sua arte de rua e quer comprar uma das suas pinturas.", scenario: "Benguela", decisions: [ Decision( text: "Vender a pintura (+8.000 Kz)", consequenceText: "A venda foi um grande incentivo e você sente que a sua arte tem valor.", effect: Attributes(money: 8000.0, happiness: 0.2), ), Decision( text: "Não vender, é um trabalho pessoal", consequenceText: "Você decide manter a pintura, pois ela tem um valor sentimental. Você não ganha dinheiro, mas a sua felicidade aumenta.", effect: Attributes(happiness: 0.1), ), ], ), ]; case CharacterType.jornalista: return [ GameEvent( title: "Missão em Viana", description: "Seu editor pede para você cobrir uma história sensível em Viana. Isso pode ser um grande passo para a sua carreira, mas também é arriscado.", scenario: "Huambo", decisions: [ Decision( text: "Aceitar a missão", consequenceText: "A reportagem foi um sucesso e você se tornou um nome conhecido na redação.", effect: Attributes(money: 5000.0, professionalExperience: 0.2), ), Decision( text: "Recusar a missão", consequenceText: "Você evita o risco, mas perde uma oportunidade de destaque na sua área.", effect: Attributes(happiness: 0.05), ), ], ), ]; case CharacterType.professor: return [ GameEvent( title: "Preparação para a Aula", description: "Você precisa preparar a sua próxima aula, que é sobre um assunto novo. É um grande desafio, mas a recompensa pode ser grande.", scenario: "Huambo", decisions: [ Decision( text: "Estudar o assunto em profundidade", consequenceText: "Você preparou uma aula incrível, e os seus alunos ficaram muito satisfeitos. A sua reputação aumentou.", effect: Attributes(education: 0.1, professionalExperience: 0.1, happiness: 0.1), ), Decision( text: "Usar um material antigo", consequenceText: "A aula foi monótona, e a sua reputação como professor foi afetada. A sua felicidade diminuiu.", effect: Attributes(happiness: -0.1), ), ], ), ]; case CharacterType.chefeDeFamilia: return [ GameEvent( title: "Despesas do Mês", description: "Chegou o fim do mês e você precisa pagar as contas. O dinheiro está a apertar.", scenario: "Luanda", decisions: [ Decision( text: "Pagar as contas prioritárias (-30.000 Kz)", consequenceText: "As contas foram pagas, mas o seu dinheiro ficou muito apertado. A família está segura.", effect: Attributes(money: -30000.0, happiness: 0.1), ), Decision( text: "Pedir um adiantamento no trabalho", consequenceText: "Você conseguiu um adiantamento, mas o seu salário do próximo mês será menor.", effect: Attributes(money: 10000.0, happiness: -0.1, professionalExperience: -0.05), ), ], ), ]; default: return []; } } /// Inicia um novo jogo com um personagem específico. void startNewGame(CharacterType type) { _playerCharacter = Character.predefined(type); _currentDay = 1; _isGameOver = false; // AQUI É A LÓGICA CORRIGIDA if (_playerCharacter != null) { // Filtra todos os eventos para o cenário do personagem _unseenEvents = _allPossibleEvents .where((event) => event.scenario == _playerCharacter!.scenario) .toList(); // Pega o evento inicial para este tipo de personagem final initialEvents = _generateInitialEvents(type); _availableEvents = initialEvents; // Garante que o evento inicial não seja sorteado novamente for (var initialEvent in initialEvents) { _unseenEvents.removeWhere((event) => event.title == initialEvent.title); } } else { _unseenEvents = []; _availableEvents = []; } notifyListeners(); } /// Processa a decisão do jogador sobre um evento. void processDecision(GameEvent event, Decision decision) { if (_playerCharacter == null || _isGameOver) return; // Aplica os efeitos da decisão _playerCharacter!.attributes.add(decision.effect); _playerCharacter!.attributes.happiness = _playerCharacter!.attributes.happiness.clamp(0.0, 1.0); _playerCharacter!.attributes.health = _playerCharacter!.attributes.health.clamp(0.0, 1.0); _availableEvents.remove(event); _checkGameOver(); notifyListeners(); } /// Avança o jogo para o próximo dia. void nextDay() { if (_isGameOver) return; _currentDay++; generateNewEvent(); _checkGameOver(); notifyListeners(); } /// Gera um novo evento aleatório a partir dos eventos não vistos. void generateNewEvent() { if (_playerCharacter == null || _unseenEvents.isEmpty) return; final random = Random(); final newEventIndex = random.nextInt(_unseenEvents.length); final newEvent = _unseenEvents[newEventIndex]; _unseenEvents.removeAt(newEventIndex); _availableEvents.add(newEvent); notifyListeners(); } /// Verifica se as condições de fim de jogo foram atingidas. void _checkGameOver() { if (_playerCharacter == null) return; if (_playerCharacter!.attributes.money <= 0.0 || _playerCharacter!.attributes.health <= 0.0 || _playerCharacter!.attributes.happiness <= 0.0) { _isGameOver = true; } } /// Reinicia o jogo para o estado inicial. void restartGame() { _playerCharacter = null; _availableEvents = []; _unseenEvents = []; _currentDay = 1; _isGameOver = false; notifyListeners(); } }