39,59 €
The book starts with the basics examples of AI for different game genres and directly jumps into defining the probabilities and possibilities of the AI character to determine character movement. Next, you’ll learn how AI characters should behave within the environment created.
Moving on, you’ll explore how to work with animations. You’ll also plan and create pruning strategies, and create Theta algorithms to find short and realistic looking game paths. Next, you’ll learn how the AI should behave when there is a lot of characters in the same scene.
You'll explore which methods and algorithms, such as possibility maps, Forward Chaining Plan, Rete Algorithm, Pruning Strategies, Wall Distances, and Map Preprocess Implementation should be used on different occasions. You’ll discover how to overcome some limitations, and how to deliver a better experience to the player. By the end of the book, you think differently about AI.
Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:
Seitenzahl: 317
Veröffentlichungsjahr: 2017
< html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
Copyright © 2017 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.
First published: June 2017
Production reference: 1280617
ISBN 978-1-78712-281-9
www.packtpub.com
Author
Micael DaGraca
Copy Editor
Safis Editing
Reviewer
Davide Aversa
Project Coordinator
Ritika Manoj
Commissioning Editor
Amarabhab Banerjee
Proofreader
Safis Editing
Acquisition Editor
Shweta Pant
Indexer
Tejal Daruwale Soni
Content Development Editor
Aditi Gour
Graphics
Jason Monterio
Technical Editor
Leena Patil
Akansha Bathija
Production Coordinator
Shraddha Falebhai
Micael DaGraca is a game designer and an AR developer living in Porto, Portugal. He has worked for multiple game studios, contributing to the creation of different indie games and interactive apps.
Micael grew up playing video games, and that passion never went away. So, later on in his life, he decided to learn how to create games. Without any previous knowledge in coding or 3D animation, he slowly started to create simple games, learning each time more with those experiences. When the games started to work and the gameplay became enjoyable, he started to make plans to publish a game in collaboration with an old friend. Micael was responsible for the technical aspect of the game, making sure that the game worked as planned, while his friend created all the artwork for the game. Finally, the game was published, and it received some positive feedback from other indie game developers. Since the game generated some revenue, the dream of becoming a game designer turned into reality.
Today, Micael works for other studios, helping others to develop their game ideas, and has also integrated into a company that focuses on the creation of games and interactive apps for health and well-being purposes. Even though he doesn't have the time to keep working on personal projects, he has a few frozen game projects that are still under development with the help of his friend.
Davide Aversa completed his masters in robotics and artificial intelligence and his Ph.D. in computer science at La Sapienza University of Rome where he has been involved in research applied to pathfinding and decision making for digital games characters and computational creativity.
For support files and downloads related to your book, please visit www.PacktPub.com.
Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at [email protected] for more details.
At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks.
https://www.packtpub.com/mapt
Get the most in-demand software skills with Mapt. Mapt gives you full access to all Packt books and video courses, as well as industry-leading tools to help you plan your personal development and advance your career.
Fully searchable across every book published by Packt
Copy and paste, print, and bookmark content
On demand and accessible via a web browser
Thanks for purchasing this Packt book. At Packt, quality is at the heart of our editorial process. To help us improve, please leave us an honest review on this book's Amazon page at www.amazon.com/dp/1787122816.
If you'd like to join our team of regular reviewers, you can e-mail us at [email protected]. We award our regular reviewers with free eBooks and videos in exchange for their valuable feedback. Help us be relentless in improving our products!
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Downloading the color images of this book
Errata
Piracy
Questions
Different Problems Require Different Solutions
A brief history of and solutions to game AI
Enemy AI in video games
From simple to smart and human-like AI
Visual and audio awareness
Summary
Possibility and Probability Maps
Game states
Possibility maps
How to use possibility maps
Preparing a possibility map (FPS)
Creating a possibility map (FPS)
Defining the states
DEFENSIVE state
AGGRESSIVE state
Possibility map conclusion
Probability maps
How to use probability maps
Where to go from here
Summary
Production System
Automated finite-state machines (AFSMs)
Calculating chances
Utility-based functions
Dynamic game AI balancing
Summary
Environment and AI
Visual interactions
Basic environment interactions
Moving environment objects
Obstructive environment objects
Breaking down the environment by area
Advanced environment interactions
Adapting to unstable terrain
Using raycast to evaluate decisions
Summary
Animation Behaviors
2D animation versus 3D animation
2D animation - sprites
3D animation - bone structure
The main differences
Animation state machines
Smooth transitions
Summary
Navigation Behavior and Pathfinding
Navigation behavior
Choosing a new direction
Avoid walking against walls
Choosing an alternative path
Point to point movement
Tower defense genre
Racing genre
MOBA genre
Point to point movement and avoiding dynamic objects
Summary
Advanced Pathfinding
Simple versus advanced pathfinding
A* search algorithm
How it works
Disadvantages of using A*
Going directly from A to B
From point A to B with obstacles in the way
Generating grid nodes
Pathfinding implementation
Summary
Crowd Interactions
What is crowd interaction
Video games and crowd interactions
Assassin's Creed
Grand Theft Auto (GTA)
The Sims
FIFA/Pro evolution soccer
Planning crowd interactions
Group fight
Communication (attention zones)
Communication (talking to other AI characters)
Team sports
Crowd collision avoidance
Summary
AI Planning and Collision Avoidance
Search
Offensive search
Predicting opponent actions
Collision avoidance
Summary
Awareness
Stealth sub-genre
About tactics
About awareness
Implementing vision awareness
Basic vision detection
Advanced vision detection
Realistic field of view effect
Summary
Developing games is a passion for some, and I believe that this is because we are able to create a world that is completely imagined by us; this is like being a god, and the AI characters that we place there are the habitants of that world that we have just created. We are free to imagine how they will behave, we can create a society according to our imagination, we are able to create a sweet and kind character, but also we can create the most devilish character that ever existed--the possibilities are endless, and that is why we will always have new game ideas coming out. No matter what game genre we decide to develop, the world and their characters will be the essence of our vision; this is what will make our game unique, and ideally we should be able to create everything that we have in mind, just as we imagine. This book was conceived with that in mind, that all of us should be able to create the ideas that we have and that we shouldn't limit our imagination, so this book will cover the foundations of creating an artificial character, and after reading it, we should be able to explore all the topics that you have learned, creating AI characters that fit perfectly with what we have imagined.
Chapter 1, Different Problems Require Different Solutions, is a brief introduction to the video game industry and game AI.
Chapter2, Possibility and Probability Maps, focuses on how to create and use probability and possibility maps for AI characters.
Chapter 3,Production Systems, describes how to create a set of rules necessary for the character AI to achieve their goals.
Chapter 4, Environment and AI, focuses on the interaction between the characters in the game and their environment.
Chapter 5, Animation Behaviors, shows best practices to implement animations in our game.
Chapter 6, Navigation Behavior and Pathfinding, focuses on how to calculate the best options for the AI to move in real time.
Chapter 7, Advanced Pathfinding, focuses on the use of theta algorithms to find short and realistic-looking paths.
Chapter 8, Crowd Interactions, focuses on how the AI should behave when there are a lot of characters on the same scene.
Chapter 9, AI Planning and Collision Avoidance, discusses the anticipation of the AI, knowing in advance what they will do when arriving at a position or facing a problem.
Chapter 10, Awareness, focuses on working with awareness systems to create stealth genre mechanics.
It is recommended that you have install a game engine that uses C# (Unity3D has a free version, and it was used for the examples covered on the book).
This book is intended for developers who have already created their first games in C# and seek to expand their capabilities with AI, creating crowds, enemies, or allies that can behave autonomously.
Feedback from our readers is always welcome. Let us know what you think about this book-what you liked or disliked. Reader feedback is important for us as it helps us develop titles that you will really get the most out of. To send us general feedback, simply e-mail [email protected], and mention the book's title in the subject of your message. If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide at www.packtpub.com/authors.
Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.
You can download the example code files for this book from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you. You can download the code files by following these steps:
Log in or register to our website using your e-mail address and password.
Hover the mouse pointer on the
SUPPORT
tab at the top.
Click on
Code Downloads & Errata
.
Enter the name of the book in the
Search
box.
Select the book for which you're looking to download the code files.
Choose from the drop-down menu where you purchased this book from.
Click on
Code Download
.
Once the file is downloaded, please make sure that you unzip or extract the folder using the latest version of:
WinRAR / 7-Zip for Windows
Zipeg / iZip / UnRarX for Mac
7-Zip / PeaZip for Linux
The code bundle for the book is also hosted on GitHub at https://github.com/PacktPublishing/Practical-Game-AI-Programming. We also have other code bundles from our rich catalog of books and videos available at https://github.com/PacktPublishing/. Check them out!
We also provide you with a PDF file that has color images of the screenshots/diagrams used in this book. The color images will help you better understand the changes in the output. You can download this file from https://www.packtpub.com/sites/default/files/downloads/PracticalGameAIProgramming_ColorImages.pdf.
Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books-maybe a mistake in the text or the code-we would be grateful if you could report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the Errata Submission Form link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded to our website or added to any list of existing errata under the Errata section of that title. To view the previously submitted errata, go to https://www.packtpub.com/books/content/support and enter the name of the book in the search field. The required information will appear under the Errata section.
Piracy of copyrighted material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works in any form on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy. Please contact us at [email protected] with a link to the suspected pirated material. We appreciate your help in protecting our authors and our ability to bring you valuable content.
If you have a problem with any aspect of this book, you can contact us at [email protected], and we will do our best to address the problem.
To better understand how to overcome the problems that game developers are currently facing, we need to dig a little bit into the history of video game development and take a look at the problems and their solutions that were so important at the time. Some of them were so avant-garde that they actually changed the entire history of video game design itself, and we still use the same methods today to create unique and enjoyable games.
One of the first relevant marks that is always worth mentioning when talking about game AI is computer chess programmed to compete against humans. It was the perfect game to start experimenting with artificial intelligence, because chess usually requires a lot of thought and planning ahead, something that a computer couldn't do at the time because it was necessary to have human features in order to successfully play and win the game. So, the first step was to make it able for the computer to process the game rules and think for itself in order to make a good judgement of the next move that the computer should do to achieve the final goal, that is, winning by checkmating. The problem is that chess has many possibilities; so, even if the computer had a perfect strategy to beat the game, it was necessary to recalculate that strategy, adapting it, changing, or even creating a new one every time something went wrong with the first strategy.
Humans can play differently every time; this makes it a huge task for the programmers to input all the possible data into the computer in order to win the game. So, writing all the possibilities that could exist wasn't a viable solution, and because of that, the programmers needed to think again about the problem. Then, one day, they finally came out with a better solution, that is, to make the computer decide for itself every turn, choosing the most plausible option for each turn; that way, the computer could adapt to any possibility in the game. Yet, this involved another problem–the computer would only think the short-term moves, and not create any plans to defeat the human in the future moves; so, it was easy to play against it, but at least we started to have something going on. It was decades later that someone defined the word Artificial Intelligence (AI) by solving the first problem that many researchers had by trying to create a computer that was capable of defeating a human player. Arthur Samuel is the person responsible for creating a computer that could learn for itself and memorize all the possible combinations. That way, there wasn't necessarily any human intervention and the computer could actually think on its own, and that was a huge step that is still impressive even by today's standards.
Now, let's move to the video game industry and analyze how the first enemies and game obstacles were programmed; was it that different from what we are doing now? Let's find out.
Single-player games with AI enemies started to appear in the 1970s, and soon, some games started to elevate the quality and expectations of what defines a video game AI. Some of those examples were released for arcade machines, such as Speed Race from Taito (a racing video game), or Qwak (a duck hunting game using a light gun), and Pursuit (an aircraft fighter) both from Atari. Other notable examples are the text-based games released for the first personal computers, such as Hunt the Wumpus and Star Trek, which also had enemies. What made those games so enjoyable was precisely that the AI enemies that didn't reacted like any other before because they had random elements mixed with the traditional stored patterns, making them unpredictable, and hence providing a unique experience every time you played the game. However, that was only possible due to the incorporation of microprocessors that expanded the capabilities of a programmer at that time. Space Invaders brought the movement patterns and Galaxian improved and added more variety, making the AI even more complex. PAC-MAN later on brought movement patterns to the maze genre.
The influence that the AI design in PAC-MAN had is just as significant as the influence of the game itself. This classic arcade game makes the player believe that the enemies in the game are chasing him, but not in a crude manner. The ghosts are chasing the player (or evading the player) in a different way as if they have an individual personality. This gives people the illusion that they are actually playing against four or five individual ghosts rather than copies of the same computer enemy.
After that, Karate Champ introduced the first AI fighting character and Dragon Quest introduced the tactical system for the RPG genre; over the years, the list of games that explored artificial intelligence and used it to create unique game concepts kept expanding, and all of that came from a single question, how can we make a computer capable of beating a human in a game?
All the games mentioned above are of a different genre, and they are unique in their style, but all of them used the same method for the AI called finite-state machine (FSM). Here, the programmer inputs all the behaviors necessary for the computer to challenge the player, just like the computer that first played chess. The programmer defined exactly how the computer should behave on different occasions in order to move, avoid, attack, or perform any other behavior to challenge the player, and that method is used even in the latest big budget games of
Programmers face many challenges while developing an AI character, but one of the greatest challenges is adapting the AI movement and behavior in relation to what the player is currently doing, or will do in future actions. The difficulty exists because the AI is programmed with predetermined states, using probability or possibility maps in order to adapt their movement and behavior according to the player. This technique can become very complex if the programmer extends the possibilities of the AI decisions, just like the chess machine that has all the possible situations that may occur in the game.
It's a huge task for the programmer because it's necessary to determine what the player can do and how the AI will react to each action of the player, and that takes a lot of CPU power. To overcome that challenge, programmers started to mix possibility maps with probabilities and perform other techniques that let the AI decide for itself on how it should react according to the player's actions. These factors are important to be considered while developing an AI that elevates the game quality as we are about to discover.
Games kept evolving and players got even more exigent, not only with the visual quality but also with the capabilities of the AI enemies and the allied characters. To deliver new games that took into consideration the player expectations, programmers started to write even more states for each character, creating new possibilities and more engaging enemies, implementing important allied characters, which meant more things for the player to do, and creating a lot more features that helped redefine different genres and created new ones. Of course, this was also possible because technology kept improving, allowing developers to explore even more artificial intelligence in video games. A great example of this that is worth mentioning is Metal Gear Solid, the game that brought a new genre to the video game industry by implementing stealth elements, instead of the popular straightforward shooting. However, those elements couldn't be fully explored as Hideo Kojima intended because of the hardware limitations at the time. Jumping forward from the third to the fifth generation of consoles, Konami and Hideo Kojima presented the same title, but this time with a lot more interactions, possibilities, and behaviors from the AI elements of the game, making it so successful and important in video game history that it's easy to see its influence in a large number of games that came after Metal Gear Solid:
The game in the preceding screenshot implemented visual and audio awareness for the enemy AI, a feature that later on we'll explore in detail in this book. This feature established the genre that we know today as a stealth game. So, the game uses Path Finding and a FSM, features that were already known from the beginning of the video game industry; But, in order to create something new, they also created new features, such as interaction with the environment, navigation behavior, visual/audio awareness, and AI interaction; a lot of things that didn't existed at the time but that are widely used today in different game genres, such as sports, racing, fighting, or FPS games, were also introduced:
After that huge step for game design, developers still faced other problems, or should I say, these new possibilities brought even more problems, because they were not perfect. The AI still didn't react as a real person, and many other elements was necessary to be implemented, not only in stealth games, but in all other genres, and one in particular-needed to improve their AI to make the game feel realistic.
We are talking about sports games, especially those that tried to simulate real-world team behaviors, such as basketball or football. interaction with the player is not the only thing that we need to care about; we left chess long time ago, where it was 1 versus 1. Now, we want more, and watching other games get realistic AI behaviors, sport fanatics started to ask for the same features in their
favorite games; after all, those games was based on real-world events, and for that reason, the AI should react as realistically as possible.
At this point, developers and game designers started to take into consideration AI interaction with itself, and that just like the enemies from PAC-MAN, the player should get the impression that each character in the game thinks for itself and reacts differently to the others. If we analyze it closely, the AI that is present in a sports game is structured like an FPS or RTS game, using different animation states, general movements, interactions, individual decisions, and finally tactics and collective decisions. So, it shouldn't be a surprise that sports games could reach the same level of realism as the other genres that had already greatly evolved in terms of AI development. However, there are few problems that only sports games had at the time: how to make so many characters on the same screen react differently but at the same time work together to achieve the same objective. With this problem in mind, developers started to improve the individual behaviors of each character, not only for the AI that was playing against the player but also for the AI that was playing alongside the player. Once again, Finite State Machines made up a crucial part of Artificial Intelligence, but the special touch that helped to create a realistic approach in the sports genre was the anticipation and awareness used in stealth games. The computer needed to calculate what the player was doing, where the ball was going, and coordinate all of that, as well as give a false impression of a team mindset toward the same plan. Combining the new features used in the new genre of stealth games with a vast number of characters on the same screen, it was possible to innovate the sports genre by creating a sports simulation type of game, which has gained so much popularity over the years. This helps us to understand that we can use almost the same methods for any type of game, even if it looks completely different; the core principles that we saw in the computer that played chess is still valuable to the sports game released 30 years later.
Let's move on to our last example, which also has great value in terms of how an AI character should behave to make it more realistic: the game is F.E.A.R., developed by Monolith Productions. What made this game so special in terms of Artificial Intelligence was the dialog between the enemy characters. While it wasn't an improvement from a technical point of view, it was definitely something that helped to showcase all of the development work that was put into the characters' AI, and this is so crucial because if the AI doesn't say it, it didn't happen. This is an important factor to take into consideration while creating a realistic AI character, giving the illusion that it's real; that means the false impression that the computer reacts like humans, and humans interact, so the AI should do the same. Not only did the dialog help to create a human-like atmosphere, it also helped to exhale all of the development put on the character that otherwise the player wouldn't notice was there. When the AI detects the player for the first time, it shouts that it found the player; when the AI loses sight of the player, it expresses that. When the squad of AI's are trying to find the player or ambush him, they speak about that, leaving the player imagining that the enemy is really capable of thinking and planning against him. Why is this so important? Because if we only had numbers and mathematical equations for the characters, they will react that way, without any human features, just math, and to make it look more human, it's necessary to input mistakes, errors, and dialog into the character AI, just to distract the player from the fact that he's playing against a machine.
The history of video game artificial intelligence is still far from perfect, and it's possible that it will take us decades to improve just a little bit more from what we achieved between the early 1950s and this present day, so don't be afraid of exploring what you are about to learn, combine, change, or delete some of the things to find different results, because great games did it in the past and they had a lot of success with it.
In this chapter, you learned about the impact of AI on the video game history, how everything started from a simple idea to have a computer to compete against humans in traditional games, and how that naturally evolved into the world of video games. You also learned about the challenges and difficulties that were present since the day one, and how coincidentally, programmers kept facing and still face the same problems. In the next chapter, we'll start from that precise point, the most used technique and the technique that caused a lot of debate and evolution that was present on past games as well on present and futures ones.
In this chapter, we'll be talking about possibility and probability maps, understanding how and where they are used. We'll also be learning the best practices for creating an AI that reacts to the player and that also chooses the best options, as we look to create a character that can make decisions as a human would.
As we saw previously, video games used to rely heavily on predetermining the behavior of what the AI could do in different scenarios that were either created by the game itself or by the player's actions. This method has been present since day one and is still being used today, making it an extremely valuable method for creating quality AI characters. Before explaining, in detail, what each of the maps do, and before demonstrating how to create them in order to develop good AI behavior, it's always good to have a general idea of what possibility and probability maps are and where or when they are applied.
As gamers, we tend to enjoy the product as a whole, experiencing every part of the game with enthusiasm and dedication, forgetting about the technical aspects of the game. For that reason, we sometimes forget that even simple things that happen while we play were already destined to occur that way, and that there is a lot of thought and planning behind that moment. Everything happens for a reason, as we often hear, and this can also be applied to video games. From the moment you clicked the start button to begin the game to the last awesome combo that you performed to defeat the final boss of the game, everything was planned to happen and it was necessary for a programmer to input all of those possibilities within the game. If you clicked the A button and your character jumped, that happened because it was determined to be that way. The same thing is valid for AI enemies or allies on the game; when they do something to defeat or help you, it was necessary for that behavior to be programmed, and to do that we use states.
To understand how to create possibility or probability maps we need to first acknowledge the principle aspect necessary to create them, which is called game states, or simply states. We call game states to the actions that are predetermined throughout different occasions in the game, and those actions can be applied to both the player or to the enemy character. Some examples can be simple behavior, such as run, jump, or attack, and those states can be expanded a little more, for example when the character is in the air and cannot attack or if the character has low magical energy and cannot perform a magic attack. In these cases, the character goes from one state to another or can't perform one if it's doing another.
Now let's take a deeper look at the possibility maps that we encountered in the examples in the first chapter, from the chess machine to the Metal Gear Solid video game. As we can see, it's a technique that is still being used today, and it is almost impossible to create a game AI without it.
As the name suggests, possibility maps allow the programmer to define the possibilities available to the player or the AI character within the game. Everything that is possible inside the game needs to be planned and coded, but what happens when you allow the character to do a lot of things can they do them all at the same time? If played during different stages of the game, can they react in the same way at all of the stages? To allow, and restrain, the possible actions, we also need to think about the possible scenarios that can occur in the game, and when you put all of that together it's called a possibility map.
Let's take a look at a simple example of a common FPS game, and for that we'll be using the states demonstrated in the preceding image.
Imagine that we are the enemy character of the game and our goal is to shoot and kill the player using only the states walk, run, cover, jump, fire, and defend. We need to take into consideration that the player will do his best to kill us, and therefore a lot of possible scenarios may arrive. Let's start with the basics we are walking from one point to another while protecting our space and as the player goes near that space, our goal changes from protecting our space to the definitive goal, that is, killing the player. What should we do next? Fire? Run towards the player and fire from close range? Cover and wait until the player is nearby? What if the player saw us first and is preparing to fire at us? A lot of things could happen, and a lot of things can be done with just a few states. So, let's map every possible situation and plan how we should act or react in each individual situation. Examples that I would choose for my game are as follows:
Walk slowly to a cover position, wait for the player, and shoot him
Run for cover and then fire from that position
Defend (moving away from the bullets) while running to a cover position
Fire against the player, running towards him, and keep firing
Depending on the type of game that we want to create, we can use the same states to shape it into a different genre. We also need to take into consideration the personality of the character that we are programming. If it's a robot, it probably won't be afraid to keep firing against the player, even if the chances of getting destroyed are 99%. On the other hand, if it's an inexperienced soldier, it might feel reluctant to get shot and will run for cover instantly. The list goes on and on just by changing the personality of the character.
