Criação de Histórias de Role-Playing Games
Transcrição
Criação de Histórias de Role-Playing Games
Criação de Histórias de Role-Playing Games através de Interações entre Agentes Inteligentes por Thomas Caleffi Scaletscky UNIVERSIDADE DO VALE DO RIO DOS SINOS THOMAS CALEFFI SCALETSCKY Criação de Histórias de Role-Playing Games através de Interações entre Agentes Inteligentes Monografia apresentada como requisito parcial para a obtenção do grau de Tecnólogo em Jogos Digitais Prof. Msc. João Ricardo Bittencourt Orientador São Leopoldo, janeiro de 2009 “Ao meu avô Euclides.” AGRADECIMENTOS À minha família stricto sensu - Mãe, Pai e Irmã - às minhas duas avós, que me ajudaram em todos os momentos, à minha Tia Tânia e à meu Tio Beto, que sempre me deram força com este trabalho, ao meu falecido avô Abram e aos outros integrantes da minha família lato sensu. Aos meus amigos do RPGneto, ao meu orientador João, aos meus colegas JEDis, ao pessoal da ADPLabs e aos meus amigos mais antigos. “Work it harder, make it better, do it faster, makes us stronger.” — Daft Punk SUMÁRIO LISTA DE ABREVIATURAS E SIGLAS . . . . . . . . . . . . . . . . . . . 7 LISTA DE FIGURAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 RESUMO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 ABSTRACT 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2 ROLE-PLAYING GAMES E NARRATIVAS 2.1 Role-Playing Game . . . . . . . . . . . . . . 2.1.1 Sistema de Aventuras Instantâneas . . . . 2.2 Computer Role-Playing Game . . . . . . . . 2.2.1 Multi-User Dungeon . . . . . . . . . . . . 2.3 Narrativas e Personagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ANÁLISE CRíTICA DE JOGOS DE ROLE-PLAYING 3.1 Neverwinter Nights II . . . . . . . . . . . . . . . . . . . 3.2 The Elder Scroll IV: Oblivion . . . . . . . . . . . . . . . 3.3 Diablo II . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Final Fantasy Tactics A2: Grimoire of the Rift . . . . . . . . . . . 14 15 16 17 18 18 GAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 23 24 24 4 INTELIGÊNCIA ARTIFICIAL . 4.1 Agentes Inteligentes . . . . . . 4.1.1 Modelo Belief-Desire-Intention 4.2 Lógica Difusa . . . . . . . . . . 4.2.1 Fuzzy Logic Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 27 28 29 32 5 PROJETO C.H.R.I.A. . . . 5.1 Arquitetura do Projeto . . . 5.2 Caso de uso - Re:CHRIA . . 5.2.1 Game . . . . . . . . . . . 5.2.2 World . . . . . . . . . . . 5.2.3 Player . . . . . . . . . . . 5.2.4 BDI . . . . . . . . . . . . 5.2.5 GameMaster . . . . . . . 5.2.6 Agent . . . . . . . . . . . 5.2.7 Enemy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 35 37 37 38 39 39 41 43 44 . . . . . . . . . . . . . . . . . . . . 5.2.8 Room . . . . . . . . . . . . . 5.2.9 Item . . . . . . . . . . . . . 5.2.10 Quest . . . . . . . . . . . . . 5.3 Funcionamento do Re:CHRIA . 5.3.1 Detalhes de funcionamento . 5.3.2 Detalhes do funcionamento da 5.3.3 Fator computacional . . . . . 6 . . . . . . . . . . . . . . . BDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 44 45 45 45 48 50 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 APÊNDICE A - BDI DE UM AGENTE . . . . . . . . . . . . . . . . . . . 57 LISTA DE ABREVIATURAS E SIGLAS RPG Role-Playing Game CRPG Computer Role-Playing Game SAI Sistema de Aventuras Instantâneas MUD Multi-User Dundgeon GM Game Master NPC Non-Playable Character IA Inteligência Artificial BDI Beliefs, Desires and Intentions FUZZYF Fuzzy Logic Framework C.H.R.I.A. Criação de Histórias de RPG através da Interação de Agentes Re:CHRIA Recriação de Histórias de RPG através da Interação de Agentes LISTA DE FIGURAS Figura 2.1: Diagrama básico de um roteiro por Field. . . . . . . . . . . . . . . . 20 Figura 4.1: Relação Agente-Ambiente de acordo com Wooldridge. . . . . . . . Figura 4.2: Comparação entre a lógica Booleana, a lógica Multi-valor e a lógica Fuzzy por Bittencourt. . . . . . . . . . . . . . . . . . . . . . . . . Figura 4.3: Boolean Logic - Definição de Madrugada e Manhã. . . . . . . . . Figura 4.4: Variável difusa (estado do dia), formada por 4 termos difusos . . . Figura 4.5: Exemplo de um domínio difuso (estado do dia) . . . . . . . . . . . . . . . 30 30 31 32 Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura Figura . . . . . . . . . . . . . . . 35 36 46 46 46 47 47 48 48 49 49 50 51 51 52 5.1: 5.2: 5.3: 5.4: 5.5: 5.6: 5.7: 5.8: 5.9: 5.10: 5.11: 5.12: 5.13: 5.14: 5.15: A arquitetura inicial do projeto C.H.R.I.A. . . . . . . A arquitetura final do C.H.R.I.A. . . . . . . . . . . . Início do Re:CHRIA. . . . . . . . . . . . . . . . . . . O comando de ajuda e os comandos disponíveis. . . . O comando de “go” e a descrição de uma nova sala . O comando de “talk” e a descrição de uma conversa . Algumas mensagens de início e fim de missões. . . . . Atacando um NPC (agente). . . . . . . . . . . . . . Atacando um inimigo. . . . . . . . . . . . . . . . . . O inventário do jogador e a descrição de itens obtidos. A interação com uma loja (Store). . . . . . . . . . . Interagindo com itens, “get” e “use”. . . . . . . . . . A sequência das ações dos agentes. . . . . . . . . . . Oscilações da sociedade no Re:CHRIA. . . . . . . . . Oscilações da sociedade no Re:CHRIA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 RESUMO Esta monografia visa mostrar um problema comum aos jogos de Role-Playing Games atuais e propor uma solução para esta questão que pouco modifique os jogos. O desinteresse e falta de motivação dos jogadores para continuarem jogando um título está cada vez mais presente nos games, estando eles sempre em busca de jogos novos para suprir esta falta de interesse. Com o objetivo de comprovar este problema foi feita uma análise crítica de alguns jogos digitais atuais que contem este fator. Dentre todos os jogos analisados “The Elder Scroll IV: Oblivion”, que ganhou o título de “Game of the Year”, é o que chama mais atenção: com algumas horas de jogo (que tem em seu total de jogo mais de uma centena de horas) é perceptível a repetição e falta de inteligência de algumas missões secundárias. Para propor uma solução válida foram estudadas as àreas de RPG, CRPG, Narrativas, Agentes Inteligentes, BDI e Lógica Difusa. Com este estudo, a solução encontrada foi criar um agente inteligente que crie temas de histórias e quests diversificadas, baseandose na interação entre os agentes racionais presentes no mundo. Para esta solução foi proposta uma arquitetura chamada “projeto C.H.R.I.A.”. Para validação, foi desenvolvido um caso de uso denominado “Re:CHRIA”, que implementa a solução proposta em um jogo simples no estilo textual para um jogador. Palavras-chave: Role-playing game. inteligência artificial. agentes inteligentes. belief-desires-intentions. lógica difusa. narrativas. Creating Stories of Role-Playing Games by the Interactions between Rational Agents ABSTRACT This monograph aims at revealing a common problem of modern RPG games and proposing a solution to this question that infers on small changes on the games. The disinterest and lack of motivation from the players to continue playing a game is growing and to suppress this detachment the players have to be on a constant quest for new releases. With the objective to prove this problem, a review of current digital games that contains this factor was made. Among all the reviewed video games “The Elder Scroll IV: Oblivion”, that won the title of “Game of the Year”, is the one that calls most attention: with only a few hours of gameplay (the total of the game surpasses a hundred hours) is noticeable the repetition and lack of intelligence of some side-quests. To propose a valid solution the fields of RPGs, CRPGs, Narratives, Rational Agents, BDI and Fuzzy Logics were studied. With this study, the solution thought was to create an intelligent agent capable of generating themes of stories and diversified quests, based on the interaction between rational agents existing in the world. For this solution, an architecture was proposed and the “project C.H.R.I.A.” was born. To validate it an use case, named “Re:CHRIA”, was developed, that implements the proposed solution on a simple game based on the MUD game-style for one player. Keywords: role-playing game, artificial inteligence, rational agents, beliefs-desiresintentions, fuzzy logic, narratives. 11 1 INTRODUÇÃO Os Role-Playing Games, surgidos na década de 70, são jogos de interpretação e atuação de papéis jogados em grupos. O RPG atrai adeptos, pois é um jogo colaborativo e social, ao invés de competitivo. O grupo toma as decisões e se aventura, raramente havendo vencedores ou perdedores, e se isso acontecer, o grupo como um todo é afetado. Os Computer Role-Playing Games, originários dos RPGs, são o porte do jogo real para os computadores, com algumas diferenças. Atualmente, muitos jogos de RPG para computador são líderes de venda no mercado e sucesso de crítica. O presente trabalho de conclusão de curso inclui uma análise crítica (capítulo 3) para identificar um problema comum aos CRPGs e projetar uma alternativa de solução para este problema. Na análise, o que percebe-se é o pouco desenvolvimento das histórias ou quests secundárias do jogo. Normalmente, essas missões não são obrigatórias, e não dão estímulo o suficiente para o jogador resolver fazê-las, sendo a recompensa pouco gratificante ou até entediante. Outro problema relacionado a essas missões é o fato de que elas são pouco desafiadoras, exigindo mínima habilidade do jogador. Esses jogos poderiam ser mais interessantes se as histórias secundárias e side-quests criassem mais desafios para que os jogadores pensassem mais sobre a sua interação com o jogo. Além disso, poderiam existir várias opções aleatórias dessas missões para que o game tivesse um “fator replay” maior, fator esse que determina se o player irá jogar novamente o jogo. Este problema, está ligado aos jogadores de RPGs cansarem e perderem o interesse muito rapidamente em um título novo, estando sempre em busca de novos games para suprir esta carência. Além do fato de muitos jogadores terem desistido de RPGs, pois não tem o tempo necessário para começar um jogo sabendo que vão 12 cansar rapidamente. É difícil delimitar um culpado por trás deste problema. O que pode ser afirmado é que muitas vezes os desenvolvedores e publicadores só estão interessados em melhorar as histórias/missões principais do jogo e acabam deixando de lado as partes secundárias. O detalhe é os players perdem o interesse no jogo como um todo se as missões secundárias não forem atrativas o suficiente, pois as mesmas, quando interessantes, estimulam o jogador a continuar jogando e aproveitando o game. A solução inicial deste problema foi desenvolver um agente inteligente que crie temas de histórias e quests diversificadas, baseando-se na interação entre agentes racionais. Uma das especificações é que esses agentes deveriam ter a possibilidade de serem integrados em diferentes motores de RPG. Para compreender melhor a solução projetada para o problema, foi necessário conceitualizar e estudar os temas envolvidos e trabalhos relacionados. O primeiro passo foi o estudo dos RPGs e CPRGs (capítulo 2). Com este estudo, surgiu a necessidade de criar um modelo básico para as quests do jogo, então o Sistema de Aventuras Instantâneas foi incorporado às missões. Para a criação de histórias, era necessária uma narrativa sólida, com personagens agradáveis e um bom cenário. Estas características puderam ser obtidas com o estudo das narrativas, personagens e roteiro, presente na seção 2.3 deste trabalho. Para entender melhor o conceito de “Agente Inteligente” (Rational Agents), uma conceitualização da Inteligência Artificial como um todo foi feita, tornando o estudo dos agentes mais compreensível (capítulo 3). O termo “agente” é utilizado para significar uma entidade que interage com o ambiente que ela vive, sendo o ativo originador da ação. Com base nos trabalhos de Wooldridge [1], foi compreendido que os agentes racionais computacionais são sistemas capazes de ações autônomas e independentes, tomando as melhores decisões sobre o que deve ser feito em determinada situação. Pela necessidade de permitir a racionalização aos agentes, foi escolhido um modelo para criar este comportamento, o BDI (Beliefs, Desires e Intentions), na seção 4.1.1 deste trabalho. Este modelo representa uma arquitetura cognitiva humana baseada em estados mentais, e seu nome é originário a estes estados: crenças, desejos e intenções. O objetivo do BDI é decidir quais as metas que devem ser atingidas 13 e como isto será feito. Para desenvolver o modelo BDI, foi escolhida a Lógica Difusa, Fuzzy Logic (seção 4.2), que permite lidar com aproximação e valores relativos, ao invés de precisão e valores absolutos das lógicas clássicas. Alguns valores como “forte”, “fraco”, “muito”, “pouco”, “talvez”, “médio”, “quase”, são utilizados no dia-a-dia da racionalização humana, assim estes valores beneficiariam os agentes inteligentes, que teriam uma capacidade de tomar decisões mais parecida com a humana. Para implementar a lógica difusa no projeto, foi utilizado o Fuzzy Logic Framework (FuzzyF), que é um conjunto de classes usadas para representar domínios difusos e efetuar as inferências sobre este domínio. Após estes estudos e conceitualizações, foi proposta uma arquitetura no presente trabalho, que recebeu o nome de “projeto C.H.R.I.A.” (capítulo 5), originário da idéia de “criação”. Para testar a validade da idéia, um caso de uso, denominado “Re:CHRIA”, foi desenvolvido na linguagem Java e utilizando como base os Multi-User Dungeons. Os MUDs (seção 2.2.1) são jogos de computador para multijogadores que combinam elementos de RPGs e bate-papo. Os MUDs clássicos são em formato textuais e a interação com os jogadores acontece pela leitura e inserção de comandos. 14 2 ROLE-PLAYING GAMES E NARRATIVAS Os RPGs surgiram da necessidade das pessoas interessadas em terem um jogo onde pudessem fantasiar e interpretar personagens em um mundo e ambiente que desejassem. Assim os RPGs foram evoluindo com o passar dos anos e foram cruciais para o desenvolvimento da indústria de jogos da atualidade, pois muitos gêneros diferentes destes utilizam elementos surgidos nos RPGs para compor seu gameplay. A base de um jogo de RPG é uma narrativa sólida e consistente, com personagens coerentes e criativos, participando de um cenário interessante e agradável. Todas estas características acima podem ser obtidas com o estudo das narrativas, dos personagens e dos roteiros, criando um mundo ideal, tanto para o desenvolvedor como para o jogador. Ao analisar as técnicas de criação de narrativas e roteiros, podemos obtemos conhecimentos essenciais para a criação de uma boa história, como os pontos de virada - para criar mais drama e ação, as sequências - para estrutuar uma narrativas consistente - e um bom final - que muitas vezes é mais importante que o início de uma história. Os personagens bem elaborados são elementos que mais prendem o leitor à história. O que seria de “O Senhor dos Anéis” sem Frodo Bolseiro? Ou ainda “Star Wars” sem Darth Vader? E “Harry Potter” sem Dumdbledore? Ou mesmo “Romeu e Julieta” sem o casal apaixonado? Um personagem é a ação da história, agindo o personagem “carrega” o leitor junto com ele. Neste capítulo serão analisados os RPGs e os CRPGs. Também serão estudados a criação de personagens, as essências da narrativas e o as partes de um roteiro. 15 2.1 Role-Playing Game RPG é a sigla de Role-Playing Game, ou seja, jogo de interpretação e atuação de papéis. Foi criado em 1974 com o Dungeons and Dragons, ou D&D, como é conhecido. Uma sessão de RPG é caracterizada por jogadores assumindo papéis de personagens, aventurando-se por cenários diversos. É normalmente jogado por um pequeno grupo de pessoas, dentre as quais, um Game Master, Dungeon Master ou Mestre de Jogo, que é responsável por narrar a história, ditar os acontecimentos e o andamento do jogo. Para se jogar RPG é necessário um conjunto de dados de faces diferentes, dentre os mais utilizados estão o dado de seis faces e o de vinte faces. Os dados de dez, oito, quatro, doze e até mesmo cem faces são, muitas vezes utilizados durante uma sessão. De acordo com Pedroso [2], o tempo de uma aventura é variável, podendo durar de horas até semanas. Se os jogadores usarem os mesmos personagens durante muitas aventuras, as aventuras tornam-se uma “campanha” como é chamada, que é composta por várias aventuras, podendo durar de meses a anos. Os jogadores humanos, ou PCs como são chamados - do inglês Playable Character, em oposição aos NPCs (Non Playable Character) - recebem missões dos NPCs, essas missões são conhecidas pela palavra em inglês, quest. Normalmente uma aventura é caracterizada por uma quest principal e algumas secundárias; a campanha é composta por uma grande quest geral, as missões principais das aventuras e as secundárias. Normalmente um jogador pode ter ao mesmo tempo várias missões para fazer. Por exemplo, um grupo de três pessoas - um Guerreiro, um Mago e um Ladrão - tem uma missão principal de destruir o senhor das trevas e salvar o continente. No momento eles estão resgatando uma princesa em um castelo distante, que possui um mapa que pode ajudá-los a conseguir um item para destruir o vilão. Ao mesmo tempo eles devem salvar a vila próxima do ataque constante de uma gangue de ladrões e ajudar um fazendeiro local a se livrar dos goblins que assolam suas terras. Pedroso relata que para jogar normalmente são utilizados um sistema de regras e um cenário. O mais conhecido é o sistema d20 no cenário de Dungeons & Dragons [3], mas existem vários outros como os sistemas Daemon e GURPS e os cenários 16 de Tormenta e Arkanum. Esses sistemas estão descritos em livros ou em netbooks, livros de internet que são distribuídos gratuitamente. Por uma interpretação melhor, cada jogador humano escolhe um personagem para interpretar e “viver” durante a campanha. Suas características, habilidades, perícias e talentos são descritos na ficha do personagem. As características são me-lhoradas conforme o personagem sobe de nível, por ter ganhado experiência suficiente, fazendo quests ou matando monstros. 2.1.1 Sistema de Aventuras Instantâneas Durante uma sessão de RPG, muitos obstáculos acabam por surgir como: falta de livros específicos do jogo, o Mestre não tem mais idéias para a aventura, falta de informações a respeito de uma regra, improvisação de características dos personagens e até falta de vontade dos jogadores. Dentre esses problemas, sem dúvida o mais importante deles é a falta de idéias do Mestre do jogo. Os outros problemas são significativos também, mas com criatividade dos jogadores esses obstáculos são contornáveis. Na tentativa de resolver o problema de falta de inspiração, muitos mestres recorrem a livros ou revistas especializadas, contendo histórias sólidas (aventuras prontas) que atendem às necessidades momentâneas. Pedroso [2] cita que no mercado brasileiro poucos são os lugares em que podem ser encontradas essas aventuras. Os livros têm pouca procura devido a seu alto preço e algumas revistas especializadas que publicam essas aventuras não tem como suprir a demanda de todos os cenários que são jogados. Para resolver esta questão foi desenvolvido o SAI - Sistema de Aventuras Instantâneas [4], que tem como base a análise de partidas de RPGs, definindo padrões básicos de aventuras. O SAI reúne várias opções para serem usadas em uma sessão, desde uma simples quest até campanha completa. Assim sendo, o sistema, que é um netbook distribuído gratuitamente na Internet, se torna um poderoso aliado do Game Master. 17 O SAI foi utilizado neste trabalho para definir algumas noções básicas de uma missão, criando assim um Agente Inteligente (explicado no próximo capítulo) mais realista com o mundo dos RPGs e um Dungeon Master que consiga diferenciar aspectos de missões, determinando qual é a mais indicada para o jogador interagir com a sociedade. 2.2 Computer Role-Playing Game Um CRPG é um gênero de vídeo game originalmente desenvolvido para uso em computadores pessoais. Os primeiros CRPGs foram inspirados pelos primeiros RPGs de mesa, como o Dungeons & Dragons, e tentavam proporcionar uma experiência de jogo similar. Muitas vezes os CRPGs são confundidos com os console Role-Playing Games, que mesmo fazendo parte do mesmo gênero de jogos, não são completamente iguais. Apesar das diferentes features e estilos de jogos que existem no gênero CRPG, existem alguns elementos comuns entre eles. Provavelmente a semelhança mais saliente seria o personagem, com suas características que evoluem no decorrer do jogo e acabam por tomar o lugar da habilidade do jogador na determinação do resultado do jogo. Além de ser a maior semelhança, o desenvolvimento do personagem principal também é designado como o elemento mais importante dos CRPGs. Os CRPGs atuais, utilizam toda a mecânica de jogo e opções dos RPGs, como histórias que envolvem um grupo de personagens (em inglês party) que se uniram para cumprir uma missão. Durante o jogo, os aventureiros devem enfrentar um grande número de desafios e inimigos. Os personagens possuem uma variedade de atributos, como pontos de vida, força, constituição, agilidade e inteligência. A indústria de jogos evolui muito por conta dos CRPGs, pois jogos famosos e que marcaram história como Grand Theft Auto: San Andreas e Warcraft III utilizam muitos elementos originários do gênero em questão. No caso do primeiro, um jogo de ação, ele utiliza uma variedade de atributos para determinar o personagem principal e existem quests para o jogador cumprir. E o segundo, um jogo de estrátegia em tempo real, existem heróis que evoluem, completam missões e ganham novas habilidade e equipamentos. Uma das limitações dos CRPGs em relação aos RPGs refere-se a grande maioria 18 dos temas apresentados nestes jogos envolverem um cenário altamente fantástico. Diferente dos RPGs tradicionais onde existem uma infindade de temas e cenários diferentes. Alguns CRPGs tentam fugir desta limitação, mas dos poucos que tentaram esses fizeram ainda menos sucesso entre o público. 2.2.1 Multi-User Dungeon Uma das inspirações para os CRPGs foi o MUD (Multi-User Dungeon, Domain or Dimension), um jogo de computador multi-jogador que combina elementos de RPGs e salas de bate-papo. Os MUDs típicos são em formato texto. A interação com os jogadores se dá pela leitura da descrição de salas, objetos, eventos, combates, personagens, NPCs ou monstros em um mundo virtual e a inserção de comandos (por meio da digitação) escritos, de acordo com o jogo. Semelhante aos CRPGs, os MUDs mais tradicionais tem como tema um mundo de fantasia com características semelhantes aos jogos de role-playing. O objetivo de um MUD similar aos RPGs/CRPGs: matar monstros, explorar o mundo, completar missões, criar uma história por interpretação e evoluir o personagem. Muitos dos MUDs possuem como cenário um tema de RPG já existente como o D&D. Indo além do mundo dos CRPGs, e adentrando mais perto dos RPGs, os MUDs podem ter temas diferenciados, como livros populares, filmes, animações e histórias. Nem todos os MUDs são jogos, existem os educacionais que ensinam temas mais abrangentes. Na última década os MUDs perderam espaço para os jogos mais avançados graficamente, mas os herdeiros dos MUDs, os atuais MMORPGs (Massively Multiplayer Online Role-Playing Games) ou MUDs gráficos, honram o nome do seu antecessor em popularidade e qualidade. 2.3 Narrativas e Personagens A palavra personagem pode ser dividida em duas partes, “persona” e “agem”. “Persona” tem sua origem da palavra latim persona, que significa pessoa (mas também pode significar ação) e “agem” vem de agir, ou seja, personagem pode ser resumido como uma pessoa que faz uma ação, que age. Field [5] descreve que um dos aspectos mais importantes sobre a criação de um 19 personagem é que você deve conhecê-lo. A sua vida é separada em interior - formação do personagem, desde o nascimento até o início do jogo - e exterior - revelação do personagem, o começo é marcado pelo início do jogo, até seu fim. Field ainda esclarece que o desenvolvimento de um personagem é chamado de pesquisa criativa, e que ele interage de três formas: experimentando conflitos para alcançar sua necessidade; interagindo com outros; e interagindo consigo mesmos. Ele conclui que a parte mais importante de um personagem é a definição de sua necessidade principal, e sua essência é a ação. O personagem é o que ele faz. Vogler [6] emprega o termo Arquétipo ao descrever tipos comuns de personagens, símbolos e relações, termo que antes era usado ao designar antigos padrões de personalidade que são uma herança compartilhada por toda raça humana. Ele ainda delimita os arquétipos que ocorrem com mais freqüência, os mais úteis e mais importantes: o Herói - o que está disposto a sacrificar suas próprias necessidades em benefício dos outros, o Mentor - também conhecido como “Velho(a) Sábio(a)”, uma figura positiva que ajuda ou treina o herói, o Guardião do Limiar - são os guardiões dos obstáculos que o herói enfrenta, o Arauto - que é uma força que traduz um desafio ao herói, o Camaleão - o personagem que muda de aparência ou estado de espírito constantemente, o Sombra - representa o lado obscuro, os aspectos não-expressos, irrealizados ou rejeitados de alguma coisa, normalmente a face da Sombra está presente nos vilões, antagonistas ou inimigos - e o Pícaro - são os personagens “palhaços” ou manifestações cômicas. Vogler relaciona que os arquétipos podem ser como máscaras, usadas temporariamente pelos personagens a medida que são necessárias para o avanço da história. Um personagem pode entrar na história fazendo o papel de um arauto, depois trocar a máscara e funcionar como um bufão ou pícaro, um mentor ou um sombra. Uma das partes mais importantes da narrativa é o final. Antes de fazer o início da narrativa, o final já deve estar bem delineado. Para criar um início, basta responder a três questões básicas: quem é o personagem principal; do que se trata a narrativa; e qual a situação dramática. Uma narrativa deve conter várias seqüências, que de acordo com Field, é a parte mais importante de um roteiro. Seqüência nada mais é do que, uma série de cenas ligadas por uma idéia única. Para criar uma cena se deve pensar a respeito de seu 20 contexto e conteúdo. Outra parte essencial para qualquer história é o plot point, ou ponto de virada. O ponto de virada é o incidente ou evento que engancha na ação e a reverte noutra direção. Ele dá continuidade à história. Os pontos de virada são os pivôs de ação dramática, eles mantêm tudo no lugar, são metas, objetivos ou pontos de destino de cada ato. Elos forjados na cadeia da ação dramática. Os plot points são usados sempre quando se deseja causar drama ou aumentar a tensão de uma narrativa. Normalmente, um ponto de virada é inesperado para o leitor e aumenta o interesse do mesmo na narrativa. O comum é se usar dois pontos de virada em uma narrativas (como mostrado na Figura 2.1), porém podem existir mais dependendo da necessidade do autor. Field explica sobre a criação básica de um roteiro em que ele deve ser divido em três atos principais, chamados de apresentação, confrontação e resolução, respectivamente. Entre os atos I e II e os atos II e III existem pontos de virada. O diagrama pode ser visto na Figura 2.1. Figura 2.1: Diagrama básico de um roteiro por Field. O diagrama básico de um roteiro pode ser muito útil nas histórias de um jogo e missões. Exemplificando esta idéia em um jogo, em “The Elder Scroll IV: Oblivion” existe uma quest em que se deve ajudar uma moradora da cidade a solucionar o mistério de quem está matando os seus ratos. No que seria o “Ato I” ou Apresentação da missão, o jogador deve andar pela cidade pra descobrir se alguém viu os ratos da habitante ou não. No final do “Ato I”, o player entra no porão dela e encontra um Leão-da-Montanha matando as ratazanas. Esta parte seria o primeiro ponto de virada. No início da confrontação o guarda da cidade fala que suspeita da vizinha maldosa da dona dos ratos. Então por todo “Ato II” o jogador deve segui-lá pela cidade 21 para no final descobrir que ela está pondo carne crua na frente de um buraco do porão dos ratos. Este seria o segundo plot point. No começo da resolução, alguns guardas avisam o personagem que uma alcatéia de Leões-da-Montanha foi avistada nas redondezas da cidade. Uma batalha ocorre entre os animais e o viajante. Esse sai vitorioso e volta para cidade para pegar sua recompensa com a dona dos ratos. No final a vizinha má vai presa. 22 3 ANÁLISE CRÍTICA DE JOGOS DE ROLE-PLAYING GAME Com base nas definições feitas nos capítulos anteriores, alguns jogos de RPG atuais, foram estudados para o fim deste trabalho, podendo ser citados, por exemplo “Neverwinter Nights II” (NWN2) [7], “The Elder Scroll IV: Oblivion” [8], “Diablo II” (D2) [9] e “Final Fantasy Tactics A2: Grimoire of the Rift” (FFTA2) [10]. Analisando estes jogos percebeu-se o pouco desenvolvimento das histórias/missões secundárias dos jogos, normalmente sendo pouco desafiadoras e exigindo mínima habilidade por parte do player. Com isto, os jogadores cansam mais rápido do game e perdem o interesse, partindo em busca de títulos novos ou o modo multiplayer online do jogo (caso de Diablo II). Um ponto positivo em NWN2, Oblivion e FFTA2 parecem suprir um pouco desta carência por um lado, pois os três jogos são extendos, tendo muitas horas de duração. Porém o problema ainda existe. D2 leva vantagem em relação aos outros três, pois possui um modo para multi-jogadores pela internet, diminui assim, o declínio de interesse dos jogadores. Ao analisar este jogos foi observado que o problema das missões repetitivas continuou, desde um jogo de oito anos atrás (D2) até um jogo de dois meses atrás (FFTA2). Nas seções a seguir vou analisar os jogos citados e descrever o motivo de estudo deles para este trabalho. 3.1 Neverwinter Nights II A série Neverwinter Nights (incluindo o primeiro e suas expansões, e o segundo jogo e as expansões), é considerada uma das séries de CRPGs com regras que se 23 aproximam mais dos RPGs de mesa. Todo o sistema do segundo jogo da série é baseado no sistema de regras do Dungeons & Dragons versão 3.5, com apenas algumas modificações para se adaptar ao gameplay em tempo real. Neverwinter Nights II recebeu vários prêmios por sua história e enredo excelentes, porém, um problema no jogo é que, mesmo podendo fazer vários personagens diferentes, as missões e histórias secundárias são sempre iguais, não importando que classe esteja usando ou em que ordem essas missões foram feitas. Este fator diminui a vontade do usuário jogar novamente o jogo (conhecido como replay) e assim impede que os desenvolvedores e jogadores explorem um jogo com missões sempre diferenciadas. NWNII consegue contornar este problema de modo com que o jogador não perceba este ocorrido até ter jogado por muito tempo. O jogo é extenso e conta com uma excelente história, com castelos, dragões e grandes magos. Além deste fato, expansões para o jogo - contendo mais história, poderes, horas de jogo e mapas - são lançados constantemente, sempre estimulando o player a comprar e continuar jogando. Mesmo com as expansões, sempre que se chega à uma nova cidade ou região, um objetivo comum é “mate todos os monstros que estão atacando a vila, pois somos fracos e não conseguimos”. O que acaba por cansar o jogador com menos paciência ou que está em busca de novidades. 3.2 The Elder Scroll IV: Oblivion Oblivion, um jogo com temática de fantasia e ação orientada, é considerado um dos jogos que mais se aproxima do ideal do RPG clássico, desempenhar papéis. Este jogo (e seu antecessor Morrowind) possui um mundo muito grande e aberto, com possibilidades imensas de ação. Neste jogo o enredo não comanda a aventura, ele é apresentado no início do jogo, mas em nenhum momento o jogador é obrigado a segui-lo. Quem faz o game é o player, pois o jogo tem muita liberdade e é extenso. No entanto, o Oblivion tem a mesma limitação de NWN II, não importando o personagem a ser usado e o jeito que o jogo foi desenrolado, as missões e histórias alternativas sempre são as mesmas. Oblivion leva uma pequena vantagem neste ponto em relação à NWN, pois o mundo é imenso, tornando difícil ao player fazer 24 todas as missões da primeira vez que jogar. Oblivion, na sua totalidade, tem mais de 100 horas de jogo, o que faz com que o jogador tenha interesse em conhecer o jogo em sua totalidade. Outro fator que contribui para isto é o fato de que o mundo de Oblivion é enorme, com cenários variados e bem feito. A liberdade do jogo contribui para superar o problema, pois o player consegue explorar seu personagem ao máximo antes de se cansar dele. Só que mesmo com o mundo enorme e variado e muita liberdade, a missão mais comum é “pegue ali na minha estante o item para mim” ou “ache na minha casa o item que eu perdi”, sendo assim o jogador que busca novidades acaba por não explorar muitos personagens e missões do jogo, pois cansou de fazê-las anteriormente. 3.3 Diablo II Diablo II, um action RPG, é com certeza um dos jogos mais famosos de todos os tempos. Lançado pela gigante empresa Blizzard no ano 2000, é a seqüência do aclamado Diablo, e rapidamente se tornou um sucesso de público. Um dos maiores motivos do sucesso do jogo foi a mistura entre RPG e hack and slash (termo que faz alusão à violência do jogo), e o fato que o jogo podia ser jogado online com outros jogadores do mundo todo, através da Battle.net. Diablo II, anterior a NWN2 e Oblivion, é bem limitado em se tratando de quests e história, existem quatro atos principais no jogo, cada ato possui uma cidade com alguns NPCs e em média 6 missões. Completando essas missões o jogo acaba. Então, você pode tentar fazer as mesmas quests por uma dificuldade mais difícil. O modo para um jogador de D2 não fez muito sucesso, o que mantém o jogo vivo e sendo jogado até hoje é o modo multiplayer, que após completar as missões o jogador pode interagir com outros para trocar itens e enfrentar outros players para decidir quem possui o personagem mais forte. 3.4 Final Fantasy Tactics A2: Grimoire of the Rift Mudando um pouco dos RPGs clássicos citados acima, Final Fantasy Tactics A2: Grimoire of The Rift, seqüência do sucesso Final Fantasy Tactics Advance, é um RPG mais moderno, lançado recentemente pela Square Enix. FFTA2 é um RPG de 25 tática em turnos e foi bem recebido pelos críticos e público em geral, ao melhorar o já excelente sistema do primeiro jogo e incrementar novidades, como raças, jobs (similar a classes) e clãs inimigos. Final Fantasy Tactics A2 entretem o jogador por várias horas, possuindo mais de 300 missões e batalhas aleatórias contra monstros e clãs inimigos. Interessante que muitas dessas missões formam histórias próprias e são desencadeadas à medida que o jogador vai completando outras. Infelizmente, o problema analisado anteriormente persiste, mesmo com mais de 300 missões, FFTA2 possui uma história e missões iguais. Um bônus e atrativo extra para os jogadores está no fato de que após terminado o jogo, muitas novas missões se tornam disponíveis, assim como personagens especiais e novos modos de jogo. Esse extra é uma tentativa de superação do problema das missões repetitivas, pois o jogador sempre se interessa por novos personagens e novas histórias. 26 4 INTELIGÊNCIA ARTIFICIAL A Inteligência Artificial (IA, ou em inglês, AI) é a inteligência das máquinas, sendo definida como o estudo e o planejamento de agentes inteligentes, no qual o agente é aquele que percebe seu ambiente e o influência [11]. De acordo com McCarthy [12], criador do termo Inteligência Artificial em 1955, a IA pode ser definida como “a ciência e a engenharia para fazer máquinas inteligentes”. A IA surgiu da necessidade humana de simular a própria inteligência em máquinas, e no decorrer dos anos, evoluiu muito e também sofreu problemas que surpreenderam até os mais pessimistas dos cientistas. Atualmente, o campo da IA, é uma parte essencial do mundo tecnológico em que vivemos, ajudando a computação à resolver os problemas mais desafiadores. Existem muitos temas no ramo de estudos da Inteligência Artificial [12], que asseme-lham-se na tentativa de simular a inteligência humana, seja através de comportamento, aprendizagem, racionalização, planejamento, conhecimento, comunicação, percepção ou interação. Um jogo de RPG nada seria sem os agentes do mundo, desde uma simples criança até um rei importante. Para entender como estes agentes funcionam e torná-los mais reais, foi escolhido um modelo de comportamento de agentes que simula o raciocínio prático humano, o BDI. Combinando este modelo com o estudo de Agentes Inteligentes, os agentes de um RPG puderam ser desenvolvidos a pensar por si. E para simular a lógica de raciocínio destes agentes, foi usado junto com o BDI, a lógica difusa, que permite uma lógica muito mais complexa e realista que as demais. Todos estes temas serão abordados detalhadamente neste capítulo. 27 4.1 Agentes Inteligentes O mundo que habitamos está repleto de agentes. O termo “agente” é utilizado para significar uma entidade que interage com o ambiente que ela vive. Agentes não são meramente observadores ou recipientes das ações feitas por outras entidades, agentes são os ativos originadores da ação. Essas ações são feitas para modificar e delimitar o ambiente. Os humanos são os exemplos mais óbvios de agentes que existem. De acordo com Wooldridge [1], um dos objetivos da comunidade de IA é criar programas/sistemas de computadores que possam agir como agentes racionais autônomos. Esses sistemas são chamados de agentes porque eles são capazes de ações autônomas e independentes para suprir o objetivo de seu design, ou seja, eles são capazes de tomar decisões sobre o que fazer em determinada situação, sem a presença de um humano. O adjetivo racional (ou inteligente) é adicionado à palavra agente, para simbolizar o fato de que as decisões que eles fazem sobre o que deverá ser feito, são consideradas boas, pois otimizam o estado do agente. Figura 4.1: Relação Agente-Ambiente de acordo com Wooldridge. Wooldridge afirma que, o problema é que não basta um sistema de computador pensar sobre boas ações para serem tomadas, o desejo é que ele seja hábil para executar essas ações. Ou seja, o agente inteligente deverá estar perfeitamente integrado em um ambiente - que habita e age perante este ambiente tal qual agimos e habitamos sobre o nosso próprio. Evidentemente, este objetivo está longe de ser alcançado, conforme Wooldridge. Na Figura 4.1 é possível observar uma visão abstrata da relação de um agente com o ambiente. Os sensores do agente (as decisões) 28 são influenciados pelo ambiente e as ações do agente influenciam o ambiente. Bittencourt [13] relata que entender as propriedades de um agente auxilia no processo de classificação dos mesmos. Ele descreve as principais propriedades dos agentes: Reatividade - o agente deve ser capaz de reagir as informações provenientes do ambiente; Autonomia - o agente deve ser capaz de tomar suas próprias decisões independentemente; Pró-Atividade - ele deve poder agir conforme metas, não somente sobre os impulsos do ambiente; Contínuo Temporal - o agente está continuamente em execução; Comunicação - capacidade de trocar informações com outros agentes; Adaptação e Aprendizado - habilidade de extrair conhecimento de experiências anteriores e adaptar-se perante o ambiente; Mobilidade - é a capacidade dos agentes navegarem através de redes de computadores; Flexibilidade - quando as ações de um agente não são pré-definidas ; e Caráter - esta propriedade refere-se aos agentes que possuem personalidade e estado emocional. As quatro primeiras propriedades (Reatividade, Autonomia, Pró-Atividade e Contínuo Temporal) são comuns a todos os agentes. As outras propriedades podem ser encontradas em agentes ou não, dependendo da aplicação do mesmo. Por exemplo, se o agente for um agente de comunicação em rede com outros agentes, possuindo ações pré-definidas e sem aprendizado, ele terá as propriedades de Comunicação e Mobilidade, porém, as propriedades de Adaptação e Flexibilidade não estarão presentes. 4.1.1 Modelo Belief-Desire-Intention Segundo Fagundes [14], o modelo BDI representa uma arquitetura cognitiva baseada em estados mentais, e tem sua origem no modelo de raciocínio prático humano. O nome atribuído a este modelo vem dos estados mentais: Beliefs (crenças), Desires (desejos) e Intentions (intenções). Uma arquitetura BDI representa seus processos internos através dos estados mentais e define um mecanismo de controle que seleciona de maneira racional o curso das ações. Bittencourt [13] resume que o modelo serve para decidir qual ação executar que melhor atenda os objetivos dos agentes. Em suma envolve decidir quais as metas que devem ser atingidas e como isto será feito. De acordo com Wooldridge [1], o modelo BDI é interessante, pois combina três 29 componentes distintos: um componente filosófico - o modelo possui uma base filosófica na teoria Belief-Desire-Intention da praticidade da razão humana, proposto por Bratman [15]; um componente de arquitetura de software - o modelo pode ser implementado de maneiras diferentes, pois não tem uma implementação específica em sua teoria; e um componente lógico - este componente do modelo é uma família de lógicas. Essas lógicas capturam o aspecto chave do BDI como um conjunto de axiomas. As lógicas do BDI, em suas várias formas, foram provadas como sendo as mais úteis e aceitas teorias de agentes racionais. Wooldridge define as crenças como representantes do conhecimento do agente sobre o mundo. Em termos computacionais, crenças são apenas uma maneira de representar o estado do mundo, seja através de variáveis, uma base de dados relacional, ou expressões simbólicas em um cálculo de predicados. As crenças podem ser incompletas ou incorretas. Fagundes descreve os desejos (imprecisamente chamados de objetivos) como relacionamentos eventuais ao estado de mundos que o agente quer provocar. Desejar não significa agir. Antes de um determinado agente decidir o que fazer, ele passa por um processo de racionalização e confronta os seus desejos com as suas convicções. O agente escolherá os desejos possíveis de acordo com algum critério. As intenções são os estados do mundo que o agente quer provocar, ou seja, ao contrário dos desejos, os agentes estão comprometidos em realizar as intenções. De acordo com Bittencourt, as intenções são as metas escolhidas conforme a prioridade do agente. Desta forma planos podem ser criados através da combinação destas intenções. 4.2 Lógica Difusa A Lógica Difusa (fuzzy logic) é uma forma de lógica que surgiu dos estudos sobre a teoria dos conjuntos difusos (fuzzy sets theory) desenvolvidos por Lotfi Zadeh [16] em 1961. O raciocínio da lógica difusa é baseado na aproximação ao invés da precisão, lidando com valores relativos como “forte”, “fraco”, “muito”, “pouco”, “talvez”, “médio”, “quase”, e não os valores “verdadeiro” e “falso” das lógicas clássicas. Wilkison [17], em 1963, publicou o primeiro trabalho sobre Fuzzy Logic, e redefiniu as lógicas multi-valores em termos dos conjuntos difusos, usando circuitos 30 Figura 4.2: Comparação entre a lógica Booleana, a lógica Multi-valor e a lógica Fuzzy por Bittencourt. elétricos. Em 1965, Zadeh [18] axiomatizou a lógica de Wilkison sem os sistemas elétricos, e a partir de então a Lógica Difusa vem sendo aplicada em diversos campos, desde teoria do controle até inteligência artificial. De acordo com Bittencourt [13], a lógica difusa é um super conjunto da lógica booleana tradicional como pode ser observado na Figura 4.2, que estende esta lógica incluindo outros conceitos entre o “verdadeiro (1)” e o “falso (0)”. Representa-se esta variação por conjuntos difusos, gerando números dentro de um intervalo de 0 a 1. Figura 4.3: Boolean Logic - Definição de Madrugada e Manhã. Para facilitar a compreensão desta lógica, determinaremos que a partir das 6 AM até às 12 PM é manhã (como mostra a Figura 4.3). Seguindo a lógica booleana as 7 AM é tão manhã quanto às 12 PM, e também significa que às 5:59 AM não é manhã ainda, sendo considerado madrugada. O fuzzy pode ajudar a definir melhor se é dia ou não, inicialmente definindo variáveis lingüísticas e depois definindo os conjuntos difusos associados a estas variáveis, como: manhã, tarde, noite e madru- 31 gada (Figura 4.4). Uma variável difusa não resultaria em uma única resposta, mas em um conjunto de respostas, sendo que cada posição do conjunto é o calor para cada termo nebuloso da variável. Por exemplo, na Figura 4.4, 1 AM seria 0.25; 0,6; 0,0; 0,0, ou seja, seria um “pouco” de noite, “bastante” madrugada e “nada” manhã ou tarde. Mas já ao meio dia, 12 PM, seria “bastante” manhã e “bastante” tarde, mas “nada” dos outros dois. Figura 4.4: Variável difusa (estado do dia), formada por 4 termos difusos Bittencourt detalha melhor a lógica difusa, explicando que os sistemas especialistas fuzzy utilizam um conjunto de regras do tipo If-Then (Se-Então), desenvolvido por Zadeh [19], baseadas em variáveis difusas. Primeiramente as variáveis de entrada sofrem um processo de fuzzificação, ou seja, os conjuntos difusos das variáveis lingüísticas de entrada são ativados. Terminado esse processo efetua-se a inferência sobre o conjunto de regras difusas obtendo os valores dos termos das variáveis de saída. Finalmente, as variáveis de saída sofrem um processo de defuzzificação. Este processo consiste em converter os dados difusos para valores numéricos precisos. Para isto são utilizadas várias técnicas, tais como valor máximo, média dos máximos, média local dos máximos, centro de gravidade, ponto central da área e o centro da média [20]. Estes métodos citados anteriormente referem-se ao modelo Fuzzy denominado Mamdani [20]. Também existe um outro método chamado Takagi-Sugeno [20] que se diferencia do primeiro pelo processo de defuzzificação empregado. Bittencourt ainda observa que os sistemas Fuzzy devem oferecer aos usuários as seguintes capacidades: (i) definir as variáveis e conjuntos difusos; (ii) definir regras If-Then e operadores lógicos (And, Or) que manipulem as variáveis difusas; (iii) re- 32 alizar inferências usando as regras; (iv) oferecer diferentes métodos de defuzzificação das variáveis de saída. 4.2.1 Fuzzy Logic Framework Analisando os trabalhos na área de Lógica Difusa, pode ser encontrado o FuzzyF, Fuzzy Logic Framework [21; 22], que é um conjunto de classes usadas para representar domínios difusos e efetuar as inferências sobre este domínio. O FuzzyF é desenvolvido em linguagem Java, sob a licença GNU GPL e oferece as funcionalidades (i), (ii), (iii) e (iv) descritas na seção acima sobre Lógica Difusa. Este framework oferece uma implementação do modelo Mamdani, possui os principais métodos de defuzzificação (Centro de Gravidade, Ponto Central da Área e a Média dos Máximos), utilização de operadores e definição de regras do tipo If-Then com valores de confiança associados, além de ter um motor para ser utilizado em tempo de execução. O motivo pela escolha da utilização do FuzzyF, é que ele pode ser utilizado facilmente dentro de qualquer aplicação Java, bastando definir um arquivo textual descrevendo o domínio do problema (variáveis de entrada, intermediárias e de saída e as regras, conforme a imagem 4.5) e ativar o motor com um vetor contendo os valores de entrada. O FuzzyF irá retornar um outro vetor com os valores de saída. No capítulo de apêndices existe um exemplo detalhado de arquivo de domínio do FuzzyF. Figura 4.5: Exemplo de um domínio difuso (estado do dia) 33 5 PROJETO C.H.R.I.A. Com os estudos realizados nos capítulos anteriores, a conclusão da análise é que os jogos atuais carecem no conceito replay, que envolve o jogador e as missões/histórias secundárias, tornando-as exaustivas, maçantes e repetitivas. Portanto, com o objetivo de criar um jogo em que as histórias alternativas e as side-quests repetissem raramente, este trabalho desenvolve um modelo para gerar narrativas com missões diversificadas e inteligentes. Na discussão da concepção do projeto surgiu a idéia de uma sociedade, que interagisse e originasse acontecimentos, tal qual o dia-a-dia do mundo real. A proposta era que os eventos fossem inteligentes e não pré-programados, assim os agentes foram integrados ao modelo para poder simular a realidade dos integrantes da sociedade e suas ocorrências. Na tentativa de seguir o comportamento humano, tomar decisões e influenciar devidamente as ações de outros, um modelo de raciocínio prático humano foi adicionado ao processo cognitivo dos agentes, agora racionais. Entretanto, percebeu-se que as pessoas não baseiam suas decisões somente nos seus pensamentos e sim no das outras, na sociedade. Um conjunto de leis básicas foi incorporado à sociedade para suprir mais um requisito que os integrantes dela necessitassem: além de pensarem por si, serem influenciados pelo mundo onde vivem e ao mesmo tempo influenciá-lo com suas ações. Agentes povoariam uma comunidade, agiriam e pensariam, porém ainda faltava uma entidade que possuísse controle sob os agentes e a sociedade, com capacidade para análises profundas e que pudesse delimitar o papel de cada agente, impondo limites e harmonia. Baseando-se nos sistemas de RPG, o conceito do Game Master (GM) foi adaptado, para entender a sociedade e tomar decisões de mais alto nível envolvendo o mundo. 34 O real papel do GM seria analisar e utilizar a sociedade, modificada constantemente pelos agentes, criando histórias com os acontecimentos. Um dos desafios para o GM, seria que ele não deveria incluir quaisquer ações dos agentes na história. O ideal seria que ele selecionasse as ações mais relevantes e de mais impacto e assim faria uma narrativa mais consistente e pertinente. O mesmo modelo de raciocínio prático humano foi adicionado ao GM para fazer esta seleção, assim o Game Master virou um agente O próximo passo do projeto foi a criação da narrativa, propriamente dita, à princípio o GM consultaria alguns textos pré-prontos e escolheria as partes mais adequadas, unificando-as para formar a história atribuída àquela sociedade. Porém, após a aplicação prática da arquitetura esta idéia foi modificada, como relatada a seguir. O conceito e o projeto inicial ficou assim delimitado, e baseando-se em toda a idéia de criação, o projeto ganhou o nome de “Criação de Histórias de RPG entre a Interação de Agentes”, ou C.H.R.I.A., abreviado. Então para o modelo C.H.R.I.A. foi projeto uma arquitetura inicial com base neste estudo (ver a próxima seção de Arquitetura). Aplicando praticamente a arquitetura e continuando os estudos envolvendo o projeto, um pouco do conceito inicial foi modificado: (i) a sociedade não possuiria mais leis, e sim um conjunto de features (atributos), como Riqueza, Felicidade, Condição de Vida, etc; (ii) o GM não necessitaria mais de um modelo de raciocínio, ele teria a capacidade de analisar as features da sociedade e assim escolher que missão fosse mais adequada para a mesma, com simples regras If-Then; (iii) a criação de histórias diretamente pelo Game Master seria substituída pela criação de quests; (iv) uma história agora seria gerada por um conjunto de missões; (v) o GM ganharia mais um papel, sendo o responsável por designar estas missões para o agente que ele julgar mais adequado; (vi) cada agente poderia possuir no máximo uma quest por vez. Então uma nova arquitetura foi criada, com base na anterior, contendo estas modificações: as leis (beliefs) da sociedade foram excluídas, sendo substituídas pelas features; o GM não possui mais uma BDI, desenvolvendo sua lógica através de regras simples; e a criação de quests é agora atribuída ao GM, assim como sua delegação. 35 5.1 Arquitetura do Projeto Com a criação do projeto C.H.R.I.A., uma arquitetura inicial foi proposta (Figura 5.1), baseada nas análises primárias e nas especificações para o trabalho. Existirá uma sociedade principal, composta de um número variável de agentes, que poderá ser desde 1 até n agentes, e cada agente possui um modelo de raciocínio, o BDI, feito com Lógica Fuzzy. A sociedade terá um conjunto de regras gerais (originárias das Crenças do BDI), que será comum a todos os membros da sociedade, como se fosse um conjunto de leis. Princípios que regem a sociedade não estão em cada agente, mas são compartilhados pelo grupo. Ainda existirá um Game Master, como se fosse uma espécie de narrador, que usará e comandará a sociedade. Ele será uma espécie de “avaliador”, que analisará as ações feitas pelos agentes para definir a importância delas para poder gerar a narrativa principal da história. O GM terá um sistema BDI, similar a dos agentes e consultará um banco de templates de narrativas para gerar uma nova história. Figura 5.1: A arquitetura inicial do projeto C.H.R.I.A. Ao desenvolver a arquitetura e aplicá-la em um caso prático, percebeu-se a necessidade de modificar o conceito inicial: as leis (beliefs) da sociedade foram excluídas, sendo substituídas pelas features; o GM não possui mais uma BDI, desenvolvendo sua lógica através de regras simples; e a criação de quests é agora atribuída ao GM, assim como sua delegação. Então uma nova arquitetura foi proposta, baseada nestas novas idéias (ver Figura 5.2). 36 A nova sociedade não possui mais regras do BDI e sim um conjunto de features que classificam o estado atual da mesma, e os agentes utilizam estes atributos para tomar as decisões sobre suas ações. Cada ação modifica as features da sociedade e assim os agentes estão constantemente modificando o ambiente, ao mesmo tempo que são influenciados por ele. O GM, antes utilizando a sociedade, agora a analisa, tomando suas decisões baseadas no estado do grupo. Com um simples conjunto de regras If-Then, a decisão de que missão escolher se torna fácil para o Mestre do Jogo, assim, todo o modelo BDI de racionalização foi cortada. Ele também ganhou um novo papel, o de criador e delegador de quests, as atribuindo à um agente do mundo escolhido por ele. A idéia de “história” foi modificada, na nova arquitetura a história de uma sociedade é formada por um conjunto de missões. A história, antes um atributo textual, se tornou um conceito, que é representado pela união das missões que o player terá de completar, sendo a nova “história” desenvolvida no decorrer do jogo. Figura 5.2: A arquitetura final do C.H.R.I.A. 37 5.2 Caso de uso - Re:CHRIA Com a finalização da arquitetura do projeto C.H.R.I.A., os estudos e o desenvolvimento do caso de uso foi iniciado. O próximo passo foi implementar toda a idéia do modelo em um mini-jogo, simulando uma parte de um jogo real e misturando com as idéias do projeto, provando a validade do C.H.R.I.A. Para desenvolver a implementação foi decidido que a base seria um MUD, só que somente para um jogador. Foi implementado na linguagem Java 5, no ambiente Eclipse. O caso de uso se chama Re:CHRIA, inspirado no conceito de recriar e reproduzir a idéia inicial. As especificações, pensadas no início da criação do aventure de texto foram as seguintes: deve existir um mundo onde o jogador possa andar e interagir com a sociedade; deve existir, não só agentes inteligentes, mas também agentes nãoracionais e inimigos; o jogador pode entrar e sair das “salas” quando quiser, as “salas” neste caso, são como regiões da cidade que o player se encontra; devem existir itens à disponibilidade do jogador; comandos variados que possam ser inseridos para a interação do usuário; as quests são mais genéricas possíveis, tendo um mandatário, um local, um tipo, uma condição final para completar e uma recompensa; o jogador tem uma lista de missões e de itens; e os agentes tem personalidades próprias. Nas próximas seções são explicadas detalhadamente cada uma das partes que compõe o Re:CHRIA. 5.2.1 Game O Game é o responsável pela lógica principal do Re:CHRIA, ele usa um parser programa que subdivide uma entrada (input) para que um outro possa atuar sobre ela - e obtém o comando digitado pelo player. Após essa obtenção, o jogo verifica o tipo de comando e o processa. E isto se repete infinitamente. O World e o GM estão contidos dentro do Game. O Game foi baseado no código do Zork criado por Michael Kölling [23], programador e professor da Universidade de Kent. O jogo consegue processar os seguintes comandos: “go”, “talk”, “get”, “use”, “give”, “inventory”, “fight”, “describe”, “help” e “quit”. Cada um destes de uma maneira única. O comando “help” imprime uma mensagem de ajuda na tela, informando ao 38 jogador os comandos disponíveis em caso de esquecimento. O comando “quit” acaba o jogo. A ordem “talk” permite ao jogador colocar mais um nome após o comando, por exemplo talk João, se o “João” for uma entidade válida no jogo, um diálogo do João com o jogador terá início. O player tem a possibilidade de falar com um Enemy (inimigo), um Agent (agente inteligente) ou uma Store (loja). O comando “get” dá a possibilidade do usuário de obter algum item. Como o “talk”, o “get” deve ser usado em conjunto com uma segunda palavra, como get medicine. O jogador pode usar este comando para Item, Enemy (obter um item de um inimigo) ou Store (obter o item existente na loja). A palavra “use”, seguida do nome de um Item permite ao jogador utilizar aquele item. Assim como o comando “describe” lhe concede a descrição do item escolhido. A ordem “give” é um pouco delicada, a palavra que segue o comando não deve ser o nome do Item que deseja ser entregue e sim o nome do Agent a quem deseja entregar um item. O agente perceberá automaticamente qual item ele necessita e assim o obterá do jogador. Por exemplo, give João, entregará ao “João” o item necessário, desde que o jogador o possua. O comando “combat” pode ser usado para entrar em combate com um Enemy, Agent ou Item. Já o comando “inventory” exibe na tela os itens que o jogador possui. E finalmente a palavra reservada “go” possibilita o usuário ir para outras Rooms ou entrar em uma Store. Nem todas as salas estão interligadas, existe um caminho disponível, e algumas lojas só existem em salas específicas. O Game ainda possui uma Thread (linha de execução) separada, que executa a BDI dos agentes e a análise do Game Master a cada 5 segundos. Ou seja, em diferentes intervalos de tempo os agentes agem modificando a sociedade e o GM analisa-a. 5.2.2 World O World é a sociedade, o lugar que contém todos os Agents, Enemies, Items, Rooms e Stores. Além do elemento vital da sociedade, as Features, que para demonstração somente três foram criadas: Peacefulness (pacificidade), Happiness (felici- 39 dade) e Life Condition (condição de vida). Na criação do mundo, os atributos da sociedade são criados, assim como todos os objetos nela contidos. O World ainda tem uma função especial, que é modificar os valores da sociedade com base nas ações dos agentes. Como vai ser explicado na parte de Agent e BDI, as features só alteram quando todos os agentes agirem. 5.2.3 Player O Player é responsável pela interação do usuário com a sociedade e o mundo. Ele possui uma lista de Quests e Items, conhecido como inventário. 5.2.4 BDI A BDI, utilizando o FuzzyF [21], é responsável pela racionalização dos agentes. Ela processa a lógica difusa com o BDI e retorna ao agente qual a ação feita por ele e o quanto esta ação irá influenciar a sociedade. A função de criação do BDI é carregar o domínio difuso, utilizando as classes do FuzzyF, passando como arquivo de domínio, o nome especificado na criação do agente que possui esta BDI. O BDI também possui uma função para processar o arquivo de domínio que foi carregado. Os parâmetros para as variáveis de entrada do FuzzyF são as features da sociedade, já previamente modificadas pelo agente possuidor da BDI (como será explicado na subseção sobre os Agents). Então o BDI é ativado recebendo como parâmetro de saída um vetor de ações. O arquivo do FuzzyF que contém a BDI é assim descrito: a parte superior do arquivo contém as definições gerais, como nome do domínio, descrição, modelo de inferênia e método das regras de agregação; após isto são descritas as variáveis de entrada, que são os atributos da sociedade - Peacefulness, Happiness e Life Condition, com seus níveis definidos, por exemplo, “pouca” pacificidade chama-se Rage e ocorre quando o nível de Peacefulness está entre 0 e 25, sendo 0 “máximo” Rage e 25 “mínimo”. Da mesma forma quando a felicidade é “maior que a média”, chama-se Happy que tem seu “máximo” no nível 75, porém, os “mínimos” deste estão em 50 e 100, adotando uma função triangular. Essas variáveis são iguais para todos os agentes, não importando a personalidade deles. Seguindo as variáveis de entrada, as variáveis intermediárias têm início. Diferente 40 das de entrada, estas variáveis são divididas pelas ações e cada uma contém seus níveis definidos como anteriormente, porém essas entradas são diferentes dependendo da personalidade do agente, por exemplo um agente “Pacífico”, crê que “Matar” é “errado” entre 0 (máximo) e 80 (mínimo), e crê que “Matar” é “certo” somente entre 80 (mínimo) e 100 (máximo), ao mesmo tempo que um agente com personalidade agressiva é justamente o contrário. As primeiras variáveis intermediárias são as de Beliefs, que sempre começa com “About”, simbolizando o que o agente acha sobre este conceito. Por exemplo a crença “About_Fight”, assim como as outras crenças, tem valores definidos como “Wrong”, “Neutral” e “Right”. As crenças são seguidas pelos Desires, que iniciam com a palavra “Want” (“Want_Party” ou “Want_DoDrugs”) com valores de “No”, “Sometimes” e “Yes”. E por último as Intentions, que simbolizam uma vontade a ser cumprida, inicia com “To” - “To_Steal” ou “To_Teach” - que tem como valores “No”, “Doubt” e “Yes”. As variáveis de saída do FuzzyF são as ações propriamente ditas. Além dos nomes (Kill, Clean, Relax, ...), as “OUTPUT_VAR” ainda contém o método de defuzzificação, que no caso é centro de gravidade (o método mais comum e utilizado [22]), e também os valores definidos: “Weak”, “Medium” e “Strong”. Assim como as variáveis intermediárias, os valores das definições mudam de acordo com a personalidade de cada agente. Por último, no arquivo são descritas as regras de cada ação, utilizando regras IF-THEN, por exemplo uma das regras da ação “Kill” é se a crença de matar (“About_Kill”) é “Right” e o nível de Peacefullness é “Agressive” então a intenção de matar (“Want_Kill”) é “Yes”. No Apêndice A existe um exemplo detalhado de um arquivo de domínio do FuzzyF utilizado no projeto. Após receber o vetor de ações com seus devidos valores, o BDI faz o tratamento das ações. O primeiro passo do tratamento é descobrir qual a ação escolhida pelo agente, ou seja, a que teve o maior número no valor “Strong” da variável de saída da ação. Para descobrir realmente qual é a ação e o quanto ela influencia na sociedade, é utilizada uma classe “Enum” chamada BasicActions, contendo todas as ações, e cada action contém um nome, o índice dela (na mesma ordem de saída das ações 41 da lógica difusa) e o quanto ela influencia nas três features da sociedade. Assim, o BDI faz uma busca nesta classe, comparando o número da ação escolhida e o índice do conjuto de ações. Uma vez descoberto realmente qual a ação feita pelo agente, o BDI obtém os valores que aquela ação mudaria na sociedade e passa para o World. Os valores variam entre “-5”, “-2” e“-1” para ações negativas, “0” para ações neutras e “+1”, “+2” e “+5” para positivas. O mundo guarda estes valores, e espera todos os agentes agirem. Quando todos os agentes agiram, ele pega estes valores, calcula o produto final e modifica as features de acordo com este valores. Foi optado por somente modificar a sociedade quando todos agentes tivessem agido. Caso contrário quando um agente fosse começar a inferir os valores já teria mudado e assim ele teria utilizado atributos desatualizados para a racionalização, acarretando em tomadas de decisões incorretas. 5.2.5 GameMaster O papel do GameMaster no Re:CHRIA é essencial para a criação de quests. O GM analisa as features da sociedade e decide qual o tipo de missão correta para o tipo de sociedade e entrega para o agente que ele julgar correto. Toda esta heurística é feita por meio de um sistema baseado em regras If-Then. Para analisar a sociedade o GM obtém os valores das features existentes e compara cada um desses atributos. O GM possui um vetor chamado “society status” que serve para definir como está a sociedade no momento da análise. Para preencher este vetor ele compara cada um dos atributos da seguinte forma: se o atributo tiver valor menor que “30”, aquele status é negativo (“Agressive”, “Unhappy” ou “Poor”); se o valor estiver entre os números “30” e “70”, o status é médio (“Netrual”, “Indifferent” ou “Medium”); e é positivo quando o valor for maior que “70” (“Pacific”, “Happy” ou “Rich”). Preenchido o vetor (podendo conter 27 combinações diferentes) o GM verifica qual a combinação do momento e dependendo dela, decide qual o tipo de Quest será criada, entre “Retrieve”, “Defeat” ou “Message”. Existe uma prioridade para estas três, o fator Peacefullness pesa mais nas decisões do que o Life Condition, que por sua vez tem mais prioridade que o atributo Happiness. O tipo “Defeat” é esco- 42 lhido sempre quando a sociedade é “Agressive”, não importando os outros atributos. Quando a sociedade não for agressiva, mas for “Poor”, o tipo “Retrieve” é esco-lhido independente dos outros status. Se a sociedade não é agressiva e nem pobre, e for “Unhappy”, o GM decide pelo tipo “Message”, e quando não é nenhum dos três, mas for de Peacefullness “Neutral” ele decide também por “Defeat”, seguindo a prioridade. Continuando nesta lógica, se o menor valor de atributo for “Medium”, “Retrieve” se torna o tipo da missão e então, sendo “Indifferent” o menor, ele decide por “Message”. Por último, quando todos os status forem iguais e positivos, existe uma exceção na regra que obriga o GM a escolher o tipo “Message”. Esta regra foi escolhida, pois “Message” é o tipo de missão que menos influencia na sociedade, não utilizando um item (como o “Retrieve”) ou eliminando um inimigo (como o “Defeat”). Após a escolha do tipo de missão o GM define o mandatário. Para isto, ele utiliza o tipo que foi definido anteriormente e compara com a personalidade dos agentes que será explicado detalhadamente na próxima subseção - contidos na lista de Agents do World. Por exemplo, se o tipo de quest foi “Defeat”, o agente que possui o atributo de personalidade “PersonalityAgressive” menor é escolhido como mandatário para a missão. O tipo “Retrieve” está associado ao “PersonalityLifeCondition” menor e o a quest de “Message” é associada ao mais baixo “PersonalityHappiness”. Como definido anteriormente, um agente só poderia ter uma missão para entregar para o player por vez, então se o mandatário já possuir uma quest, o agente que tiver o segudo valor mais baixo de personalidade daquele atributo é escolhido e assim sucessivamente. Se todos os agentes daquela personalidade tiverem uma missão, o processo de criação de quest é interrompido e o GM espera uma nova mudança nas features da sociedade para começar um novo processo. Se o mandatário for definido com sucesso, uma FinalCondition (FC) é escolhida. Este atributo é relativo ao elemento que o jogador precisa interagir para completar a missão, podendo ser um agente, um inimigo ou um item. Como na escolha do mandatário, a escolha da condição final depende do tipo de quest. Sendo “Retrieve” o FC deve ser um item, que é sorteado da lista de itens ativos presentes no World. O tipo “Defeat” impõe que o FC seja um inimigo, que também é sorteado de todos os inimigos ativos do mundo e no tipo “Message” o alvo da FC é um agente, que 43 também deve estar ativo e presente no mundo. Por último, para definir a recompensa, o GM sorteia uma da lista de recompensas existentes no mundo (diferentes da lista de itens) e define aquela como sendo a da quest. Após isto o GM envia estes dados para o QuestManager que cria a missão e a entrega para o mandatário. Como explicado na seção de arquitetura, o GM não criará mais histórias, a história do mundo se tornou um conceito representado pelo conjunto de todas as missões que o jogador completar e completará no decorrer do jogo, não existindo uma história fixa, se tornando variável com o desenrolar da aventura. 5.2.6 Agent Os Agents possuem alguns atributos variáveis, como nome e lugar onde está no mundo. Além disso, cada agente tem uma personalidade e um arquivo de BDI. Para processar o BDI os agentes modificam os valores da sociedade com seus atributos, criando um processo de pensamento diferente de agentes com personalidades diferentes. Possui o atributo “active”, que define se ainda está ativo no mundo ou não, podendo ou não ser utilizado para quests. Na criação de cada agente, feita no World, é necessário que os agentes possuam três variáveis de personalidade: uma “PersonalityPeaceful”, classe Enum que contém três tipos: UNFRIENDLY, NEUTRAL e FRIENDLY ; uma “PersonalityHappy”, classe Enum que também possui três tipos: UNHAPPY, NORMAL e HAPPY ; e uma “PersonalityLifeCondition”, outra classe Enum que pode ser POOR, MEDIUM e RICH. Cada uma dessas personalidades possui um valor associado, as negativas valem “-10”, as neutras “0” e as positivas “+10”. Assim, quando o agente vai processar sua BDI, explicado anteriormente, ele obtém do World os atributos da sociedade, modifica esses números com os valores da sua personalidade e passa para a BDI. A modificação só vale para cada agente, não influenciando outros diretamente. Por exemplo, um agente que tem a personalidade relacionada com a felicidade com valor FRIENDLY e uma sociedade com feature de Happiness “40”, vai transformar o valor do atributo de Happiness para “50” e então começar o processo de BDI com o novo valor, que só vai valer para este agente. 44 O QuestAgent estende um Agent, porém ele é o agente que possui as quests para entregar para o jogador, um NPC. O NPC, além das mesmas características dos agentes, possuí um diálogo, uma descrição quando recebe um item e uma descrição de combate. Estes atributos são lidos de um arquivo de texto externo. 5.2.7 Enemy O EnemyAgent também estende um Agent, e possui um diálogo, descrição de obter um item e descrição de combate. Possui o atributo “active”, que define se ainda está ativo no mundo ou não, podendo ou não ser utilizado para quests. Um inimigo quando é alvo de uma quest, essa quest pode ser completada de dois modos, ou usando o comando “get” para obter o item do inimigo, ou usando “combat” e lutando com o inimigo para conseguir o item. Para fazer um EnemyAgent genérico, foram definidas duas estratégias, uma GetStrategy (que pode ser SimpleGetStrategy ou QuestGetStrategy) e uma CombatStrategy (que pode ser SimpleCombatStrategy ou QuestComabtStrategy), que definem se aquele comando faz parte de uma missão ou não. Assim, na hora da criação do inimigo no World, é definido a estratégia dele. 5.2.8 Room A Room, parte do mundo, possui nome, lugar do mundo, uma descrição e as saídas dela. Por exemplo, um mundo em forma de cruz com 5 salas, a sala norte só tem saída para o sul que dá na sala central, e esta por sua vez tem saída para todos os lados. A Store, que extende uma sala, possui as mesmas características dela, e tem também um diálogo e uma descrição do comando “get”. 5.2.9 Item Os itens são divididos em dois: o Item e o QuestItem. O Item, possui um nome e uma descrição e é um item básico que não pode ser utilizado e nem tem um lugar específico no mundo. Possui o atributo “active”, que define se ainda está ativo no mundo ou não, podendo ou não ser utilizado para quests. Os QuestItem tem uma descrição pro comando “get”, uma para o comando “combat” e uma para o “use”. A classe QuestItem extende um item básico. 45 5.2.10 Quest A Quest é cada missão do jogo e tem alguns atributos: um mandatário, um tipo, uma FinalCondition, uma recompensa e um status. A missão também tem uma descrição e uma mensagem final. O mandatário é o NPC responsável por passar a quest para o jogador; o tipo, baseado no SAI [4], pode ser “Retrieve”, “Defeat” ou “Message”; a FinalCondition é com que elemento o jogador precisa interagir para completar a missão, pode ser um agente, um inimigo ou um item; a recompensa que é um Item; e o status, que pode ser “NOTSTARTED”, “STARTED”, “COMPLETED” ou “FINISHED”. A Quest ainda tem as funções de ativar, completar ou acabar uma missão. Existe ainda o QuestManager que controla a criação de novas quests e adiciona ao jogador a nova missão criada. 5.3 Funcionamento do Re:CHRIA O mundo do Re:CHRIA é composto de cinco salas (centro, norte, sul, leste e oeste), e jogador pode interagir com os objetos de cada sala com comandos. Ao inserir um dos comandos possíveis, uma mensagem é exibida com o efeito causado pela ação do usuário. E assim o jogador vai progredindo no jogo e interagindo com os agentes e o mundo. Na próxima seção será explicada mais detalhadamente o funcionamento do Re:CHRIA. 5.3.1 Detalhes de funcionamento O jogador começa a aventura textual e uma mensagem de boas-vindas é exibida. Logo abaixo uma mensagem mostra explica que ao digitar o comando help a lista de comandos disponíveis aparece, como mostrado na figura 5.3, abaixo. Figura 5.3: Início do Re:CHRIA. 46 Na mesma Figura 5.3, após a introdução, aparece a fala do narador a história, explicando onde o jogador está localizado e a descrição da parte da cidade. No fim do texto aparecem as possíveis saídas do jogador. Ao digitar o comando “help” uma lista aparece com os comandos, como demonstrado na figura 5.4. Figura 5.4: O comando de ajuda e os comandos disponíveis. Para interagir com outras salas do jogo, o jogador deve inserir o comando de ir (“go”) seguido do nome da saída que deseja, por exemplo na figura 5.5, o jogador inseriu o comando “go south” para ir para a parte sul da cidade. Após o comando de ir para outra sala é inserido, e se a saída for válida, a descrição da próxima sala aparece, assim como as saídas disponíveis. (Figura 5.5). Figura 5.5: O comando de “go” e a descrição de uma nova sala Ao observar o texto de cima, pode se perceber que o narrador menciona uma mulher chamada “Catherine”. Para falar com ela deve-se digitar o comando “talk” seguido do nome dela. Após isso aparece a fala dela. Como ela é um npc ela lhe entrega uma quest, que foi previamente feita pelo GM. Você é avisado pelo sistema sobre este fato. (Figura 5.6) A descrição da quest também aparece para o jogador. As frases são geradas randomicamente de um banco de frases, tem uma descrição e no final da frase aparece o item necessario para quest, o inimigo que se deve derrotar ou a pessoa com quem se deve falar. A mensagem de completar a missão funciona do mesmo jeito. Na figura abaixo 5.7, pode-se observar algumas mensagens de início e fim de 47 Figura 5.6: O comando de “talk” e a descrição de uma conversa missões geradas de modo aleatório. O comando “give” entrega a quest para o npc (se todos requisitos estiverem completos) e uma das mensagens abaixo aparece. Figura 5.7: Algumas mensagens de início e fim de missões. Um outro comando possível para interagir com os agentes é de “fight” (Figura 5.8), este comando também pode ser usado para atacar monstros no cenário, como pode ser visto na figura 5.9. Note que neste figura o jogador também recebe um item de uma missão por ter derrotado o inimigo. Figura 5.8: Atacando um NPC (agente). Para ver os itens que o jogador possui, basta inserir o comando “inventory”. Uma lista com os itens que o jogador obteve aparece na tela. Para se obter a descrição 48 Figura 5.9: Atacando um inimigo. de qualquer um desses itens bastante escrever “describe” e o nome do item. (Figura 5.10) Figura 5.10: O inventário do jogador e a descrição de itens obtidos. Existes salas especiais, que no jogo são conhecidas como “Stores”. Você pode interagir com elas usando o comando “go”, assim como as salas, usando um comando “talk” para falar com alguém dentro da “Store” ou ainda usar um comando “get” para obter um item. (Figura 5.11) Para se obter um item existente no mundo, deve usar o comando “get” e o nome do assim, assim uma descrição de sua ação aparece seguida da confirmação do item em seu inventário. O jogador ainda pode “fight” com o item e “use” ele, esses dois no caso são somente descrições de acontecimentos e não tem influência no jogo. A utilização dos comandos pode ser vista na figura 5.12. Ao mesmo tempo que o player interage com o jogo, a inteligência artifical dos agentes, a BDI, acontece em paralelo a cada 5 segundos, como explicado na seção a seguir. 49 Figura 5.11: A interação com uma loja (Store). Figura 5.12: Interagindo com itens, “get” e “use”. 5.3.2 Detalhes do funcionamento da BDI A cada 5 segundos o sistema de BDI dos agentes é ativado, modificando as features da sociedade, então o GM analisa estas mudanças e cria uma quest dependendo das modificações dos agentes. Na figura 5.13 é exibida um pequeno log da sequência das ações dos agentes. Aparece as ações feitas, como ficou os valores da sociedade e como está a sociedade atual. Na Figura 5.14 pode ser percebida as oscilações na sociedade e também nota-se que estas mudanças são controladas e não randômicas. Para gerar esta Figura 5.14, os agentes tinham personalidades que se compensavam. Para criar a Figura 5.15 um 50 Figura 5.13: A sequência das ações dos agentes. dos agentes, que tinha personalidade “Happy e Friendly” foi trocado para “Unhappy e Unfriendly” e a sociedade teve diferentes oscilações se comparada com à anterior. Se todos os agentes tiverem a mesma personalidade, a sociedade tende a não ser modificada depois de um espaço tempo, ficando com atributos constantes. Figura 5.14: Oscilações da sociedade no Re:CHRIA. 51 Figura 5.15: Oscilações da sociedade no Re:CHRIA. 5.3.3 Fator computacional O Re:CHRIA não apresenta grande consumo de memória e nem de processamento, porém deve-se considerar o fato de que existem poucos agentes inteligentes no mundo e que existem poucas variações de personalidade entre os agentes. Aumenando na casa de milhares estes números, a solução começa a ficar inviável para alguns jogos mais simples e que tem como objetivo rodar em máquinas mais modestas. Um dos fatores que levam a isto é que cada arquivo de BDI demora mais de uma hora para ser desenvolvido e é muito grande. O processamento desses arquivos é feito rapidamente pelos métodos de defuzzificação, porém se existirem milhares destes arquivos este processo não será rápido, ainda mais se isto deve ocorrer a cada 5 segundos, como no caso do Re:CHRIA. Uma solução seria colocar o raciocínio da BDI somente em alguns agentes-chave e mais importante para a continuidade do jogo, podendo assim manter o número de processamentos menor e tão constante quanto antes. 52 6 CONCLUSÃO Com base nos estudos realizados foi permitido propor uma metodologia para melhorar a qualidade dos CRPGs, assim como aumentar o interesse e a fidelidade dos jogadores para com o jogo. Analisando e testando as últimas novidades em games do gênero RPG, percebeuse uma necessidade prática de contornar um problema que ocorreu nestes jogos. O fato de um player perder o interesse rapidamente em um game, mesmo que este jogo tenha várias horas de duração. As missões e histórias secundárias são repetitivas e não-inteligentes, parecendo apenas mais uma missão para contar no tempo de jogo, e não um desafio real ao jogador. Isto gera desinteresse e falta de fidelidade com o jogo. Acredita-se que indústria de jogos cresceria ainda mais se a variedade das sidequests e histórias secundárias fossem levadas em conta na hora do desenvolvimento de um game. Com este conceito sendo considerado, os desenvolvedores de jogos criariam uma nova era de jogadores mais interessados e mais fiéis aos jogos. As exceções nos games atuais, que mantém os jogadores fiéis e que mais “viciam”, são os MMORPGs, jogos que não tem objetivos delimitados, possibilitando a interação do player com outros jogadores ao redor do mundo, aumentando em muito as possibilidades e limitações do jogo. Provavelmente este aspecto dos jogos de RPG já tenha sido explorado por desenvolvedores e talvez seja de interesse comercial que este problema não seja solucionado. Imagine que um jogo, toda vez que um for jogado, seja diferente? Isto geraria um game com inúmeras possibilidades, tornando-o muito atrativo. Aplicando o projeto C.H.R.I.A. para criar o Re:CHRIA, percebeu-se que o problema analisado pode ser contornado, mesmo com um número limitado de agentes 53 no mundo, de personalidades, de BDIs, de ações a serem feitas, de features da sociedade, de itens, de inimigos e de salas. As missões criadas foram mais inteligentes, diversificadas e “reais” que o normal, sendo fiéis ao status atual da sociedade e dos agentes existentes. A contribuição deste projeto está em trazer o ineditismo ao jogo, um fator “x”, no qual o jogador não sabe o que vai acontecer nas histórias e nas missões que terá que fazer. Esta novidade constante pode motivar o player a explorar o jogo ao máximo para conhecer todas situação e prender a atenção dele por mais tempo, pois sempre acontecerá algo diferente do que aconteceu anteriormente. Por outro lado, esta mudança talvez seja muito radical e extrema, podendo causar o efeito oposto aos jogadores, levando-os a desistir do jogo, pois não conseguem prever o que vai acontecer. Muitos jogadores gostam de se sentir seguros com um jogo, sabendo o que vai acontecer na sequência e como que a situação perante eles pode ser lidada. Com o término deste trabalho, algumas idéias foram deixadas para o futuro. A primeira é aumentar consideravelmente o número de todos os fatores do Re:CHRIA, otimizando ainda mais a solução do problema, pois aumentaria a variabilidade de quests e tornaria os agentes mais diversificados. Outra melhoria para o futuro, é o fato de que o player, após completar ou falhar na missão influenciará de forma positiva ou negativa, dependendo do sucesso da mesma, os atributos da sociedade. Esta idéia tornará ainda mais real a criação de missões e racionalização dos agentes, pois se uma missão foi feita que deixou a sociedade mais rica, então as idéias dos agentes sofrerão influencias. Um modo gráfico também pode ser implementado, onde o usuário escolhe facilmente as personalidades dos agentes e os valores dos atributos da sociedade para iniciar o jogo. O usuário poderia ainda escolher quantas features e quais (dentro de uma lista de pré-determinadas) a sociedade terá e qual será o tamanho do mundo. Por último, o futuro ideal deste projeto é testar se o projeto é de fácil implementação em um jogo já existente, ao mesmo tempo em que se observa se os resultados obtidos com o Re:CHRIA, também são obtidos com um jogo real. 54 REFERÊNCIAS [1] WOOLDRIDGE, M. Reasoning About Rational Agents. Cambridge, Massachusetts, Estados Unidos: The MIT Press, 2000. ISBN 0-262-23213-8. [2] PEDROSO, F. S. Virtual Dungeon Master - Um Narrador Inteligente de Quests para Role-Playing Games. Dissertação (Mestrado) — Trabalho de Conclusão de Jogos Digitais - Universidade do Vale do Rio dos Sinos, dez. 2007. [3] Wizards of the Coast. Http://www.wizards.com/DND/. Dungeons & Dragons. 2008. [4] FILHO, V.; COBBI, B. SAI Sistema de Aventuras Instantâneas. 2002. Royal Hunter. Disponível em: http://www.rederpg.com.br/portal/modules/news/article.php?storyid=573. [5] FIELD, S. Manual do Roteiro - Os Fundamentos do Texto Cinematográfico. Rio de Janeiro, Brasil: Editora Objetiva, 2001. ISBN 85-7302-044-X. [6] VOGLER, C. A Jornada do Escritor. Rio de Janeiro, Brasil: Ampersand Ed., 1997. ISBN 85-86135-02-X. [7] Obsidian Entertainment. Http://www.obsidianent.com/. Neverwinter Nights [8] Bethesda Softworks. The Http://www.bethsoft.com/. Elder IV: Scroll II. Oblivion. out. mar. 2006. 2006. [9] Blizzard Entertainment. Diablo II. jun. 2000. Http://www.blizzard.com/us/. [10] Square Enix Holdings. Final Fantasy Tactics A2: Grimoire of the Rift. jun. 2008. Http://www.square-enix.com/na/. [11] POOLE, D.; MACKWORTH, A.; GOEBEL, R. Computational Intelligence: A Logical Approach. New York, Estados Unidos: Oxford University Press, 1998. [12] MCCARTHY, J. What is Artificial Intelligence? formal.stanford.edu/jmc/whatisai/whatisai.html. nov. 2007. Http://www- [13] BITTENCOURT, J. R. Ambiente para Simulação de Múltiplos Agentes Autônomos, Cooperativos e Competitivos. Dissertação (Mestrado) — Trabalho de Conclusão - Universidade do Vale do Rio dos Sinos, jun. 2002. 55 [14] FAGUNDES, M. Um Ambiente para Desenvolvimento de Agentes BDI. Dissertação (Mestrado) — Trabalho de Conclusão de Ciências da Computação Universidade Federal de Pelotas, set. 2004. [15] BRATMAN, M. E. Intention, Plans and Practical Reason. Stanford, California, Estados Unidos: CSLI Publications, 1999. ISBN 1-57586-192-5. [16] Stanford Encyclopedia of Philosophy. Fuzzy Logic. Stanford, California, Estados Unidos: Stanford University, 2006. [17] WILKINSON, R. H. A Method of Generating Functions of Several Variables Using Analog Diode Logic. Dissertação (Mestrado) — Institute of Electrical and Electronic Engineers, 1963. [18] ZADEH, L. A. Fuzzy Sets. Estados Unidos da América: Information and Control, 1965. 8:338-353. [19] ZADEH, L. A. The Calculus of Fuzzy If-Then Rules. Estados Unidos da América: AI Expert, 1992. 7:23-27. [20] EBERHART, R.; SIMPSON, P.; DOBBINS, R. Computational Intelligence PC Tool. Boston, Massachusetts, Estados Unidos: AP Professional, 1996. 464p. [21] BITTENCOURT, J. R. FuzzyF - Fuzzy Logic Framework. jul. 1999. Atualizado em Junho de 2006. Disponível em http://www.inf.unisinos.br/ jrbitt/fuzzyf. [22] BITTENCOURT, J. R.; OSóRIO, F. S. Fuzzy logic framework: Uma solução software livre para o desenvolvimento, ensino e pesquisa de aplicações de inteligência artificial multiplataforma. III Workshop sobre Software Livre, 2002. [23] KöLLING, M. Zork 1 - Exercise part of the BlueJ interactive environment. 2008. Http://www.bluej.org/resources/exercises.html. 56 APÊNDICE A - BDI DE UM AGENTE # BDI Fuzzy # Thomas Caleffi Scaletscky # "C.H.R.I.A." # UNISINOS, 2008 #General definitions DEFINITIONS #Domain name DOMAIN_NAME=AgentBDI #Short description DESCRIPTION=This domain controls the BDI of a Friendly Happy Medium agent #Author name AUTHOR_NAME=Thomas #Inferency model MAMDANI_RULE_MODEL #Method for aggregation rules AGGREGATION_MIN #Finish definitions END_DEF #Variable definitions #Aggressiveness INPUT_VAR = Aggressiveness TERM = Rage LeftTriangleFunction 0 25 TERM = Aggressive TriangularFunction 0 25 50 TERM = Neutral TriangularFunction 25 50 75 TERM = Calm TriangularFunction 50 75 100 TERM = Pacific RigthTriangleFunction 75 100 END_VAR 57 #Happiness INPUT_VAR = Happiness TERM = Depressed LeftTriangleFunction 0 25 TERM = Unhappy TriangularFunction 0 25 50 TERM = Indifferent TriangularFunction 25 50 75 TERM = Happy TriangularFunction 50 75 100 TERM = Radiant RigthTriangleFunction 75 100 END_VAR #LifeCondition INPUT_VAR = LifeCondition TERM = Miserable LeftTriangleFunction 0 10 TERM = Poor TriangularFunction 0 10 50 TERM = Medium TriangularFunction 25 50 75 TERM = Rich TriangularFunction 50 90 100 TERM = Elite RigthTriangleFunction 90 100 END_VAR #Beliefs #Aggressiveness MIDDLE_VAR = About_Kill TERM = Wrong LeftTriangleFunction 0 80 TERM = Neutral TrapezoidalFunction 40 65 85 100 TERM = Right RigthTriangleFunction 80 100 END_VAR MIDDLE_VAR = About_Steal TERM = Wrong LeftTriangleFunction 0 70 TERM = Neutral TrapezoidalFunction 20 40 80 100 TERM = Right RigthTriangleFunction 70 100 END_VAR MIDDLE_VAR = About_Fight TERM = Wrong LeftTriangleFunction 0 60 TERM = Neutral TrapezoidalFunction 10 40 70 100 TERM = Right RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = About_Rest TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR 58 MIDDLE_VAR = About_Apologize TERM = Wrong LeftTriangleFunction 0 40 TERM = Neutral TrapezoidalFunction 0 30 60 90 TERM = Right RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = About_Relax TERM = Wrong LeftTriangleFunction 0 30 TERM = Neutral TrapezoidalFunction 0 20 60 80 TERM = Right RigthTriangleFunction 30 100 END_VAR MIDDLE_VAR = About_Soothe TERM = Wrong LeftTriangleFunction 0 20 TERM = Neutral TrapezoidalFunction 0 15 45 60 TERM = Right RigthTriangleFunction 20 100 END_VAR #Happiness MIDDLE_VAR = About_Depress TERM = Wrong LeftTriangleFunction 0 80 TERM = Neutral TrapezoidalFunction 40 65 85 100 TERM = Right RigthTriangleFunction 80 100 END_VAR MIDDLE_VAR = About_Dumped TERM = Wrong LeftTriangleFunction 0 70 TERM = Neutral TrapezoidalFunction 20 40 80 100 TERM = Right RigthTriangleFunction 70 100 END_VAR MIDDLE_VAR = About_Spoil TERM = Wrong LeftTriangleFunction 0 60 TERM = Neutral TrapezoidalFunction 10 40 70 100 TERM = Right RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = About_Chat TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Party TERM = Wrong LeftTriangleFunction 0 40 TERM = Neutral TrapezoidalFunction 0 30 60 90 TERM = Right RigthTriangleFunction 40 100 59 END_VAR MIDDLE_VAR = About_Sex TERM = Wrong LeftTriangleFunction 0 30 TERM = Neutral TrapezoidalFunction 0 20 60 80 TERM = Right RigthTriangleFunction 30 100 END_VAR MIDDLE_VAR = About_Rejoice TERM = Wrong LeftTriangleFunction 0 20 TERM = Neutral TrapezoidalFunction 0 15 45 60 TERM = Right RigthTriangleFunction 20 100 END_VAR #LifeCondition MIDDLE_VAR = About_Pollute TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Broke TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_DoDrugs TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Clean TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Teach TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Donate TERM = Wrong LeftTriangleFunction 0 55 60 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = About_Preserve TERM = Wrong LeftTriangleFunction 0 55 TERM = Neutral TrapezoidalFunction 0 25 50 100 TERM = Right RigthTriangleFunction 45 100 END_VAR #Desires #Aggressiveness MIDDLE_VAR = Want_Kill TERM = No LeftTriangleFunction 0 80 TERM = Sometimes TrapezoidalFunction 40 65 85 100 TERM = Yes RigthTriangleFunction 80 100 END_VAR MIDDLE_VAR = Want_Steal TERM = No LeftTriangleFunction 0 70 TERM = Sometimes TrapezoidalFunction 20 40 80 100 TERM = Yes RigthTriangleFunction 70 100 END_VAR MIDDLE_VAR = Want_Fight TERM = No LeftTriangleFunction 0 60 TERM = Sometimes TrapezoidalFunction 10 40 70 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = Want_Rest TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Apologize TERM = No LeftTriangleFunction 0 40 TERM = Sometimes TrapezoidalFunction 0 30 60 90 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = Want_Relax TERM = No LeftTriangleFunction 0 30 TERM = Sometimes TrapezoidalFunction 0 20 60 80 TERM = Yes RigthTriangleFunction 30 100 61 END_VAR MIDDLE_VAR = Want_Soothe TERM = No LeftTriangleFunction 0 20 TERM = Sometimes TrapezoidalFunction 0 15 45 60 TERM = Yes RigthTriangleFunction 20 100 END_VAR #Happiness MIDDLE_VAR = Want_Depress TERM = No LeftTriangleFunction 0 80 TERM = Sometimes TrapezoidalFunction 40 65 85 100 TERM = Yes RigthTriangleFunction 80 100 END_VAR MIDDLE_VAR = Want_Dumped TERM = No LeftTriangleFunction 0 70 TERM = Sometimes TrapezoidalFunction 20 40 80 100 TERM = Yes RigthTriangleFunction 70 100 END_VAR MIDDLE_VAR = Want_Spoil TERM = No LeftTriangleFunction 0 60 TERM = Sometimes TrapezoidalFunction 10 40 70 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = Want_Chat TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Party TERM = No LeftTriangleFunction 0 40 TERM = Sometimes TrapezoidalFunction 0 30 60 90 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = Want_Sex TERM = No LeftTriangleFunction 0 30 TERM = Sometimes TrapezoidalFunction 0 20 60 80 TERM = Yes RigthTriangleFunction 30 100 END_VAR MIDDLE_VAR = Want_Rejoice TERM = No LeftTriangleFunction 0 20 62 TERM = Sometimes TrapezoidalFunction 0 15 45 60 TERM = Yes RigthTriangleFunction 20 100 END_VAR #LifeCondition MIDDLE_VAR = Want_Pollute TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Broke TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_DoDrugs TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Clean TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Teach TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Donate TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = Want_Preserve TERM = No LeftTriangleFunction 0 55 TERM = Sometimes TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR 63 #Intentions #Aggressiveness MIDDLE_VAR = To_Kill TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Steal TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Fight TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Rest TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Apologize TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = To_Relax TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = To_Soothe TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR 64 #Happiness MIDDLE_VAR = To_Depress TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Dumped TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Spoil TERM = No LeftTriangleFunction 0 60 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 60 100 END_VAR MIDDLE_VAR = To_Chat TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Party TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = To_Sex TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR MIDDLE_VAR = To_Rejoice TERM = No LeftTriangleFunction 0 40 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 40 100 END_VAR #LifeCondition MIDDLE_VAR = To_Pollute TERM = No LeftTriangleFunction 0 55 65 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Broke TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_DoDrugs TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Clean TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Teach TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Donate TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR MIDDLE_VAR = To_Preserve TERM = No LeftTriangleFunction 0 55 TERM = Doubt TrapezoidalFunction 0 25 50 100 TERM = Yes RigthTriangleFunction 45 100 END_VAR #Actions (21) #Aggressiveness OUTPUT_VAR = Kill DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 66 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Steal DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Fight DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Rest DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Apologize DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR OUTPUT_VAR = Relax DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR OUTPUT_VAR = Soothe DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR #Happiness OUTPUT_VAR = Depress 67 DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Dumped DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Spoil DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 60 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 60 100 END_VAR OUTPUT_VAR = Chat DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Party DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR OUTPUT_VAR = Sex DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR OUTPUT_VAR = Rejoice DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 40 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 40 100 END_VAR 68 #LifeCondition OUTPUT_VAR = Pollute DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Broke DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = DoDrugs DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Clean DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Teach DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Donate DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 TERM = Strong RigthTriangleFunction 45 100 END_VAR OUTPUT_VAR = Preserve DEFUZZ = CenterOfGravity TERM = Weak LeftTriangleFunction 0 55 TERM = Medium TriangularFunction 0 50 100 69 TERM = Strong RigthTriangleFunction 45 100 END_VAR #Rules defintions #Agressiveness RULES #KILL rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Kill IS Right RL = IF Aggressiveness IS Aggressive THEN About_Kill IS Right RL = IF Aggressiveness IS Aggressive THEN About_Kill IS Neutral RL = IF Aggressiveness IS Neutral THEN About_Kill IS Neutral RL = IF Aggressiveness IS Calm THEN About_Kill IS Neutral RL = IF Aggressiveness IS Calm THEN About_Kill IS Wrong RL = IF Aggressiveness IS Pacific THEN About_Kill IS Wrong RL = IF About_Kill IS Right AND Aggressiveness IS Rage THEN Want_Kill IS Yes RL = IF About_Kill IS Right AND Aggressiveness IS Aggressive THEN Want_Kill IS Yes RL = IF About_Kill IS Right AND Aggressiveness IS Aggressive THEN Want_Kill IS Sometimes RL = IF About_Kill IS Right AND Aggressiveness IS Neutral THEN Want_Kill IS Sometimes RL = IF About_Kill IS Neutral AND Aggressiveness IS Aggressive THEN Want_Kill IS Yes RL = IF About_Kill IS Neutral AND Aggressiveness IS Aggressive THEN Want_Kill IS Sometimes RL = IF About_Kill IS Neutral AND Aggressiveness IS Neutral THEN Want_Kill IS Sometimes RL = IF About_Kill IS Neutral AND Aggressiveness IS Calm THEN Want_Kill IS Sometimes RL = IF About_Kill IS Neutral AND Aggressiveness IS Calm THEN Want_Kill IS No RL = IF About_Kill IS Wrong AND Aggressiveness IS Neutral THEN Want_Kill IS Sometimes RL = IF About_Kill IS Wrong AND Aggressiveness IS Calm THEN Want_Kill IS No RL = IF About_Kill IS Wrong AND Aggressiveness IS Calm THEN Want_Kill IS Sometimes RL = IF About_Kill IS Wrong AND Aggressiveness IS Pacific THEN Want_Kill IS No RL = IF Want_Kill IS Yes THEN To_Kill IS Yes CV = 0.5 RL = IF Want_Kill IS Yes THEN To_Kill IS Doubt RL = IF Want_Kill IS Sometimes THEN To_Kill IS Yes CV = 0.5 RL = IF Want_Kill IS Sometimes THEN To_Kill IS Doubt RL = IF Want_Kill IS Sometimes THEN To_Kill IS No RL = IF Want_Kill IS No THEN To_Kill IS Doubt 70 RL RL RL RL RL RL RL = = = = = = = IF IF IF IF IF IF IF Want_Kill IS No THEN To_Kill IS No Aggressiveness IS Rage THEN Kill IS Weak To_Kill IS Yes THEN Kill IS Strong CV = 0.5 To_Kill IS Yes THEN Kill IS Medium To_Kill IS Doubt THEN Kill IS Medium To_Kill IS No THEN Kill IS Weak Aggressiveness IS Pacific THEN Kill IS Strong #STEAL rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Steal IS Right RL = IF Aggressiveness IS Aggressive THEN About_Steal IS Right RL = IF Aggressiveness IS Aggressive THEN About_Steal IS Neutral RL = IF Aggressiveness IS Neutral THEN About_Steal IS Neutral RL = IF Aggressiveness IS Calm THEN About_Steal IS Neutral RL = IF Aggressiveness IS Calm THEN About_Steal IS Wrong RL = IF Aggressiveness IS Pacific THEN About_Steal IS Wrong RL = IF About_Steal IS Right AND Aggressiveness IS Rage THEN Want_Steal IS Yes RL = IF About_Steal IS Right AND Aggressiveness IS Aggressive THEN Want_Steal IS Yes RL = IF About_Steal IS Right AND Aggressiveness IS Aggressive THEN Want_Steal IS Sometimes RL = IF About_Steal IS Right AND Aggressiveness IS Neutral THEN Want_Steal IS Sometimes RL = IF About_Steal IS Neutral AND Aggressiveness IS Aggressive THEN Want_Steal IS Yes RL = IF About_Steal IS Neutral AND Aggressiveness IS Aggressive THEN Want_Steal IS Sometimes RL = IF About_Steal IS Neutral AND Aggressiveness IS Neutral THEN Want_Steal IS Sometimes RL = IF About_Steal IS Neutral AND Aggressiveness IS Calm THEN Want_Steal IS Sometimes RL = IF About_Steal IS Neutral AND Aggressiveness IS Calm THEN Want_Steal IS No RL = IF About_Steal IS Wrong AND Aggressiveness IS Neutral THEN Want_Steal IS Sometimes RL = IF About_Steal IS Wrong AND Aggressiveness IS Calm THEN Want_Steal IS No RL = IF About_Steal IS Wrong AND Aggressiveness IS Calm THEN Want_Steal IS Sometimes RL = IF About_Steal IS Wrong AND Aggressiveness IS Pacific THEN Want_Steal IS No RL = IF Want_Steal IS Yes THEN To_Steal IS Yes CV = 0.6 RL = IF Want_Steal IS Yes THEN To_Steal IS Doubt RL = IF Want_Steal IS Sometimes THEN To_Steal IS Yes CV = 0.6 RL = IF Want_Steal IS Sometimes THEN To_Steal IS Doubt RL = IF Want_Steal IS Sometimes THEN To_Steal IS No 71 RL RL RL RL RL RL RL RL = = = = = = = = IF IF IF IF IF IF IF IF Want_Steal IS No THEN To_Steal IS Doubt Want_Steal IS No THEN To_Steal IS No Aggressiveness IS Rage THEN Steal IS Weak To_Steal IS Yes THEN Steal IS Strong CV = 0.6 To_Steal IS Yes THEN Steal IS Medium To_Steal IS Doubt THEN Steal IS Medium To_Steal IS No THEN Steal IS Weak Aggressiveness IS Pacific THEN Steal IS Strong #Fight rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Fight IS Right RL = IF Aggressiveness IS Aggressive THEN About_Fight IS Right RL = IF Aggressiveness IS Neutral THEN About_Fight IS Neutral RL = IF Aggressiveness IS Calm THEN About_Fight IS Wrong RL = IF Aggressiveness IS Pacific THEN About_Fight IS Wrong RL = IF About_Fight IS Right AND Aggressiveness IS Rage THEN Want_Fight IS Yes RL = IF About_Fight IS Right AND Aggressiveness IS Aggressive THEN Want_Fight IS Yes RL = IF About_Fight IS Right AND Aggressiveness IS Neutral THEN Want_Fight IS Sometimes RL = IF About_Fight IS Neutral AND Aggressiveness IS Aggressive THEN Want_Fight IS Yes RL = IF About_Fight IS Neutral AND Aggressiveness IS Neutral THEN Want_Fight IS Sometimes RL = IF About_Fight IS Neutral AND Aggressiveness IS Calm THEN Want_Fight IS No RL = IF About_Fight IS Wrong AND Aggressiveness IS Neutral THEN Want_Fight IS Sometimes RL = IF About_Fight IS Wrong AND Aggressiveness IS Calm THEN Want_Fight IS No RL = IF About_Fight IS Wrong AND Aggressiveness IS Pacific THEN Want_Fight IS No RL = IF Want_Fight IS Yes THEN To_Fight IS Yes CV = 0.8 RL = IF Want_Fight IS Yes THEN To_Fight IS Doubt RL = IF Want_Fight IS Sometimes THEN To_Fight IS Yes CV = 0.8 RL = IF Want_Fight IS Sometimes THEN To_Fight IS Doubt RL = IF Want_Fight IS Sometimes THEN To_Fight IS No RL = IF Want_Fight IS No THEN To_Fight IS No RL = IF Aggressiveness IS Rage THEN Fight IS Weak RL = IF To_Fight IS Yes THEN Fight IS Strong CV = 0.8 RL = IF To_Fight IS Yes THEN Fight IS Medium RL = IF To_Fight IS Doubt THEN Fight IS Medium RL = IF To_Fight IS No THEN Fight IS Weak RL = IF Aggressiveness IS Pacific THEN Fight IS Strong 72 #Rest rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Rest IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Rest IS Right RL = IF Aggressiveness IS Neutral THEN About_Rest IS Neutral RL = IF Aggressiveness IS Calm THEN About_Rest IS Right RL = IF Aggressiveness IS Pacific THEN About_Rest IS Wrong RL = IF About_Rest IS Wrong AND Aggressiveness IS Rage THEN Want_Rest IS No RL = IF About_Rest IS Right AND Aggressiveness IS Aggressive THEN Want_Rest IS Yes RL = IF About_Rest IS Neutral AND Aggressiveness IS Aggressive THEN Want_Rest IS Yes RL = IF About_Rest IS Neutral AND Aggressiveness IS Neutral THEN Want_Rest IS Sometimes RL = IF About_Rest IS Neutral AND Aggressiveness IS Calm THEN Want_Rest IS Yes RL = IF About_Rest IS Right AND Aggressiveness IS Neutral THEN Want_Rest IS Sometimes RL = IF About_Rest IS Right AND Aggressiveness IS Calm THEN Want_Rest IS Yes RL = IF About_Rest IS Wrong AND Aggressiveness IS Pacific THEN Want_Rest IS No RL = IF Want_Rest IS Yes THEN To_Rest IS Yes RL = IF Want_Rest IS Sometimes THEN To_Rest IS Yes RL = IF Want_Rest IS Sometimes THEN To_Rest IS Doubt RL = IF Want_Rest IS Sometimes THEN To_Rest IS No RL = IF Want_Rest IS No THEN To_Rest IS No RL = IF To_Rest IS Yes THEN Rest IS Strong RL = IF To_Rest IS Doubt THEN Rest IS Medium RL = IF To_Rest IS No THEN Rest IS Weak #Apologize rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Apologize IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Apologize IS Wrong RL = IF Aggressiveness IS Neutral THEN About_Apologize IS Neutral RL = IF Aggressiveness IS Calm THEN About_Apologize IS Right RL = IF Aggressiveness IS Pacific THEN About_Apologize IS Right RL = IF About_Apologize IS Wrong AND Aggressiveness IS Rage THEN Want_Apologize IS No RL = IF About_Apologize IS Wrong AND Aggressiveness IS Aggressive THEN Want_Apologize IS No RL = IF About_Apologize IS Wrong AND Aggressiveness IS Neutral THEN Want_Apologize IS Sometimes RL = IF About_Apologize IS Neutral AND Aggressiveness IS Aggressive THEN Want_Apologize IS No RL = IF About_Apologize IS Neutral AND Aggressiveness IS Neutral THEN 73 Want_Apologize IS Sometimes RL = IF About_Apologize IS Neutral AND Aggressiveness IS Calm THEN Want_Apologize IS Yes RL = IF About_Apologize IS Right AND Aggressiveness IS Neutral THEN Want_Apologize IS Sometimes RL = IF About_Apologize IS Right AND Aggressiveness IS Calm THEN Want_Apologize IS Yes RL = IF About_Apologize IS Right AND Aggressiveness IS Pacific THEN Want_Apologize IS Yes RL = IF Want_Apologize IS Yes THEN To_Apologize IS Yes RL = IF Want_Apologize IS Sometimes THEN To_Apologize IS Yes RL = IF Want_Apologize IS Sometimes THEN To_Apologize IS Doubt RL = IF Want_Apologize IS Sometimes THEN To_Apologize IS No RL = IF Want_Apologize IS No THEN To_Apologize IS Doubt RL = IF Want_Apologize IS No THEN To_Apologize IS No RL = IF Aggressiveness IS Rage THEN Apologize IS Strong RL = IF Aggressiveness IS Aggressive THEN Apologize IS Strong RL = IF To_Apologize IS No THEN Apologize IS Medium RL = IF To_Apologize IS Doubt THEN Apologize IS Medium RL = IF To_Apologize IS Yes THEN Apologize IS Medium CV = 0.9 RL = IF To_Apologize IS Yes THEN Apologize IS Strong CV = 0.8 RL = IF Aggressiveness IS Pacific THEN Apologize IS Weak #Relax rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Relax IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Relax IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Relax IS Neutral RL = IF Aggressiveness IS Neutral THEN About_Relax IS Neutral RL = IF Aggressiveness IS Calm THEN About_Relax IS Neutral RL = IF Aggressiveness IS Calm THEN About_Relax IS Right RL = IF Aggressiveness IS Pacific THEN About_Relax IS Right RL = IF About_Relax IS Wrong AND Aggressiveness IS Rage THEN Want_Relax IS No RL = IF About_Relax IS Wrong AND Aggressiveness IS Aggressive THEN Want_Relax IS No RL = IF About_Relax IS Wrong AND Aggressiveness IS Aggressive THEN Want_Relax IS Sometimes RL = IF About_Relax IS Wrong AND Aggressiveness IS Neutral THEN Want_Relax IS Sometimes RL = IF About_Relax IS Neutral AND Aggressiveness IS Aggressive THEN Want_Relax IS No RL = IF About_Relax IS Neutral AND Aggressiveness IS Aggressive THEN Want_Relax IS Sometimes RL = IF About_Relax IS Neutral AND Aggressiveness IS Neutral THEN Want_Relax IS Sometimes RL = IF About_Relax IS Neutral AND Aggressiveness IS Calm THEN Want_Relax IS Sometimes 74 RL = IF About_Relax IS Neutral AND Aggressiveness IS Calm THEN Want_Relax IS Yes RL = IF About_Relax IS Right AND Aggressiveness IS Neutral THEN Want_Relax IS Sometimes RL = IF About_Relax IS Right AND Aggressiveness IS Calm THEN Want_Relax IS Yes RL = IF About_Relax IS Right AND Aggressiveness IS Calm THEN Want_Relax IS Sometimes RL = IF About_Relax IS Right AND Aggressiveness IS Pacific THEN Want_Relax IS Yes RL = IF Want_Relax IS Yes THEN To_Relax IS Yes RL = IF Want_Relax IS Yes THEN To_Relax IS Doubt RL = IF Want_Relax IS Sometimes THEN To_Relax IS Yes RL = IF Want_Relax IS Sometimes THEN To_Relax IS Doubt RL = IF Want_Relax IS Sometimes THEN To_Relax IS No RL = IF Want_Relax IS No THEN To_Relax IS Doubt RL = IF Want_Relax IS No THEN To_Relax IS No RL = IF Aggressiveness IS Rage THEN Relax IS Strong RL = IF Aggressiveness IS Aggressive THEN Relax IS Strong RL = IF To_Relax IS No THEN Relax IS Medium RL = IF To_Relax IS Doubt THEN Relax IS Medium RL = IF To_Relax IS Yes THEN Relax IS Medium CV = 0.8 RL = IF To_Relax IS Yes THEN Relax IS Strong CV = 0.6 RL = IF Aggressiveness IS Pacific THEN Relax IS Weak #Soothe rules BLOCK_RULES RL = IF Aggressiveness IS Rage THEN About_Soothe IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Soothe IS Wrong RL = IF Aggressiveness IS Aggressive THEN About_Soothe IS Neutral RL = IF Aggressiveness IS Neutral THEN About_Soothe IS Neutral RL = IF Aggressiveness IS Calm THEN About_Soothe IS Neutral RL = IF Aggressiveness IS Calm THEN About_Soothe IS Right RL = IF Aggressiveness IS Pacific THEN About_Soothe IS Right RL = IF About_Soothe IS Wrong AND Aggressiveness IS Rage THEN Want_Soothe IS No RL = IF About_Soothe IS Wrong AND Aggressiveness IS Aggressive THEN Want_Soothe IS No RL = IF About_Soothe IS Wrong AND Aggressiveness IS Aggressive THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Wrong AND Aggressiveness IS Neutral THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Neutral AND Aggressiveness IS Aggressive THEN Want_Soothe IS No RL = IF About_Soothe IS Neutral AND Aggressiveness IS Aggressive THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Neutral AND Aggressiveness IS Neutral THEN Want_Soothe IS Sometimes 75 RL = IF About_Soothe IS Neutral AND Aggressiveness IS Calm THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Neutral AND Aggressiveness IS Calm THEN Want_Soothe IS Yes RL = IF About_Soothe IS Right AND Aggressiveness IS Neutral THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Right AND Aggressiveness IS Calm THEN Want_Soothe IS Yes RL = IF About_Soothe IS Right AND Aggressiveness IS Calm THEN Want_Soothe IS Sometimes RL = IF About_Soothe IS Right AND Aggressiveness IS Pacific THEN Want_Soothe IS Yes RL = IF Want_Soothe IS Yes THEN To_Soothe IS Yes RL = IF Want_Soothe IS Yes THEN To_Soothe IS Doubt RL = IF Want_Soothe IS Sometimes THEN To_Soothe IS Yes RL = IF Want_Soothe IS Sometimes THEN To_Soothe IS Doubt RL = IF Want_Soothe IS Sometimes THEN To_Soothe IS No RL = IF Want_Soothe IS No THEN To_Soothe IS Doubt RL = IF Want_Soothe IS No THEN To_Soothe IS No RL = IF Aggressiveness IS Rage THEN Soothe IS Strong RL = IF Aggressiveness IS Aggressive THEN Soothe IS Strong RL = IF To_Soothe IS No THEN Soothe IS Medium RL = IF To_Soothe IS Doubt THEN Soothe IS Medium RL = IF To_Soothe IS Yes THEN Soothe IS Medium CV = 0.6 RL = IF To_Soothe IS Yes THEN Soothe IS Strong CV = 0.5 RL = IF Aggressiveness IS Pacific THEN Soothe IS Weak #Happiness RULES #Depress rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Depress IS Right RL = IF Happiness IS Unhappy THEN About_Depress IS Right RL = IF Happiness IS Unhappy THEN About_Depress IS Neutral RL = IF Happiness IS Indifferent THEN About_Depress IS Neutral RL = IF Happiness IS Happy THEN About_Depress IS Neutral RL = IF Happiness IS Happy THEN About_Depress IS Wrong RL = IF Happiness IS Radiant THEN About_Depress IS Wrong RL = IF About_Depress IS Right AND Happiness IS Depressed THEN Want_Depress IS Yes RL = IF About_Depress IS Right AND Happiness IS Unhappy THEN Want_Depress IS Yes RL = IF About_Depress IS Right AND Happiness IS Unhappy THEN Want_Depress IS Sometimes RL = IF About_Depress IS Right AND Happiness IS Indifferent THEN Want_Depress IS Sometimes RL = IF About_Depress IS Neutral AND Happiness IS Unhappy THEN Want_Depress IS Yes 76 RL = IF About_Depress IS Neutral AND Happiness IS Unhappy THEN Want_Depress IS Sometimes RL = IF About_Depress IS Neutral AND Happiness IS Indifferent THEN Want_Depress IS Sometimes RL = IF About_Depress IS Neutral AND Happiness IS Happy THEN Want_Depress IS Sometimes RL = IF About_Depress IS Neutral AND Happiness IS Happy THEN Want_Depress IS No RL = IF About_Depress IS Wrong AND Happiness IS Indifferent THEN Want_Depress IS Sometimes RL = IF About_Depress IS Wrong AND Happiness IS Happy THEN Want_Depress IS No RL = IF About_Depress IS Wrong AND Happiness IS Happy THEN Want_Depress IS Sometimes RL = IF About_Depress IS Wrong AND Happiness IS Radiant THEN Want_Depress IS No RL = IF Want_Depress IS Yes THEN To_Depress IS Yes CV = 0.5 RL = IF Want_Depress IS Yes THEN To_Depress IS Doubt RL = IF Want_Depress IS Sometimes THEN To_Depress IS Yes CV = 0.5 RL = IF Want_Depress IS Sometimes THEN To_Depress IS Doubt RL = IF Want_Depress IS Sometimes THEN To_Depress IS No RL = IF Want_Depress IS No THEN To_Depress IS Doubt RL = IF Want_Depress IS No THEN To_Depress IS No RL = IF Happiness IS Depressed THEN Depress IS Weak RL = IF To_Depress IS Yes THEN Depress IS Strong CV = 0.5 RL = IF To_Depress IS Yes THEN Depress IS Medium RL = IF To_Depress IS Doubt THEN Depress IS Medium RL = IF To_Depress IS No THEN Depress IS Weak RL = IF Happiness IS Radiant THEN Depress IS Strong #Dumped rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Dumped IS Right RL = IF Happiness IS Unhappy THEN About_Dumped IS Right RL = IF Happiness IS Unhappy THEN About_Dumped IS Neutral RL = IF Happiness IS Indifferent THEN About_Dumped IS Neutral RL = IF Happiness IS Happy THEN About_Dumped IS Neutral RL = IF Happiness IS Happy THEN About_Dumped IS Wrong RL = IF Happiness IS Radiant THEN About_Dumped IS Wrong RL = IF About_Dumped IS Right AND Happiness IS Depressed THEN Want_Dumped IS Yes RL = IF About_Dumped IS Right AND Happiness IS Unhappy THEN Want_Dumped IS Yes RL = IF About_Dumped IS Right AND Happiness IS Unhappy THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Right AND Happiness IS Indifferent THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Neutral AND Happiness IS Unhappy THEN Want_Dumped 77 IS Yes RL = IF About_Dumped IS Neutral AND Happiness IS Unhappy THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Neutral AND Happiness IS Indifferent THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Neutral AND Happiness IS Happy THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Neutral AND Happiness IS Happy THEN Want_Dumped IS No RL = IF About_Dumped IS Wrong AND Happiness IS Indifferent THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Wrong AND Happiness IS Happy THEN Want_Dumped IS No RL = IF About_Dumped IS Wrong AND Happiness IS Happy THEN Want_Dumped IS Sometimes RL = IF About_Dumped IS Wrong AND Happiness IS Radiant THEN Want_Dumped IS No RL = IF Want_Dumped IS Yes THEN To_Dumped IS Yes CV = 0.6 RL = IF Want_Dumped IS Yes THEN To_Dumped IS Doubt RL = IF Want_Dumped IS Sometimes THEN To_Dumped IS Yes CV = 0.6 RL = IF Want_Dumped IS Sometimes THEN To_Dumped IS Doubt RL = IF Want_Dumped IS Sometimes THEN To_Dumped IS No RL = IF Want_Dumped IS No THEN To_Dumped IS Doubt RL = IF Want_Dumped IS No THEN To_Dumped IS No RL = IF Happiness IS Depressed THEN Dumped IS Weak RL = IF To_Dumped IS Yes THEN Dumped IS Strong CV = 0.6 RL = IF To_Dumped IS Yes THEN Dumped IS Medium RL = IF To_Dumped IS Doubt THEN Dumped IS Medium RL = IF To_Dumped IS No THEN Dumped IS Weak RL = IF Happiness IS Radiant THEN Dumped IS Strong #Spoil rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Spoil IS Right RL = IF Happiness IS Unhappy THEN About_Spoil IS Right RL = IF Happiness IS Indifferent THEN About_Spoil IS Neutral RL = IF Happiness IS Happy THEN About_Spoil IS Wrong RL = IF Happiness IS Radiant THEN About_Spoil IS Wrong RL = IF About_Spoil IS Right AND Happiness IS Depressed THEN Want_Spoil IS Yes RL = IF About_Spoil IS Right AND Happiness IS Unhappy THEN Want_Spoil IS Yes RL = IF About_Spoil IS Right AND Happiness IS Indifferent THEN Want_Spoil IS Sometimes RL = IF About_Spoil IS Neutral AND Happiness IS Unhappy THEN Want_Spoil IS Yes RL = IF About_Spoil IS Neutral AND Happiness IS Indifferent THEN Want_Spoil IS Sometimes 78 RL = IF About_Spoil IS Neutral AND Happiness IS Happy THEN Want_Spoil IS No RL = IF About_Spoil IS Wrong AND Happiness IS Indifferent THEN Want_Spoil IS Sometimes RL = IF About_Spoil IS Wrong AND Happiness IS Happy THEN Want_Spoil IS No RL = IF About_Spoil IS Wrong AND Happiness IS Radiant THEN Want_Spoil IS No RL = IF Want_Spoil IS Yes THEN To_Spoil IS Yes CV = 0.8 RL = IF Want_Spoil IS Sometimes THEN To_Spoil IS Yes CV = 0.8 RL = IF Want_Spoil IS Sometimes THEN To_Spoil IS Doubt RL = IF Want_Spoil IS Sometimes THEN To_Spoil IS No RL = IF Want_Spoil IS No THEN To_Spoil IS No RL = IF Happiness IS Depressed THEN Spoil IS Weak RL = IF To_Spoil IS Yes THEN Spoil IS Strong CV = 0.8 RL = IF To_Spoil IS Yes THEN Spoil IS Medium RL = IF To_Spoil IS Doubt THEN Spoil IS Medium RL = IF To_Spoil IS No THEN Spoil IS Weak RL = IF Happiness IS Radiant THEN Spoil IS Strong #Chat rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Chat IS Wrong RL = IF Happiness IS Unhappy THEN About_Chat IS Right RL = IF Happiness IS Indifferent THEN About_Chat IS Neutral RL = IF Happiness IS Happy THEN About_Chat IS Right RL = IF Happiness IS Radiant THEN About_Chat IS Wrong RL = IF About_Chat IS Wrong AND Happiness IS Depressed THEN Want_Chat IS No RL = IF About_Chat IS Right AND Happiness IS Unhappy THEN Want_Chat IS Yes RL = IF About_Chat IS Neutral AND Happiness IS Unhappy THEN Want_Chat IS Yes RL = IF About_Chat IS Neutral AND Happiness IS Indifferent THEN Want_Chat IS Sometimes RL = IF About_Chat IS Neutral AND Happiness IS Happy THEN Want_Chat IS Yes RL = IF About_Chat IS Right AND Happiness IS Indifferent THEN Want_Chat IS Sometimes RL = IF About_Chat IS Right AND Happiness IS Happy THEN Want_Chat IS Yes RL = IF About_Chat IS Wrong AND Happiness IS Radiant THEN Want_Chat IS No RL = IF Want_Chat IS Yes THEN To_Chat IS Yes RL = IF Want_Chat IS Sometimes THEN To_Chat IS Yes RL = IF Want_Chat IS Sometimes THEN To_Chat IS Doubt RL = IF Want_Chat IS Sometimes THEN To_Chat IS No RL = IF Want_Chat IS No THEN To_Chat IS No 79 RL = IF To_Chat IS Yes THEN Chat IS Strong RL = IF To_Chat IS Doubt THEN Chat IS Medium RL = IF To_Chat IS No THEN Chat IS Weak #Party rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Party IS Wrong RL = IF Happiness IS Unhappy THEN About_Party IS Wrong RL = IF Happiness IS Indifferent THEN About_Party IS Neutral RL = IF Happiness IS Happy THEN About_Party IS Right RL = IF Happiness IS Radiant THEN About_Party IS Right RL = IF About_Party IS Wrong AND Happiness IS Depressed THEN Want_Party IS No RL = IF About_Party IS Wrong AND Happiness IS Unhappy THEN Want_Party IS No RL = IF About_Party IS Wrong AND Happiness IS Indifferent THEN Want_Party IS Sometimes RL = IF About_Party IS Neutral AND Happiness IS Unhappy THEN Want_Party IS No RL = IF About_Party IS Neutral AND Happiness IS Indifferent THEN Want_Party IS Sometimes RL = IF About_Party IS Neutral AND Happiness IS Happy THEN Want_Party IS Yes RL = IF About_Party IS Right AND Happiness IS Indifferent THEN Want_Party IS Sometimes RL = IF About_Party IS Right AND Happiness IS Happy THEN Want_Party IS Yes RL = IF About_Party IS Right AND Happiness IS Radiant THEN Want_Party IS Yes RL = IF Want_Party IS Yes THEN To_Party IS Yes RL = IF Want_Party IS Sometimes THEN To_Party IS Yes RL = IF Want_Party IS Sometimes THEN To_Party IS Doubt RL = IF Want_Party IS Sometimes THEN To_Party IS No RL = IF Want_Party IS No THEN To_Party IS Doubt RL = IF Want_Party IS No THEN To_Party IS No RL = IF Happiness IS Depressed THEN Party IS Strong RL = IF Happiness IS Unhappy THEN Party IS Strong RL = IF To_Party IS No THEN Party IS Medium RL = IF To_Party IS Doubt THEN Party IS Medium RL = IF To_Party IS Yes THEN Party IS Medium CV = 0.9 RL = IF To_Party IS Yes THEN Party IS Strong CV = 0.8 RL = IF Happiness IS Radiant THEN Party IS Weak #Sex rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Sex IS Wrong RL = IF Happiness IS Unhappy THEN About_Sex IS Wrong RL = IF Happiness IS Unhappy THEN About_Sex IS Neutral 80 RL = IF Happiness IS Indifferent THEN About_Sex IS Neutral RL = IF Happiness IS Happy THEN About_Sex IS Neutral RL = IF Happiness IS Happy THEN About_Sex IS Right RL = IF Happiness IS Radiant THEN About_Sex IS Right RL = IF About_Sex IS Wrong AND Happiness IS Depressed THEN Want_Sex IS No RL = IF About_Sex IS Wrong AND Happiness IS Unhappy THEN Want_Sex IS No RL = IF About_Sex IS Wrong AND Happiness IS Unhappy THEN Want_Sex IS Sometimes RL = IF About_Sex IS Wrong AND Happiness IS Indifferent THEN Want_Sex IS Sometimes RL = IF About_Sex IS Neutral AND Happiness IS Unhappy THEN Want_Sex IS No RL = IF About_Sex IS Neutral AND Happiness IS Unhappy THEN Want_Sex IS Sometimes RL = IF About_Sex IS Neutral AND Happiness IS Indifferent THEN Want_Sex IS Sometimes RL = IF About_Sex IS Neutral AND Happiness IS Happy THEN Want_Sex IS Sometimes RL = IF About_Sex IS Neutral AND Happiness IS Happy THEN Want_Sex IS Yes RL = IF About_Sex IS Right AND Happiness IS Indifferent THEN Want_Sex IS Sometimes RL = IF About_Sex IS Right AND Happiness IS Happy THEN Want_Sex IS Yes RL = IF About_Sex IS Right AND Happiness IS Happy THEN Want_Sex IS Sometimes RL = IF About_Sex IS Right AND Happiness IS Radiant THEN Want_Sex IS Yes RL = IF Want_Sex IS Yes THEN To_Sex IS Yes RL = IF Want_Sex IS Yes THEN To_Sex IS Doubt RL = IF Want_Sex IS Sometimes THEN To_Sex IS Yes RL = IF Want_Sex IS Sometimes THEN To_Sex IS Doubt RL = IF Want_Sex IS Sometimes THEN To_Sex IS No RL = IF Want_Sex IS No THEN To_Sex IS Doubt RL = IF Want_Sex IS No THEN To_Sex IS No RL = IF Happiness IS Depressed THEN Sex IS Strong RL = IF Happiness IS Unhappy THEN Sex IS Strong RL = IF To_Sex IS No THEN Sex IS Medium RL = IF To_Sex IS Doubt THEN Sex IS Medium RL = IF To_Sex IS Yes THEN Sex IS Medium CV = 0.8 RL = IF To_Sex IS Yes THEN Sex IS Strong CV = 0.6 RL = IF Happiness IS Radiant THEN Sex IS Weak #Rejoice rules BLOCK_RULES RL = IF Happiness IS Depressed THEN About_Rejoice IS Wrong RL = IF Happiness IS Unhappy THEN About_Rejoice IS Wrong RL = IF Happiness IS Unhappy THEN About_Rejoice IS Neutral 81 RL = IF Happiness IS Indifferent THEN About_Rejoice IS Neutral RL = IF Happiness IS Happy THEN About_Rejoice IS Neutral RL = IF Happiness IS Happy THEN About_Rejoice IS Right RL = IF Happiness IS Radiant THEN About_Rejoice IS Right RL = IF About_Rejoice IS Wrong AND Happiness IS Depressed THEN Want_Rejoice IS No RL = IF About_Rejoice IS Wrong AND Happiness IS Unhappy THEN Want_Rejoice IS No RL = IF About_Rejoice IS Wrong AND Happiness IS Unhappy THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Wrong AND Happiness IS Indifferent THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Neutral AND Happiness IS Unhappy THEN Want_Rejoice IS No RL = IF About_Rejoice IS Neutral AND Happiness IS Unhappy THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Neutral AND Happiness IS Indifferent THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Neutral AND Happiness IS Happy THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Neutral AND Happiness IS Happy THEN Want_Rejoice IS Yes RL = IF About_Rejoice IS Right AND Happiness IS Indifferent THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Right AND Happiness IS Happy THEN Want_Rejoice IS Yes RL = IF About_Rejoice IS Right AND Happiness IS Happy THEN Want_Rejoice IS Sometimes RL = IF About_Rejoice IS Right AND Happiness IS Radiant THEN Want_Rejoice IS Yes RL = IF Want_Rejoice IS Yes THEN To_Rejoice IS Yes RL = IF Want_Rejoice IS Yes THEN To_Rejoice IS Doubt RL = IF Want_Rejoice IS Sometimes THEN To_Rejoice IS Yes RL = IF Want_Rejoice IS Sometimes THEN To_Rejoice IS Doubt RL = IF Want_Rejoice IS Sometimes THEN To_Rejoice IS No RL = IF Want_Rejoice IS No THEN To_Rejoice IS Doubt RL = IF Want_Rejoice IS No THEN To_Rejoice IS No RL = IF Happiness IS Depressed THEN Rejoice IS Strong RL = IF Happiness IS Unhappy THEN Rejoice IS Strong RL = IF To_Rejoice IS No THEN Rejoice IS Medium RL = IF To_Rejoice IS Doubt THEN Rejoice IS Medium RL = IF To_Rejoice IS Yes THEN Rejoice IS Medium CV = 0.6 RL = IF To_Rejoice IS Yes THEN Rejoice IS Strong CV = 0.5 RL = IF Happiness IS Radiant THEN Rejoice IS Weak 82 #LifeCondition RULES #Pollute rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Pollute IS Right RL = IF LifeCondition IS Poor THEN About_Pollute IS Right RL = IF LifeCondition IS Poor THEN About_Pollute IS Neutral RL = IF LifeCondition IS Medium THEN About_Pollute IS Neutral RL = IF LifeCondition IS Rich THEN About_Pollute IS Neutral RL = IF LifeCondition IS Rich THEN About_Pollute IS Wrong RL = IF LifeCondition IS Elite THEN About_Pollute IS Wrong RL = IF About_Pollute IS Right AND LifeCondition IS Miserable THEN Want_Pollute IS Yes RL = IF About_Pollute IS Right AND LifeCondition IS Poor THEN Want_Pollute IS Yes RL = IF About_Pollute IS Right AND LifeCondition IS Poor THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Right AND LifeCondition IS Medium THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Neutral AND LifeCondition IS Poor THEN Want_Pollute IS Yes RL = IF About_Pollute IS Neutral AND LifeCondition IS Poor THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Neutral AND LifeCondition IS Medium THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Neutral AND LifeCondition IS Rich THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Neutral AND LifeCondition IS Rich THEN Want_Pollute IS No RL = IF About_Pollute IS Wrong AND LifeCondition IS Medium THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Wrong AND LifeCondition IS Rich THEN Want_Pollute IS No RL = IF About_Pollute IS Wrong AND LifeCondition IS Rich THEN Want_Pollute IS Sometimes RL = IF About_Pollute IS Wrong AND LifeCondition IS Elite THEN Want_Pollute IS No RL = IF Want_Pollute IS Yes THEN To_Pollute IS Yes RL = IF Want_Pollute IS Yes THEN To_Pollute IS Doubt RL = IF Want_Pollute IS Sometimes THEN To_Pollute IS Yes RL = IF Want_Pollute IS Sometimes THEN To_Pollute IS Doubt RL = IF Want_Pollute IS Sometimes THEN To_Pollute IS No RL = IF Want_Pollute IS No THEN To_Pollute IS Doubt RL = IF Want_Pollute IS No THEN To_Pollute IS No RL = IF LifeCondition IS Miserable THEN Pollute IS Weak RL = IF LifeCondition IS Poor THEN Pollute IS Weak RL = IF To_Pollute IS Yes THEN Pollute IS Medium RL = IF To_Pollute IS Doubt THEN Pollute IS Medium 83 RL = IF To_Pollute IS No THEN Pollute IS Medium RL = IF LifeCondition IS Rich THEN Pollute IS Strong CV = 0.3 RL = IF LifeCondition IS Elite THEN Pollute IS Strong CV = 0.3 #Broke rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Broke IS Right RL = IF LifeCondition IS Poor THEN About_Broke IS Right RL = IF LifeCondition IS Poor THEN About_Broke IS Neutral RL = IF LifeCondition IS Medium THEN About_Broke IS Neutral RL = IF LifeCondition IS Rich THEN About_Broke IS Neutral RL = IF LifeCondition IS Rich THEN About_Broke IS Wrong RL = IF LifeCondition IS Elite THEN About_Broke IS Wrong RL = IF About_Broke IS Right AND LifeCondition IS Miserable THEN Want_Broke IS Yes RL = IF About_Broke IS Right AND LifeCondition IS Poor THEN Want_Broke IS Yes RL = IF About_Broke IS Right AND LifeCondition IS Poor THEN Want_Broke IS Sometimes RL = IF About_Broke IS Right AND LifeCondition IS Medium THEN Want_Broke IS Sometimes RL = IF About_Broke IS Neutral AND LifeCondition IS Poor THEN Want_Broke IS Yes RL = IF About_Broke IS Neutral AND LifeCondition IS Poor THEN Want_Broke IS Sometimes RL = IF About_Broke IS Neutral AND LifeCondition IS Medium THEN Want_Broke IS Sometimes RL = IF About_Broke IS Neutral AND LifeCondition IS Rich THEN Want_Broke IS Sometimes RL = IF About_Broke IS Neutral AND LifeCondition IS Rich THEN Want_Broke IS No RL = IF About_Broke IS Wrong AND LifeCondition IS Medium THEN Want_Broke IS Sometimes RL = IF About_Broke IS Wrong AND LifeCondition IS Rich THEN Want_Broke IS No RL = IF About_Broke IS Wrong AND LifeCondition IS Rich THEN Want_Broke IS Sometimes RL = IF About_Broke IS Wrong AND LifeCondition IS Elite THEN Want_Broke IS No RL = IF Want_Broke IS Yes THEN To_Broke IS Yes RL = IF Want_Broke IS Yes THEN To_Broke IS Doubt RL = IF Want_Broke IS Sometimes THEN To_Broke IS Yes RL = IF Want_Broke IS Sometimes THEN To_Broke IS Doubt RL = IF Want_Broke IS Sometimes THEN To_Broke IS No RL = IF Want_Broke IS No THEN To_Broke IS Doubt RL = IF Want_Broke IS No THEN To_Broke IS No RL = IF LifeCondition IS Miserable THEN Broke IS Weak RL = IF LifeCondition IS Poor THEN Broke IS Weak 84 RL RL RL RL RL = = = = = IF IF IF IF IF To_Broke IS Yes THEN Broke IS Medium To_Broke IS Doubt THEN Broke IS Medium To_Broke IS No THEN Broke IS Medium LifeCondition IS Rich THEN Broke IS Strong CV = 0.5 LifeCondition IS Elite THEN Broke IS Strong CV = 0.5 #DoDrugs rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_DoDrugs IS Right RL = IF LifeCondition IS Poor THEN About_DoDrugs IS Right RL = IF LifeCondition IS Medium THEN About_DoDrugs IS Neutral RL = IF LifeCondition IS Rich THEN About_DoDrugs IS Wrong RL = IF LifeCondition IS Elite THEN About_DoDrugs IS Wrong RL = IF About_DoDrugs IS Right AND LifeCondition IS Miserable THEN Want_DoDrugs IS Yes RL = IF About_DoDrugs IS Right AND LifeCondition IS Poor THEN Want_DoDrugs IS Yes RL = IF About_DoDrugs IS Right AND LifeCondition IS Medium THEN Want_DoDrugs IS Sometimes RL = IF About_DoDrugs IS Neutral AND LifeCondition IS Poor THEN Want_DoDrugs IS Yes RL = IF About_DoDrugs IS Neutral AND LifeCondition IS Medium THEN Want_DoDrugs IS Sometimes RL = IF About_DoDrugs IS Neutral AND LifeCondition IS Rich THEN Want_DoDrugs IS No RL = IF About_DoDrugs IS Wrong AND LifeCondition IS Medium THEN Want_DoDrugs IS Sometimes RL = IF About_DoDrugs IS Wrong AND LifeCondition IS Rich THEN Want_DoDrugs IS No RL = IF About_DoDrugs IS Wrong AND LifeCondition IS Elite THEN Want_DoDrugs IS No RL = IF Want_DoDrugs IS Yes THEN To_DoDrugs IS Yes RL = IF Want_DoDrugs IS Sometimes THEN To_DoDrugs IS Yes RL = IF Want_DoDrugs IS Sometimes THEN To_DoDrugs IS Doubt RL = IF Want_DoDrugs IS Sometimes THEN To_DoDrugs IS No RL = IF Want_DoDrugs IS No THEN To_DoDrugs IS No RL = IF LifeCondition IS Miserable THEN DoDrugs IS Weak RL = IF LifeCondition IS Poor THEN DoDrugs IS Weak RL = IF To_DoDrugs IS Yes THEN DoDrugs IS Medium RL = IF To_DoDrugs IS Doubt THEN DoDrugs IS Medium RL = IF To_DoDrugs IS No THEN DoDrugs IS Medium RL = IF LifeCondition IS Rich THEN DoDrugs IS Strong RL = IF LifeCondition IS Elite THEN DoDrugs IS Strong #Clean rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Clean IS Wrong RL = IF LifeCondition IS Poor THEN About_Clean IS Right 85 RL = IF LifeCondition IS Medium THEN About_Clean IS Neutral RL = IF LifeCondition IS Rich THEN About_Clean IS Right RL = IF LifeCondition IS Elite THEN About_Clean IS Wrong RL = IF About_Clean IS Wrong AND LifeCondition IS Miserable THEN Want_Clean IS No RL = IF About_Clean IS Right AND LifeCondition IS Poor THEN Want_Clean IS Yes RL = IF About_Clean IS Neutral AND LifeCondition IS Poor THEN Want_Clean IS Yes RL = IF About_Clean IS Neutral AND LifeCondition IS Medium THEN Want_Clean IS Sometimes RL = IF About_Clean IS Neutral AND LifeCondition IS Rich THEN Want_Clean IS Yes RL = IF About_Clean IS Right AND LifeCondition IS Medium THEN Want_Clean IS Sometimes RL = IF About_Clean IS Right AND LifeCondition IS Rich THEN Want_Clean IS Yes RL = IF About_Clean IS Wrong AND LifeCondition IS Elite THEN Want_Clean IS No RL = IF Want_Clean IS Yes THEN To_Clean IS Yes RL = IF Want_Clean IS Sometimes THEN To_Clean IS Yes RL = IF Want_Clean IS Sometimes THEN To_Clean IS Doubt RL = IF Want_Clean IS Sometimes THEN To_Clean IS No RL = IF Want_Clean IS No THEN To_Clean IS No RL = IF To_Clean IS Yes THEN Clean IS Strong RL = IF To_Clean IS Doubt THEN Clean IS Medium RL = IF To_Clean IS No THEN Clean IS Weak #Teach rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Teach IS Wrong RL = IF LifeCondition IS Poor THEN About_Teach IS Wrong RL = IF LifeCondition IS Medium THEN About_Teach IS Neutral RL = IF LifeCondition IS Rich THEN About_Teach IS Right RL = IF LifeCondition IS Elite THEN About_Teach IS Right RL = IF About_Teach IS Wrong AND LifeCondition IS Miserable THEN Want_Teach IS No RL = IF About_Teach IS Wrong AND LifeCondition IS Poor THEN Want_Teach IS No RL = IF About_Teach IS Wrong AND LifeCondition IS Medium THEN Want_Teach IS Sometimes RL = IF About_Teach IS Neutral AND LifeCondition IS Poor THEN Want_Teach IS No RL = IF About_Teach IS Neutral AND LifeCondition IS Medium THEN Want_Teach IS Sometimes RL = IF About_Teach IS Neutral AND LifeCondition IS Rich THEN Want_Teach IS Yes RL = IF About_Teach IS Right AND LifeCondition IS Medium THEN Want_Teach 86 IS Sometimes RL = IF About_Teach IS Right AND LifeCondition IS Rich THEN Want_Teach IS Yes RL = IF About_Teach IS Right AND LifeCondition IS Elite THEN Want_Teach IS Yes RL = IF Want_Teach IS Yes THEN To_Teach IS Yes RL = IF Want_Teach IS Sometimes THEN To_Teach IS Yes RL = IF Want_Teach IS Sometimes THEN To_Teach IS Doubt RL = IF Want_Teach IS Sometimes THEN To_Teach IS No RL = IF Want_Teach IS No THEN To_Teach IS No RL = IF LifeCondition IS Miserable THEN Teach IS Strong RL = IF LifeCondition IS Miserable THEN Teach IS Strong RL = IF To_Teach IS No THEN Teach IS Medium RL = IF To_Teach IS Doubt THEN Teach IS Medium RL = IF To_Teach IS Yes THEN Teach IS Medium RL = IF LifeCondition IS Rich THEN Teach IS Weak RL = IF LifeCondition IS Elite THEN Teach IS Weak #Donate rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Donate IS Wrong RL = IF LifeCondition IS Poor THEN About_Donate IS Wrong RL = IF LifeCondition IS Poor THEN About_Donate IS Neutral RL = IF LifeCondition IS Medium THEN About_Donate IS Neutral RL = IF LifeCondition IS Rich THEN About_Donate IS Neutral RL = IF LifeCondition IS Rich THEN About_Donate IS Right RL = IF LifeCondition IS Elite THEN About_Donate IS Right RL = IF About_Donate IS Wrong AND LifeCondition IS Miserable THEN Want_Donate IS No RL = IF About_Donate IS Wrong AND LifeCondition IS Poor THEN Want_Donate IS No RL = IF About_Donate IS Wrong AND LifeCondition IS Poor THEN Want_Donate IS Sometimes RL = IF About_Donate IS Wrong AND LifeCondition IS Medium THEN Want_Donate IS Sometimes RL = IF About_Donate IS Neutral AND LifeCondition IS Poor THEN Want_Donate IS No RL = IF About_Donate IS Neutral AND LifeCondition IS Poor THEN Want_Donate IS Sometimes RL = IF About_Donate IS Neutral AND LifeCondition IS Medium THEN Want_Donate IS Sometimes RL = IF About_Donate IS Neutral AND LifeCondition IS Rich THEN Want_Donate IS Sometimes RL = IF About_Donate IS Neutral AND LifeCondition IS Rich THEN Want_Donate IS Yes RL = IF About_Donate IS Right AND LifeCondition IS Medium THEN Want_Donate IS Sometimes RL = IF About_Donate IS Right AND LifeCondition IS Rich THEN Want_Donate 87 IS Yes RL = IF About_Donate IS Right AND LifeCondition IS Rich THEN Want_Donate IS Sometimes RL = IF About_Donate IS Right AND LifeCondition IS Elite THEN Want_Donate IS Yes RL = IF Want_Donate IS Yes THEN To_Donate IS Yes RL = IF Want_Donate IS Yes THEN To_Donate IS Doubt RL = IF Want_Donate IS Sometimes THEN To_Donate IS Yes RL = IF Want_Donate IS Sometimes THEN To_Donate IS Doubt RL = IF Want_Donate IS Sometimes THEN To_Donate IS No RL = IF Want_Donate IS No THEN To_Donate IS Doubt RL = IF Want_Donate IS No THEN To_Donate IS No RL = IF LifeCondition IS Miserable THEN Donate IS Strong CV = 0.5 RL = IF LifeCondition IS Poor THEN Donate IS Strong CV = 0.5 RL = IF To_Donate IS No THEN Donate IS Medium RL = IF To_Donate IS Doubt THEN Donate IS Medium RL = IF To_Donate IS Yes THEN Donate IS Medium RL = IF LifeCondition IS Rich THEN Donate IS Weak RL = IF LifeCondition IS Elite THEN Donate IS Weak #Preserve rules BLOCK_RULES RL = IF LifeCondition IS Miserable THEN About_Preserve IS Wrong RL = IF LifeCondition IS Poor THEN About_Preserve IS Wrong RL = IF LifeCondition IS Poor THEN About_Preserve IS Neutral RL = IF LifeCondition IS Medium THEN About_Preserve IS Neutral RL = IF LifeCondition IS Rich THEN About_Preserve IS Neutral RL = IF LifeCondition IS Rich THEN About_Preserve IS Right RL = IF LifeCondition IS Elite THEN About_Preserve IS Right RL = IF About_Preserve IS Wrong AND LifeCondition IS Miserable THEN Want_Preserve IS No RL = IF About_Preserve IS Wrong AND LifeCondition IS Poor THEN Want_Preserve IS No RL = IF About_Preserve IS Wrong AND LifeCondition IS Poor THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Wrong AND LifeCondition IS Medium THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Neutral AND LifeCondition IS Poor THEN Want_Preserve IS No RL = IF About_Preserve IS Neutral AND LifeCondition IS Poor THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Neutral AND LifeCondition IS Medium THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Neutral AND LifeCondition IS Rich THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Neutral AND LifeCondition IS Rich THEN Want_Preserve IS Yes RL = IF About_Preserve IS Right AND LifeCondition IS Medium THEN Want_Preserve 88 IS Sometimes RL = IF About_Preserve IS Right AND LifeCondition IS Rich THEN Want_Preserve IS Yes RL = IF About_Preserve IS Right AND LifeCondition IS Rich THEN Want_Preserve IS Sometimes RL = IF About_Preserve IS Right AND LifeCondition IS Elite THEN Want_Preserve IS Yes RL = IF Want_Preserve IS Yes THEN To_Preserve IS Yes RL = IF Want_Preserve IS Yes THEN To_Preserve IS Doubt RL = IF Want_Preserve IS Sometimes THEN To_Preserve IS Yes RL = IF Want_Preserve IS Sometimes THEN To_Preserve IS Doubt RL = IF Want_Preserve IS Sometimes THEN To_Preserve IS No RL = IF Want_Preserve IS No THEN To_Preserve IS Doubt RL = IF Want_Preserve IS No THEN To_Preserve IS No RL = IF LifeCondition IS Miserable THEN Preserve IS Strong CV = 0.3 RL = IF LifeCondition IS Poor THEN Preserve IS Strong CV = 0.3 RL = IF To_Preserve IS No THEN Preserve IS Medium RL = IF To_Preserve IS Doubt THEN Preserve IS Medium RL = IF To_Preserve IS Yes THEN Preserve IS Medium RL = IF LifeCondition IS Rich THEN Preserve IS Weak RL = IF LifeCondition IS Elite THEN Preserve IS Weak END_RULES #Finish domain