MilWebWhatsApp
Voltar aos projetos

Jogo mobile de simulação · React Native/Expo

Império do Café

App mobile · 100% offlineProjeto autoral
Screenshot do projeto Império do Café

Problema

Mostrar domínio de mobile e de lógica complexa exige mais que um CRUD. Pede um produto com profundidade real.

Solução

Jogo mobile completo de gestão de fazenda de café (Zona da Mata), 100% offline com saves locais: variedades, pragas e doenças, ciclo agronômico e mercado, em dezenas de sistemas interligados.

Como foi construído

O nome do repositório (rpg-mobile) é resquício do rascunho inicial. O produto final não é um RPG, é um simulador de gestão agrícola no estilo "Brasfoot do café": navegação por menus e telas, sem cena 3D nem sprite. Construído em React Native 0.81 com Expo SDK 54 e Expo Go pra testar direto no celular via QR code (--lan), roda 100% offline: nenhuma chamada de rede, save local em AsyncStorage. O jogo simula um cafeicultor da Zona da Mata mineira, do primeiro talhão até o império de fazendas certificadas, respeitando a fidelidade temporal real da cultura. Uma lavoura nova leva cerca de 3 anos pra formar e produzir.

A arquitetura segue uma regra central documentada no próprio README: nenhum componente tem lógica de simulação, e nenhum módulo de logic/ importa React. O src/data/ guarda catálogos puros (variedades, pragas, mercado, glossário), o src/logic/ concentra ~20 módulos de funções puras e testáveis sem runtime de UI (ciclo agronômico, colheita, pós-colheita, mercado, financiamento), e só o src/hooks/useJogo.jsx faz a ponte com React via useReducer e Context, sem Redux nem Zustand. O reducer central processa dezenas de ações e orquestra sistemas interligados: 11 variedades de café com traços próprios, 6 pragas com sazonalidade, classificação multi-dimensional do lote (Tipo BRASIL × Peneira × SCA), bolsa com índice oscilante e eventos macro, certificações cumulativas e financiamento subsidiado (Funcafé).

Dois detalhes de engenharia resolvem problemas reais de um jogo offline. Primeiro, a aleatoriedade (clima diário, spawn de pragas, eventos extremos) usa um gerador seedável próprio (mulberry32, em src/logic/rng.js) em vez de Math.random(): o save guarda só o inteiro do estado do RNG, não o histórico de eventos, e ao recarregar o jogo reproduz exatamente o mesmo "destino" a partir dali. Segundo, o avanço do tempo é híbrido. O passo padrão é de 7 dias, mas cai automaticamente pra 1 dia nas fases sensíveis como a secagem do café, onde a umidade precisa ser acompanhada dia a dia (de 60% a 12%) e o "pulo de semana" quebraria a simulação.

Persistência evoluiu de um save único pra multi-slot (3 slots, cada um com sua chave AsyncStorage), com migração automática e silenciosa do formato antigo pro slot 0 e um campo de versão (versao: 1) no JSON serializado. Save de versão incompatível é descartado com log de aviso em vez de travar o app. O projeto é deliberadamente JS puro, sem TypeScript, sem lib de gráfico e sem UI kit externo, usando só Pressable, View, Text e StyleSheet do React Native, pra manter a barreira de entrada baixa. É uma escolha explícita, documentada no próprio README para facilitar contribuições futuras.

Lógica pura, zero React

~20 módulos de simulação em logic/ não importam React, então são testáveis isoladamente, sem UI.

RNG seedável (mulberry32)

Clima, pragas e eventos usam um gerador próprio: o save guarda só o estado do RNG e reproduz o mesmo destino ao recarregar.

Tempo híbrido semana/dia

Passo padrão de 1 semana cai pra 1 dia automaticamente durante a secagem do café, onde a umidade é crítica.

Save multi-slot versionado

3 slots no AsyncStorage com migração automática do formato antigo e descarte seguro de saves incompatíveis.

Stack

  • React Native
  • Expo
  • React 19
  • JavaScript
  • AsyncStorage

Pronto para transformar sua ideia em um produto digital?

Me conta o que você precisa. Respondo rápido e te passo um orçamento gratuito, sem compromisso.

  • Contrato de garantia
  • Suporte pós-entrega
  • O código é seu
  • Orçamento gratuito