domingo, 12 de abril de 2015

Halag (Prólogo)


Tempos ancestrais:
O jogo se passa em um mundo chamado Domon. Domon tem cinco continentes Qunchu, Udara, Delhkii, Ignis e Halag. De acordo com a crença comum, Domon teve tempos áureos em eras ancestrais quando havia uma única civilização que reinava sobre os cinco continentes, com paz, justiça, prosperidade e civilidade. A força dessa nação vinha da magia e ciência dadas a ela pelos deuses. Infelizmente esse mesmo poder, responsável pelo paradisíaco estilo de vida dos dômones ancestrais foi o que causou sua queda. Admirados com as suas capacidades, os dômones desafiaram os deuses e foram punidos: perderam o conhecimento que tinham, sofreram com pragas, cataclistas e bestas, foram dizimados e os poucos que sobreviveram tiveram que viver por séculos de trevas.

Tempos de trevas:
Não se sabe se realmente houve uma nação que governou Domon por completo, mas evidências mostram que de fato, no passado, houve uma civilização grande o suficiente para deixar rastros em quatro dos cinco continentes (Halag é uma zona perdida, ninguém sabe como é lá e todos que se aventuraram jamais retornaram). Os historiadores acreditam que provavelmente não havia paz completa, a prosperidade não devia ser igual para todos, nem igual a todo o tempo, mas de fato houve um império grande e poderoso que colapsou misteriosamente e após ele, Domon viveu por séculos mergulhado no caos. Os humanos, que hora dominaram o planeta com o império Domon viram-se tiranizados por diversos reinos de outras criaturas "racionais". A comida era escassa a fome e a exploração constante e a violência uma realidade diária.

Um despertar conturbado:
Os humanos só começaram a voltar ao domínio do planeta em tempos recentes. Houveram diversos conflitos de reunificação e algumas famílias nobres conseguiram criar grandes e prósperas nações humanas. Todavia todas elas almejavam recriar a glória do "império Domon", ou  a glória que acreditavam que tinha existido e com isso as grandes nações modernas acabaram entrando em uma grande guerra. A maior nação de Delhkii foi uma das primeiras a sucumbir: os gastos com a guerra foram tão grandes que o próprio povo virou inimigo do império e tratou de derrubar a aristocracia local. Nos saques às propriedades da nobreza, os rebeldes descobriram artefatos, pergaminhos e livros da época do império Domon. De início a maioria desses itens era destruído ou perdido, mas a liderança de um dos grupos rebeldes conseguiu ver potencial nesses elementos  e começou a reuni-los e estuda-los. Logo após a família regente "sumir", esse grupo rebelde, denominado Ulan Batar,  munidos de soldados com habilidades sobre-humanas, os Tam Nait, dominaram os outros grupos rebeldes e conseguiram repelir as nações estrangeiras invasoras e convence-las a assinar uma trégua.

Enquanto isso o imperio Udara (que de fato governava todo o continente) foi quase completamente conquistado pelas confederação de Ignis e em seguida "libertado" pela coalizão de Qunchu, que acabou por transformar Udara em "uma caixa de fantoches", estados fantoches". Qunchu por fim conseguiu vencer as nações de Ignis impondo duras sanções.

Os cavaleiros da morte:
O fim da guerra não trouxe nada perto da "unificação" desejada. a coalizão de Quinchu tinha problemas internos para resolver e limitou seu controle sobre Udara, que era um continente rico em recursos naturais. As nações de Ignis estavam falidas, algumas ofereceram vassalagem e submissão à Qunchu, outras à nova nação Ulan e algumas poucas formaram confederações pequenas.

Apesar de ter se retirado da guerra, Ulan também não estava tendo momentos fáceis. Os mesmos Tam Naits que garantiam a soberania da nação cobravam um terrível preço, este ferozmente escondido pelas autoridades de Ulan. Para suprir essa demanda, Ulan iniciou guerras que culminaram por unificar  quase completamente Delhkii, tendo dificuldades apenas em enfrentar o reino insular de Nar. Para efetuar essas conquistas Ulan criou mais Tam Naits e isso deixou ainda mais caro o "terrível preço" a ser pago.

Incapaz de conquistar Nar, Ulan começa a pressionar nações menores em Ignis. Frente a essa ameaça um grupo de místicos da nobreza do império Thal (a principal nação de Ignis), enviam expedições por toda Domus em buscas de material do antigo império Domon, essas expedições conseguiram grandes feitos, descobriram ruínas, inscrições, fizeram diversos levantamentos históricos e geográficos e conseguiram, juntamente com a marinha de Nar, bater o recorde de expedição que chegou mais perto de Halag e conseguiu retornar. Em posse de conhecimento ancestral Tahl e Nar conseguiram criar os Tenebrus Milis, supersoldados capazes de fazer frente aos Tam Naits.

Thal começou uma campanha de unificação em Ignis e rapidamente conseguiu erguer um império continental, Nar conseguiu tomar alguns reinos pequenos em Delhkii e Ulan logo se viu em face a dois inimigos poderosos. Ulan tinha vantagem de número, por décadas criando Tam Naits ela conseguia ter mais desse tipo de guerreiro que Thal e Nar juntas tinham de Tenebrus Milis, no entanto o conhecimento aplicado na criação dos Tenebrus e a força dos artefatos nas mãos de seus senhores faziam com que estes últimos fossem mais poderosos.

A guerra durou vários anos, Ulan quase foi conquistada. A criação e manutenção de Tenebrus Milis também cobrava um pesado preço e logo Thal e Nar acabaram por invadir Udara, forçando a coalizão de Qunchu a intervir na guerra. Qunchu não tinha nenhum tipo de supersoldado enfrentar os Tenebrus, mas conseguiram expulsar os invasores de Udara (usando a população desse continente como bucha de canhão). Em seguida passaram a ajudar os Ulan, inicialmente com recursos, atacando diretamente Nar e depois Thal. Nar sucumbiu relativamente rápido, Thal conseguiu resistir por mais tempo, pois concentrou todos os Tenebrus restantes em uma região montanhosa de onde, em um complexo de fortalezas seus líderes governavam.

Parecia impossível tomar essas montanhas sem grandes perdas e Ulan estava parecendo querer poupar seus Tam Naits.Em uma conferência realizada perto do final da guerra, Ulan propôs a criação de uma zona de cerco em volta das montanhas e deixar que seus "habitantes" morressem de fome. Qunchu no entanto disse que tinha a "resposta" para aquele problema e poucas semanas depois dessa conferência realizou um ataque violento contra as fortalezas das montanhas exibindo seu próprio supersoldado, os Saxmana Inca.

Não se sabe o que aconteceu com os líderes Thal, o império Qhispikay, a principal nação Qunchu, divulgou que os líderes haviam fugido, Ulan, que haviam se matado, boatos no entanto afirmam que eles se transforam em uma única criatura terrível que foi morta pelos cavaleiros Saxmana.

Batalha de gigantes:
Ulan que ainda contava com uma quantidade estupenda de Tam Naits ficou estarrecida com o surgimento dos Saxmana, que eram ainda mais poderosos que os Tenebrus. Ninguém soube de onde eles tiraram tal conhecimento, especula-se que o imperador de Qhispikay tenha enviado uma expedição secreta à Halag e essa expedição conseguiu retornar, mas essa hipótese é oficialmente vista como ridícula.

Com o fim da guerra, Ulan resolveu usar os artefatos que pilhou de Thal para fundir os Tenebrus com os Tam Naits e criar assim ter soldados que pudessem fazer frente aos Saxmana. Qunchu, mais precisamente  Qhispikay resolveu adotar outra tática: ciente do sacrifício exigido para ter esse tipo de guerreiro, o imperador mandou selar os poucos Saxmana existentes em uma montanha no coração de Qunchu. Em seguida ele passou a mandar emissários, estes compartilhavam um pouco do conhecimento ancestral com as nações fronteiriças à Ulan. Com isso essas nações podiam criar versões mais fracas dos Saxmana. Ulan, ao fim da guerra voltou a se expandir, mas a passos custosos, exigindo a criação de cada vez mais Tam Naits.aumentando "o preço" e acabando por colapsar a nação que quase unificou Delhkii.

E a aventura começa:
Ulan ainda existe, é uma nação grande e relativamente influente, mas não tem tanto poder e tamanho quanto tinha antes. Vários reinos e principados menores surgiram depois de sua queda, alguns permanecem sobre forte influência do antigo império, enquanto outros são basicamente agora membros da coalizão de Qunchu.

Após o fim da terceira guerra todos os Tam Naits, Tenebrus e Saxmana foram exterminados pelas forças de Qhispikay, ou pelo menos acredita-se que todos.

O continente de Qunchu exceto por algumas ilhas perto de Halag, é de longe o melhor lugar para se morar, seus reinos prosperam, há liberdade para os súditos, não há guerras internas e não há nada que ameace essa paz. Ignis agora também tem uma situação boa também, exceto por também algumas ilhas, perto de Delhkii, os reinos continentais são prósperos e a paz é constante. Já Udara contempla faz tempo o completo caos. Guerras internas intermináveis reduziram o continente a um matadouro de dimensões colossais. As únicas regiões seguras são entrepostos guardados por soldados da coalizão Qunchu, mas atualmente mesmo essses não estão dando conta de enfrentar as forças caóticas que surgem nessa terra perdida.

Enquanto isso Delhkii está se recuperando, há crises e escândalos, de vez em quando algumas rebeliões e guerras entre pequenos reinos, mas de modo geral está se recuperando. Ou melhor, estava. Um dos senadores de Ulan deu um golpe de estado e se proclamou novo imperador. Ele começou a promover pequenas invasões em nações vizinhas para recuperar a zona de influência do antigo império Ulan. Boatos dizem que ele na verdade é um Tam Nait...

VOCÊ é um nobre de um pequeno principado em Udara, você teve que fugir quando viu seu lar ser invadido pelo exército Dosa, uma força misteriosa e implacável que surgiu em seu continente e que está deixando um rastro de destruição nunca visto antes.

Você recebeu asilo de um nobre de Thal, mas não consegue parar de pensar no que pode ter acontecido com seu povo e quantos mais precisarão sofrer até que alguém tome alguma atitude para acabar com as desgraças de Udara...





segunda-feira, 16 de março de 2015

Halag


Halag é um projeto que eu estou começando agora, um jogo para PC, feito em Python, gratuito e de código aberto.

Conceito do jogo:

Halag será um RPG, de modo geral não se diferenciará muito da norma dos RPGs eletrônicos, tendo pontos de experiência por batalhas vencidas, aumento de nível de personagem, evolução de pontos de atributos, compra de armas e equipamentos melhores e etc. Haverão certos detalhes adicionais, as batalhas serão em tempo real e os personagens terão certa autonomia de combate. Haverá alguns elementos de "point and click" e naturalmente, puzzles. A atmosfera do jogo será bem leve e divertida, a proposta é que não haja nada que prenda o jogador por muito tempo em algum estágio do jogo, ao mesmo tempo o jogo deverá proporcionar a sensação de desafio para o jogador.

O elemento chave do jogo será a autonomia que os personagens terão. O jogador não será o herói principal do grupo, como na maioria dos jogos no gênero, ele controlará um elemento externo. Ele será capaz de ordenar para onde o grupo deve se mover, escolher as estratégias de batalha do grupo e até comandar algum personagem em batalha se desejar, mas no geral, sua interação será externa, ou seja ele não precisará de um personagem para interagir com o ambiente.

Ambiente do jogo:

O universo do jogo se encontrará incluído no gênero fantasia medieval, com talvez alguns elementos steampunk. A atmosfera do jogo, como foi já foi dita, será leve e descontraída. Haverá um grande vilão, mas a diferença é que não haverá confronto direto entre os personagens e o antagonista. Na verdade o grupo não almejará impedir, ou destruir o vilão principal e este sequer saberá da existência dos heróis. Não haverá confronto direto de objetivos. Os heróis, nesse jogo são pequenos em poder perante o antagonista. Isso no entanto não excluirá a presença de combates do jogo, eles ocorrerão e com frequência.


...

Acho que já estou começando a perder a coesão e coerência, passei o dia na base do café. Nas próximas semanas postarei aqui a história de fundo do jogo, a descrição dos personagens e a medida que o jogo for sendo desenvolvido, estarei postando nesse blog os códigos e os demais recursos do jogo.

As novidades também serão apresentadas na página do jogo no facebook:

https://www.facebook.com/halagrpg?ref=hl

domingo, 15 de março de 2015

Halag


Ainda nessa semana eu vou fazer uma publicação inicial sobre meu projeto, Halag.

Chipsets para RM2K (RPG Maker 2000)

Pessoal, o blog está meio parado e etc, mas vejam pelo lado bom, dessa vez eu não fiquei um ano inteiro sem postar! XD. Eu gosto muito do RPG maker, apesar de nunca ter concluído nenhum jogo (nunca peguei um para fazer a sério) e vira e meche eu recolorizo alguns sprites, dou uma alterada aqui, outra ali... Eu editei uma quantidade razoável de chipsets e eu resolvi compartilhar aqui com vocês. Não são lá grande coisa, eu não sou nenhum pixelartist e a maior parte das alterações são mesmo recolorizações, mas podem servir para alguma coisa, espero que gostem.










Basicamente:
-Fortaleza minotaura (ou uma porcaria de uma fortaleza de muros pretos no deserto) (incompleto)
-Um "mapa mundi"
-Um chipset para ambientes externos
-Um chipset de castelo diferente
-Um chipset para ambientes interiores
-Outro "mapa mundi" (incompleto)
-Um chipset de dungeon
-Um chipset de interior de casa
-Um chipset "inside body" para rm2k, ou uma um ninho alienígena/inseto-monstro-gigante (incompleto, falta editar as escadas)

sexta-feira, 20 de junho de 2014

Respostas dos exercícios de 10/12

Quase um ano de atraso, mas eu ainda não desisti e vou dar continuação à esse curso:

Exercício 1-1:
E1
Poderia ter também quebrado as instruções em "Calcula b²", "Calcula c²", "calcula soma dos anteriores", "a= raiz do anterior". Frequentemente isso é usado para poupar o programador de ter que escrever expressões longas demais.

Exercício 1-2:
E2
 Se notarem, não estou declarando as variáveis no fluxograma. Consideremos isso opcional. O fluxograma não é o programa em si, mas sim um diagrama para dar uma ideia de como ele vai funcionar.

Exercício 1-3:
E3
Para simplificar, coloquei todas as leituras e impressões em um único bloquinho.

Exercício 1-4:
E4
Um bom exemplo de um ciclo com verificação no final.

Exercício 1-5:
E5
Temos aqui dois bons exemplos de como os ciclos devem se parecer., um de verificação inicial e outro de verificação final.

Exercício 1-6:

E6
É possível variar, mas a ideia geral é essa.

Exercício 1-7:
E7
A ideia aqui é perceber que os fluxogramas são mais livres e menos detalhados.

Exercício 2-a:
E8
Poderia ser um "imprime maior" também. Retorna é uma forma de dizer que a função vai mandar de volta aquele valor, mas não vai ser necessariamente uma "saída visualizável".

Exercício 2-b:
E9
Eu simplifiquei ali colocando um compara menor, uma subrotina que se pareceria com o programa anterior. Esse conceito, bem como o conceito de lista, vetores e matrizes (uma variável associada à uma posição) nós abordaremos posteriormente, quando começaremos a programar de fato.

Exercício 2-c:
E10
Exercício 2-d:

E11
Desculpem a demora. Estou trabalhando no curso de condicionais com o calc/excel. Em breve postarei ele aqui.

domingo, 16 de junho de 2013

Resposta do problema da caixa


Programa 7 - Volume da caixa em C
  1. #include <stdio.h>

  2. // Programa que procura o volume máximo de uma caixa, restrito à uma dada área superficial..

  3. int main(){
  4.            int c=0,a=0;
  5. //"c" é o limite de iterações do While da linha 28; a é o auxiliar para diminuir o tempo de busca.

  6.            float area=0,x=0,y=0,z=0,v=0,vs=0,xs=0,ys=0,zs=0;
  7. // "area" é o valor que irá ser digitado. As variáveis x,y,z,v irão ser usadas na busca da solução. As variáveis xs,ys,zs,vs  irão armazenar o valor das melhores soluções.
  8.            
  9.            srand(time(NULL)); // Faz o rand() gerar valores distintos a cada execução.
  10.            
  11.            printf("Digite o valor da area superficial da caixa.\n");
  12.            scanf ("%f",&area);
  13.            
  14.            //area = 255,45; // Para testar a capacidade de achar uma solução ótima, define-se um valor arbitrário e executa o programa n vezes
  15.            
  16.            if(area<=1){a=1;}
  17.            if(area<=10){a=10;}
  18.            if(area<=100){a=100;}
  19.            if(area<=1000){a=1000;} // Otimizando o gasto computacional
  20.            if(area<=10000){a=10000;}
  21.            if(area<=100000){a=100000;}

  22.            while(c<1000){ // Quanto maior o limite de c, maior o gasto computacional, porém melhor é o resultado.
  23.                           x=rand()%a;
  24.                           y=rand()%a;
  25.               
  26.                           while(x>area){x=rand()%a;} // "a" reduz o tempo de busca pois limita a busca a valores próximos do esperado..
  27.                           while (2*x*y>area){y=rand()%a;}
  28.                           z=( (area/2)-(x*y) )/(x+y);  // Lembrar que Área superficial = 2(xy+xz+yz)
  29.               
  30.                           v=x*y*z; // Cálculo do volume..
  31.                           if(v>vs){vs=v;xs=x;ys=y;zs=z;} // Se a solução é melhor, substitui valores..
  32.                           c++;
  33.                          }// Fim While
  34.               
  35.            printf ("\n\nVolume maximo: %f \n\nAs medidas sao x=%.2f\ty=%.2f\tz=%.2f\n\n",vs,xs,ys,zs);
  36. //Nessa linha, o código %.2f ordena imprimir até as 2 primeiras casa decimais do resultado.
  37.            
  38.            system("pause");
  39.            }// Fim Main

       Nesse programa é interessante observar a tática usada para diminuir o tempo de busca do computador. Nas linhas 19 até 24, "a" é determinado de acordo com cada área superficial dada. Ou seja, quando nas linhas 27 e 28 efetua-se  x=rand()%a e  y=rand()%a obtemos valores menores que a área superficial, e ainda, provavelmente mais próximos da solução ideal. Lembrar que esse programa é aleatório. Se você executá-lo várias vezes, poderá obter resultados diferentes, entretanto satisfatórios em sua maioria. Esse é o princípio da busca aleatória, que é feita em programas de otimização.

       Novamente vemos as linhas rand () e srand(time(NULL)). Ambas são funções e fazem parte da biblioteca padrão de C. A linha rand() gera um número randômico qualquer. A linha srand(time(NULL)) faz com que esse número seja diferente a cada execução do programa, pois estabelece uma relação com o relógio do computador.

       Bem, por hoje é só. No próximo post, alguns exercícios de C, do estilo dos que eu fiz quando fazia a disciplina de algoritmos no IFET, e que podem cair em provas. Para quem está fazendo a disciplina, é uma boa.

Boa semana à todos!

quarta-feira, 12 de junho de 2013

Estruturas de repetição (2)

       Boa noite! Hoje o post é a continuação das estruturas de repetição. Vou falar do "For infinito", do While e aproveitando o gancho, sobre o conceito de programação estocástica (aleatória). Esse tipo de programação consiste na aproximação do resultado ideal, por uma busca aleatória. No final um desafio, que devo postar a resposta em breve...Vou considerar o For infinito uma extrapolação do uso convencional do for convencional. Lembrando, o for convencional tem a seguinte forma : For(inicialização;limite;incremento){Comandos;} . O For infinito pode se dar de algumas formas: 

                       
For( ; ; ){Comandos;}

                       For(inicialização ; ;){Comandos;} 
                       
For(; ; incremento){Comandos;}

                       For(inicialização ; ; incremento){Comandos;}

       Note: no primeiro caso, nada se estabelece para o For, ou seja, ele irá executar o comando indefinidamente, até que alguma condição seja atendida e o loop seja encerrado, ou até o programa "dar pau". Digo isso, pois não conheço a fundo as implicações desse uso do For, podem haver erros inesperados em sua execução. Já o segundo tipo, possui um início e um padrão de crescimento/decrescimento, porém não possui um limite.

       Para sair de um For infinito, como eu já mencionei, é preciso impor uma condição de saída, com um comando que encerre o loop. Veja a seguir:

Trecho 1
  1. int i;
  2. for(;;){

  3.           i++;
  4.           if(i>50)break; // Condição e comando de saída 
  5.           printf("%d",i);
  6.           
  7.          }
Trecho 2
  1. int i;
  2. for(i;;){

  3.           i++;
  4.           if(i>50)break; // Condição e comando de saída 
  5.           printf("%d",i);
  6.           
  7.          }
Trecho 3
  1. int i;
  2. for(;;i++){

  3.           if(i>50)break; // Condição e comando de saída 
  4.           printf("%d",i);
  5.           
  6.          }
Trecho 4
  1. int i;
  2. for(i;;i++){

  3.           if(i>50)break; // Condição e comando de saída 
  4.           printf("%d",i);
  5.           
  6.          }
      Como você imagina as saídas desses programas? São iguais? A resposta é não. Os trechos 1 e 2 irão fazer uma contagem de 1 a 50, enquanto que os trechos 3 e 4 de 0 a 50.
      
      Quanto ao While: seu uso, como eu disse no post Estruturas de repetição (1), é para algo que você sabe onde irá acabar, ou ao menos para que se atinja um valor esperado. Imagine o seguinte: você tem um problema muito grande de Programação Linear (otimização), que te dá milhões de possibilidades de soluções. Logo, para percorrer todo o cenário de respostas possíveis, o tempo de operação do computador é muito grande, acredite.

      O que você faz? Faz o que chamamos de busca aleatória. Você escolhe pontos por onde procurar a solução, e, por exemplo, com o uso do While, estabelece um pré valor esperado para sua solução, por exemplo Lucro = 5000 Reais. Feito isso, a primeira solução que o programa encontrar que te dê R$ 5000 ou mais de lucro, ele apresenta à você. A ideia é simples assim. Entretanto sua aplicação nem tanto. Conheço vários professores  e alunos daqui da UFJF, que estudam esse estilo de programação, tanto em C,C++,Matlab,etc... é um assunto interessante que irei retomar em um próximo post.

      Basicamente o While se dá assim: While(Condição){Comandos;}. Veja:

Programa 6 - Busca aleatória do lucro em C.
  1. #include <stdio.h>

  2. int main () {

  3. int lucro=0,x=0,y=0,contador=0;
  4. srand(time(NULL)); // Essa linha é responsável pelo rand() abaixo, gerar números diferentes a cada execução.
  5. while(lucro<5000){
  6.                            contador++; // Número de iterações.
  7.                            x=rand(); // x = Número aleatório.
  8.                            x=x%1000; // x = Resto da divisão de x por 1000.
  9.                            y=rand(); // y = Número aleatório.
  10.                            y=y%1000; // y = Resto da divisão de y por 1000.
  11.                            lucro = 2*x + 4*y; // Função Objetivo
  12.                           }
  13. printf("\n\nx=%d\n\ny=%d\n\nLucro=%d\n\nIteracoes=%d\n\n",x,y,lucro,contador);

  14.          
  15. system("pause");
  16. return(0); }
Observações: 

      Nesse post, inseri alguns comandos ( rand e srand ) que você podia não conhecer. São comandos da biblioteca padrão de C. Não se preocupe muito com a forma com que eles funcionam por enquanto, só saiba que eles funcionam e são de grande valia na programação. Num próximo post, irei abordar detalhes destes.

      Também apresentei uma parte do conceito de programação estocástica. Esse é um tema vasto, com inúmeras aplicações reais em problemas da matemática, engenharia, estatística e de empresas. Vários softwares já foram desenvolvidos com base nesse conceito e ainda rola muita pesquisa em universidades à respeito disso. É outro assunto que voltarei a falar numa próxima oportunidade. É uma boa pra se informar.


Proposta: Mexa no Programa 6. Rode várias vezes e observe as variações de solução. Mude as condições, e a equação objetivo do problema. Dificulte o trabalho do programa para achar a solução. Tente algo para que o número de iterações aumente bastante. Tente algo para que o número de iterações caia bastante também. Isso pode ser feito mexendo nas linhas 10 e 12, mudando o divisor da divisão, aumentando o lucro,etc...

Desafio: Esse eu considero realmente um desafio. Não se preocupe se não conseguir. 


Programa 7 - Volume da caixa em C.

Dada uma determinada caixa, de dimensões X, Y e Z;
sua área superficial é descrita por 2(XY+XZ+YZ).
Proposta: Com base em um valor qualquer de área superficial,encontrar o 
máximo volume que pode ser obtido e quais as dimensões da caixa de maior volume.
Ou seja, maximizar a capacidade da caixa, com menos material gasto...

Obs: Faça para áreas superficiais de até 100.000 unidades.

Boa semana à todos!