ON Ethoreal Shift by Swarna Kundu ID 142-40-128 AND Fahim Ahmed ID 142-40-138 This Report Presented in Partial Fulfillment of the Requirements for the Degree of Bachelor of Science in Multimedia and Creative Technology Supervised By Dr. Shaikh Muhammad Allayear Associate Professor and Head Department of MCT Daffodil International University DAFFODIL INTERNATIONAL UNIVERSITY Dhaka, BangladesH 16 April, 2018 APPROVAL This Project titled Ethoreal Shift, submitted by Swarna Kundu Fahim Ahmed to the Department of Multimedia and Creative Technology, Daffodil International University, has been accepted as satisfactory for the partial fulfillment of the requirements for the degree of B.Sc. in Multimedia and Creative Technology and approved as to its style and contents. The presentation has been held on 16 April, 2018. Board of Examiners (Name) Chairman Designation Department of MCT Faculty of Science Information Technology Daffodil International University (Name) Internal Examiner Designation Department of MCT Faculty of Science Information Technology Daffodil International University (Name) External Examiner Designation Department of ——- Jahangirnagar University Declaration We hereby declare that, this project has been done by us under the supervision of Dr. Shaikh Muhammad Allayear, Associate Professor and Head, Department of MCT, Daffodil International University. We also declare that neither this project nor any part of this project has been submitted elsewhere for award of any degree or diploma. Supervised by Dr. Shaikh Muhammad Allayear Associate Professor and Head Department of MCT Daffodil International University Submitted by Swarna Kundu ID 142-40-128 Department of MCT Daffodil International University Fahim Ahmed ID 142-40-138 Department of MCT Daffodil International University ACKNOWLEDGEMENT First, we express our heartiest thanks and gratefulness to almighty God for His divine blessing makes us possible to complete the final year project successfully. We are really grateful and wish our profound our indebtedness to our supervisor, Dr. Shaikh Muhammad Allayear, Associate Professor and Head, Department of MCT Daffodil International University, Dhaka. Deep Knowledge keen interest of our supervisor in the field of Game Design Development to carry out this project. His endless patience, scholarly guidance, continual encouragement, constant and energetic supervision, constructive criticism, valuable advice, reading many inferior draft and correcting them at all stage have made it possible to complete this project. We would like to express our heartiest gratitude to Mr. Mirza Mohtashim Alam, Lecturer, Department of MCT, for his kind help to finish our project and to other faculty member and the staff of MCT department of Daffodil International University. We would like to thank our entire course mate in Daffodil International University, who took part in this discuss while completing the course work. Finally, we must acknowledge with due respect the constant support and patients of our parents. Abstract For this project, we wanted to design a computer game in Unity. So we decided to design a Role-Playing game (RPG) where the objective is to collect three elemental stones, save the planet using the stones and get out of the game by finishing it. The player, who is a magician, has to collect three stones by defeating enemies in different levels and save the planet from being destroyed. The game is designed developed in Microsoft Windows and written in C using Unity Game Engine, Monodevelop and Microsoft Visual Studio. We have implemented many advanced programming functions in this project as taught in our Multimedia Authoring Game Development course. As a result, we have created a 3D RPG game that we hope would be fun to play and enjoyable. TABLE OF CONTENTS CONTENTS PAGEBoard of examiners iDeclarationiiAcknowledgements iiiAbstractivCHAPTERSCHAPTER 1 Introduction 1-61.1 Gaming in Our Field11.2 Background of this Project1APPENDIX50-55REFERENCES56-57 LIST OF FIGURES FIGURESPAGE NOFigure 1 Screen capture of Unity4Figure 2.1.1 numbering according to sub sections11 CHAPTER 1 Introduction This chapter covers our project proposal and achievability of the planning along with background research, the possibilities and few initial concepts of our game. Gaming in Our Field In the rapidly growing sector of game design, the future has become hard to predict. We are developing this game as for our Final Project Phase-II. Phase-II is a 3-credit course and as part of our degree, we chose this type of project for doing better with graphics, scripting, 3-D modeling, texturing, animation game design. In a game project, we have the opportunity to implement everything we learned in these four years from graphics design, story script writing, storyboarding, 3-D modeling, animation, texturing, lighting and many other things in the environment of the game, the story, characters, game play, the artworks and so on. 1.2 Background of this Project Our game is a single player first person Role Playing game (RPG) emphasizing on storytelling, action and adventures. These often focus on resources and time management, which usually prioritizes over character involvement and fast action. Strategic organization and implementation are necessary, and the game developers usually put the versatility of decision-making and execution of commands in the gamers hands. 1.3 About the Project It is a first person Role Playing game (RPG) with different levels to play. The main character of Ethoreal Shift is a boy who gets teleported into the game he was playing and becomes the avatar of the main character of the game who is a magician. He cannot return to his own world unless he finishes the game. The main mission of the gamer is to use his powers to save the world. There are several levels and in each level, the gamer must complete the quests or objectives and collect the stones that he needs to use at the last level. 1.4 Scope of Our Game This document discusses all necessary requirements of this project in details. The basis of this groundwork is to provide an implicit image with both structured and unstructured information of our project Ethoreal Shift. This game is a first person Role Playing game (RPG) developed on and for Microsoft Windows platform. The player will advance through levels, which require precise and strategic manipulation of the players creative and logical thinking. The episodic structure of the game simplifies the momentum of the games story. We exhibit the strategic implementation of script, inputs and display (output) as we are focusing mainly on concept of the story, game levels, objects in the game, character animation, graphics, scripts and game engine features. 1.5 Project Scheduling Start DateEnd DateProject States and ObjectivesJanuary 5January 25Project Proposal, meeting with supervisor about our ideaJanuary 26February 10Planning, elaborating game story, levels planning and completing necessary preparationsFebruary 16February 28Choose tools, environment, finished 3-D modeling and texturing of game objectsMarch 1March 20Start level designing and model implementation, rethinking game plotMarch 21April 8Start programming, developing game logic, testing and enhancementApril 9April 14Project report writing and conducting tests on the constructed levelsApril 16Displaying project progress at our PredefenseApril 17April 26Final revision of the report and perform fine-tuning on the game logics and bugsApril 28May 12Conducting final tests on the game, fixing bugs and compile executable filesNot Announced YetProject final showcase and submission We have re-scheduled the planning of this project based on the predefense schedule, which now leads us to the specification part of the project, but may change later depending on the final defense schedule. Chapter 2 Software Requirements Specification of Ethoreal Shift This chapter covers the initial requirements specification of our game Ethoreal Shift. It incorporates the definition of this report with basic descriptions, specified requirements, and evaluation of models. It also contains modification management of this requirement specification in case of any modification is done. 2.1 Introduction In this section, the specification of this documentation is described. It describes the rules of the document, document purview and also presents a suggestion for the readers of the document. 2.1.1 Purpose of this Chapter This Software Requirements Specification (SRS) part is meant to provide a comprehensive overview of our Project Ethoreal Shift incorporating the action flow, the story and game user interface. The SRS document describes all aspects of the project that shows the references, manners and relevance of their execution. 2.1.2 Intended Audience and Reading Suggestions The SRS document provides us a method to establish the games commitment to our original vision. For a summery of the report and the project, please refer to Overall Description. For a detailed documentation of the game-play elements and their interaction with the player, refer to System Features. Readers curious about the game-play user interface and navigation between the front-end options should read External Interface Requirements. Specialized guidelines to which the developer team will work on the project are described in details in Other Nonfunctional Requirements. The design and development timeline will be preserved in the Key Milestones. 2.1.3 Scope of this Document This Software Requirements Specification (SRS) explains the functional and nonfunctional prerequisites for the project. The intension of this section is to deliver a close enough image for both structured and unstructured information of this game project. The concept of Ethoreal Shift was perceived by both of the members of our team, as having a predicted development time lengthy than the duration of this semester. Our team Desires to work on the project until its complete. We will continue to develop the game until we find it more than competent for open-source distribution. 2.2 General Description This segment contains the viewpoint of our project and the structural framework it demands. It defines the QFD (Quality Function Deployment) of this game and also the story of it. 2.2.1 Product and Business Perspective of the Game Design and development of a game like this from scratch is an outstanding challenge for any game studio. It demands substantial amount of investments in terms of cost and effort and also requires the clients participation, knowledge and understanding about the expected marketplace (example Steam, Origin). This report describes overall product perspective. 2.2.2 System Environment Player can interact and communicate with the system by giving input to the system. System commands those inputs to the related script, if any change happens like the value of certain variable is changed, the script sends required instructions to render the objects to display (Player changing his position). 2.2.3 Quality Function Deployment of Ethoreal Shift Quality Function Deployment is a procedure that expresses the requirements of the client into structured requirements for software or game. It focuses on maximizing client satisfaction throughout the game development process. The following requirements concerning our project have been identified by a QFD. General Requirements. Expected Requirements. General Requirements General requirements include goals and objectives which have been specified in the meeting with the relevant peoples concerning the project. general requirements of our project are – 1. Efficient, user friendly and productive system. 2. Least amount of effort in development and future support. 3. Achievability of desired requirements within targeted PC configuration. 4. Easy to play. 5. Developed with professional approach. 6. Well structured coding, creative and professional thinking. Expected Requirements These requirements are inherent to the system and can be so rudimentary that thegamer and relevant people does not specify them comprehensively. Unable to implement them might become a cause of disappointment. 1. Develop the whole game as planned in the scheduled time. 2. Minimum hardware prerequisites, which is suitable for the game. 3. Design and develop the whole game in a well-organized style. 2.2.4 User Story As we have specified above, Ethoreal Shift is a first person Role Playing game (RPG). We desire to develop it as a cross-platform game which would be supported by PC, console, android phone, IOS and also other available platforms. But as we have very limited time to complete the game, it has only been developed for PC (Microsoft Windows). So the gamer can use any windows pc to run the game. After running the game, the UX view of the game will appear on the screen. UX means User Experience, which refers to all aspects of an individuals experience of interacting with a system. Then the gamer can select Start Game from the Main Menu and start playing the game. After starting the game, a cut scene would be shown to the player to give him an idea about the story. When the cut scene ends, player will be given a briefing about the backstory and his primary mission on the screen. He may also interact with Pause Menu by pressing Escape. If he loses he can replay the level as the level will automatically restart after the players death. Or he can exit game by pressing Quit in the Pause Menu. The story behind the game is about a boy who gets teleported into a game he was playing in his pc. He becomes the avatar of the main character of the game, a magician who is the descendent of another great magician who saved the world from destruction long time ago. The objective of the gamer is to collect three elemental stones by completing three different quests, which he will use at the last level to save the planet from being destroyed by the rays of Super Red Moon. As mentioned earlier, the gamer will find tips in different steps which will help him to go to the finishing stage. In first level, the player has to search for information about his mission in Sylvista village. He finds a merchant of magic items in the village. The merchant tells him to find scrolls which are spread around the village. There is an Inventory System that stores everything the player collects. After collecting all the scrolls in the village, the player has to use those scrolls to teleport to Daryas city. In that city, player needs to find more scrolls hidden around the city to find the location of the stones. Then he goes to the jungle to collect the Dryad stone. The player has to defeat every wood cutter in the forest to get the stone. The player uses fire to defeat his enemies. He has two attacks, first one is fireball that player throws at his enemies. Second one is a charged attack, a burst of flame, where he keeps throwing flames at his enemies. But he can use that charged attack after an interval as he needs to regain his magical energy. Then, he returns to the city with the stone. He has to go to Sylvista village again, to the merchant in order to obtain a magic artifact that will allow him to use explosion spell. Then he goes to the machine site with the artifact to get the Zephyrus stone, where a machine is polluting the air. The area is guarded by Paladin knights equipped with sword and shield. The player has to defeat every knight in the area and cast an explosion spell at the building that is producing smoke using the machine. After collecting the Zephyrus stone, he goes to his last quest to get the last stone, Darya. Last level is a factory site with a forest at the front and is guarded by both woodcutters and Paladin knights. After defeating all the enemies, the player casts the explosion spell on the factory and the Darya stone appears before him. After collecting all 3 stones, he goes to a cave, a sacred waterfall where he can use the power of the stones to save the world. He puts the three stones on a magic table with ancient glyphs, the table unleashes the power of the stones creating a barrier around the planet to protect it from the Super Blood Moon and the player is teleported back to his own world in his room. 2.3 Specific Requirements This segment discusses the project external requirements of the game and also signifies the user attributes for this project. 2.3.1 External Interface Requirements of the Game 2.3.1.1 User Interfaces Every game must have a main menu, so the gamers can easily start the game. The menu is an important element for creating the SRS document. In this SRS document section, we have used snapshots of the menu in the user manual subsection. Those snapshots are established on the menu of this game. 2.3.1.2 Hardware Interfaces Ethoreal Shift is a pc game designed specifically for the Microsoft Windows and can be played on all mid to high-end desktops and laptops. Game data is stored locally on the game engine elements. Windows is graphically and universally adaptable with both 2D and 3D graphics library based on OpenGL ES 2.0, 3.0 and different DirectX specifications as well as hardware configuration, pixel format conversion, accelerated 3D graphics and scaling. 2.3.1.3 Software Interface Ethoreal Shift has been designed and developed using a series of 3D modelling, game design and development software. Software and tools used in this project Unity3D 5.6 and 2018.1 (Game Engine) Autodesk Maya 2016 (3D modeling and animation) Adobe Fuse CC Beta (Character Generation) Adobe Photoshop CC 2014 (Creating Texture) Substance Painter 2 (Model Texturing) Substance Bitmap2Material (Image to Material Map Conversion) Microsoft Visual Studio 2017 Community Edition (Programming) Microsoft Visual Studio Code (Programming) Adobe After Effects (Editing Cut scene) 2.3.2 User Characteristics for the Game The game can be played by only one player at a time and the user can interact with the game in different ways. The player is the one who can communicate with the system by playing the game. And the player can be any individual. The initial requirement is, that the player should read the playing mechanism provided by the developers (us). 2.4 Requirement Change Management of Our System We hope to deliver a complete and fully working game that works according to the guidelines stated in the SRS document. But, as the game will be released for multiple Windows versions (i.e. the different desktops and laptops running different Windows version), updates will likely be necessary to address issues like fixing bugs that made into final version of the game, compatibility patches and expansions of the content. If the gamers experience any issues, bugs or want to give feedback, they can communicate with the developers through our official support email address which will be specified later. For managing the changes, we are releasing versions of this document. This one is version 1.1. 2.5.1 Bugs and Glitches The players would be able to communicate with us, the developers through the support email. This is where they would notify us of any bugs or glitches they have detected and if they have any feeling that the game is not working properly. Issues of gamers or comments would also be submitted by support email. We will monitor this email continuously in order to answer all questions and fix any problems that have surfaced. 2.5.2 Patches As the recent Windows 10 is frequently updated and the vast amount of combination of pc configuration exists, the game would also need to be updated frequently. We would constantly be making changes in order to fix any compatibility issues that may arise. These modifications, bug or glitches fixes will be updated by these patches. Chapter 3 Design and Implementation of Ethoreal Shift This chapter discusses about the design phases of this project, the system characteristics and also the implementation of system features. 3.1 Game Design For this game, we had to design lots of characters for the Player, enemies and town-folks. We also design several levels and environments where the games story will take place. 3.1.1 Characters 3.1.1.1 The Player In first person view, this capsule works as the player body. Since the player wont be visible, using this capsule as player helps to take some load off the computer. 3.1.1.2 Enemies This is the wood cutter, first enemy in the game. They are seen in every level working or talking, but the player only fights with them in Quest 1 and 3. They stays in idle when player is not around. But they keep moving toward the player when the player is in range and when they get close to the player, they start attacking with the axe. This is the Paladin Knight, second enemy in the game and more powerful than the woodcutter. They are also seen in every level talking or guarding the Citadel gate, but player only fights with them in Quest 2 and 3. As they have armor and shield, they have more health than the woodcutter. 3.1.1.3 Local Peoples These are local peoples who are either talking to others or walking around. They are created to liven up the environment. Archer and adventurer who is seen talking with other peoples or walking around in Sylvista and Daryas city. Another archer and adventurer who is seen talking with other peoples or walking around in Sylvista and Daryas city. Local girl of Asian ancestry seen walking around or talking with other peoples in Sylvista and Daryas city. Local women and also a merchant who is seen talking with other peoples, walking around or running magic shop in Sylvista and Daryas city. Guardian knight of the great king who is seen talking with other peoples or walking around in Sylvista and Daryas city. (We wanted to use him as an enemy, but he seemed more like a noble knight. So we kept him as a local) Just an old man, seen talking with other peoples or walking around in Sylvista and Daryas city. 3.1.1.4 Items Magic health potion to heal the player when injured. Magic scroll that the player collects in Sylvista and Daryas city. 3.1.1.5 Elemental Stones The Dryad stone representing forest goddess in greek mythology. It is given to player in Quest 1 after the player defeats every woodcutter in the forest. The Zephyrus stone representing the god of west wind in greek mythology. It is given to player in Quest 2 when he defeats all paladin knights and destroys the machine room. The Darya stone representing water in greek. It is given to the player in Quest 3 when he defeats all wood cutters and paladin knights and destroys the building polluting the water. 3.2 Level and Environment Design 3.3 Project Design Terms For every project, two primery terms of design are very important. They are ( User Experience (UX) ( Backend Programming 3.3.1 User Experience (UX) In order to avoid needless features, make the design report simple and to make the gamers interaction with the game easy and efficient, UX design is must. User experience design (UXD or UED) is any impression of an individuals experience with a specified system, along with the interface, design, graphics and manual interaction. User Experience Design completely incorporates conventional Human-Computer Interaction (HCI) concepts and design, and spreads it through evaluating all attributes of a product or service as comprehended by users. UX represents primarily suitable approach to feasibility, functionality and HCI. UX describes user experience as an individuals perceptions and acknowledges that outcome from the use or predicted use of a system, product or service. 3.3.2 Backend Programming The back end is the code or script sustaining that front end. In short, front end of a software or game is what we see (i.e. the user interface) and back end is the engine that we do not see. For effective execution and to expand user acceptance, both of them are very important in game industry. 3.4 System Features of Our Game Title Screen Main Menu Pause Menu Health Meter Magical Power Meter Attack Interval Timer Inventory System Easy Control Immersive Action Quests Dialogue System Exit Point 3.4.1 Title Screen 3.4.1.1 Description and Priority The title screen is the screen the player will see every time upon starting the game. Through this interface, the player can choose to start the game or exit the game. Since the title screen is the hub for all activities in the project, it must be included. 3.4.1.2 Response Sequences Step 1 The player launches the game from their device. Step 2 The start screen loads and appears, prompting the player with two buttons Play Game and Exit. Step 3 The player presses one of the buttons, triggering its respective function. 3.4.1.3 Functional Requirements REQ-1 The title screen must load and appear every time the game is launched. REQ-2 If the player quits the game during any stage of a level, they must be returned to the title screen. REQ-3 If the player presses the exit button, the game will end and return the player to the computers regular interface. REQ-4 If the player completes the game, the game will end and return the player to the title screen. 3.4.2 Pause Menu 3.4.2.1 Description and Priority The player should be able to pause anytime during gameplay, and this screen fulfills that requirement. The pause menu also allows the player to navigate between gameplay and title screens. Player can also change level of music and sound effects in this menu. 3.4.2.2 Response Sequences Step 1 The player presses the Escape button on the keyboard. Step 2 The level pauses, drawing up the pause menu which prompts the player with two options Resume Game and Exit Game. Step 3 The player presses one of the buttons, triggering its respective function. 3.4.2.3 Functional Requirements REQ-1 The Resume Game option must continue the game without any change to the characters vector or the state of the level from the moment of the pause action. REQ-2 The Quit Game option must close the game and return to the desktop screen. 3.4.3 Dialogue 3.4.3.1 Descriptions and Priority Dialogue is a method by which the player will be briefed about his next missions and objectives. The player is guided to his next objectives using dialogue with the silent protagonist, providing context and narrative. While this feature is secondary in importance to the primary game mechanics, it is an important aspect of the games atmosphere and it helps to heighten the players connection to the experience. 3.4.3.2 Response Sequences Step 1 The player goes to the Merchants office and presses the specified button. Step 2 Dialogue is triggered and a text box pops up. Step 3 To dismiss text boxes or continue reading multiple-page text boxes, the player clicks on Continue button. 3.4.3.3 Functional Requirements REQ-1 Dialogue should not pause the game to prevent player disorientation. REQ-2 Text boxes should be brief and placed away from UI components so as not to interfere with game-play. REQ-3 The text must be readable from any screen. 3.4.4 Exit Point 3.4.4.1 Descriptions and Priority Exit point is the finishing place of the levels. The player needs to complete the objectives and mission given to him to proceed to the next level or quest. 3.4.4.2 Response Sequences Step 1 The player completes the objectives or mission. Step 2 Player goes to the exit point. Step 3 The Player is teleported to the next level. 3.4.4.3 Functional Requirements REQ-1 Objectives must be completed to finish the level. REQ-2 Exit point must be in reach of the player. 3.5 Assumptions and Dependencies The target platform of our game project will be the Microsoft Windows devices. However, Unity will be responsible for both the construction of the game and its integration within the Windows framework. 3.5.1 Construction of the Game Unity includes many built-in components which will expedite the process of game development immensely. These include Physics Engine Collision Detection and Handling Input Recognition Object Creation and Transform Manipulation (position and rotation of game objects) Scene Integration (transition of one level to the next) Model Attachment (representing game objects with 3D models from external programs) 3.5.2 Integration with Windows Unitys build settings simplify the process of compiling our game for the Windows platform. After completing the project, or during any intermediary step for testing, we can select Windows from the list of options, build the project, and play it on the same pc. 3.6 Key Resource Requirements of the Project Major ProjectactivitiesSkill/ExpertiseRequiredWorks by TeammatesExternalResourcesIssues/ConstraintsLevel DesignAbility to translate aspects of the story into playable levelsBoth members made the decision about game levels togetherIdeas fromexisting games(Ex. Miami Adventures)No IssuesPhysics EngineKnowledge of functions availablein Unity and theability to changethem as neededBoth members worked on Unity game engineUnity gameengineAbility to angleinteractive portions of levels3D ModelingKnowledge of3D modeling softwareBoth members created necessary 3D models3D model designusing Autodesk MayaDifficulties in UV mapping because of complex 3D modelsTexturing of 3D ModelsKnowledge of texturing softwareWe both did the texturing of 3D modelsAdobe Photoshop Substance Painter Substance Bitmap2MaterialFrequent software crash because of low-end computersMusicImplementationAbility to incorporate sound clips smoothly into the game-Sound clips fromthe Internet- LevelImplementationFamiliarity withscripting language of game engineBoth members have someknowledge about scriptinglanguageScripts from our previous gamesLevel size dependent on hardware configurationDocumentationKnowledge about FormalReport WritingBoth members worked on the ReportIdea fromExisting Reports(Ex. University Report Guideline)Game Reports aredifferent fromconventional ones 3.7 Implementation Tools Required Software NameDeveloper CompanyUsageWork AreaUnity3D 5.6 2018.1Unity TechnologiesGame EngineGame DesignAutodesk Maya 2016Autodesk3D Modeling and AnimationCreating 3D models and game objectsAdobe Fuse CCAdobe IncorporatedCharacter GenerationCreating characters for the gameAdobe Photoshop CC 2014Image EditingCreating textures for 3D modelsAdobe After Effects CC 2014Creating Editing VideosEditing and applying necessary effects to cut scenesSubstance Painter 2SubstanceTexturing ShadingTexturing of the 3D modelsSubstance Bitmap2MaterialBitmap to Material ConversionConverting images to textures for 3D modelsMicrosoft Visual Studio 2017 Community EditionMicrosoftProgrammingCoding scripts for the gameMicrosoft Visual Studio Code 3.8 Implemented Codes Scripts We have used C as our programming language for the game, as it is easy to create, modify and implement. Unlike other games, we havent implemented any scoring system as score doesnt have any parts in our game. We heavily emphasized on item collection and mission objectives. Here are the codes we wrote for our game First Person Controller using System using UnityEngine using UnityStandardAssets.CrossPlatformInput using UnityStandardAssets.Utility using System.Collections using UnityEngine.UI using UnityEngine.SceneManagement using Random UnityEngine.Random RequireComponent(typeof(CharacterController)) RequireComponent(typeof(AudioSource)) public class FirstPersonController MonoBehaviour SerializeField private bool m_IsWalking SerializeField private float m_WalkSpeed SerializeField private float m_RunSpeed SerializeField Range(0f, 1f) private float m_RunstepLenghten SerializeField private float m_JumpSpeed SerializeField private float m_StickToGroundForce SerializeField private float m_GravityMultiplier SerializeField private MouseLook m_MouseLook SerializeField private bool m_UseFovKick SerializeField private FOVKick m_FovKick new FOVKick() SerializeField private bool m_UseHeadBob SerializeField private CurveControlledBob m_HeadBob new CurveControlledBob() SerializeField private LerpControlledBob m_JumpBob new LerpControlledBob() SerializeField private float m_StepInterval SerializeField private AudioClip m_FootstepSounds // an array of footstep sounds that will be randomly selected from. SerializeField private AudioClip m_JumpSound // the sound played when character leaves the ground. SerializeField private AudioClip m_LandSound // the sound played when character touches back on ground. public float pHealth public float maxHealth 100f public Transform startPoint public Item item public Text scrolls public GameObject pDeathText public static int scrollCount public static float enemyCount public AudioClip scrollCollect public Image healthBar private Camera m_Camera private bool m_Jump private float m_YRotation private Vector2 m_Input private Vector3 m_MoveDir Vector3.zero private CharacterController m_CharacterController private CollisionFlags m_CollisionFlags private bool m_PreviouslyGrounded private Vector3 m_OriginalCameraPosition private float m_StepCycle private float m_NextStep private bool m_Jumping private AudioSource m_AudioSource private void Start() m_CharacterController GetComponentCharacterController() m_Camera Camera.main m_OriginalCameraPosition m_Camera.transform.localPosition m_FovKick.Setup(m_Camera) m_HeadBob.Setup(m_Camera, m_StepInterval) m_StepCycle 0f m_NextStep m_StepCycle / 2f m_Jumping false m_AudioSource GetComponentAudioSource() m_MouseLook.Init(transform, m_Camera.transform) pHealth 100f scrollCount 0 enemyCount 0 pDeathText.SetActive(false) scrolls.text scrollCount.ToString() m_CharacterController.transform.position startPoint.position //Moves the Player to the assigned Start Point. private void Update() RotateView() // the jump state needs to read here to make sure it is not missed if (m_Jump) m_Jump CrossPlatformInputManager.GetButtonDown(Jump) if (m_PreviouslyGrounded m_CharacterController.isGrounded) StartCoroutine(m_JumpBob.DoBobCycle()) PlayLandingSound() m_MoveDir.y 0f m_Jumping false if (m_CharacterController.isGrounded m_Jumping m_PreviouslyGrounded) m_MoveDir.y 0f m_PreviouslyGrounded m_CharacterController.isGrounded if (startPoint null) startPoint transform //If Start Point is not assigned, player transform will be used. if (pHealth 0) return private void PlayLandingSound() m_AudioSource.clip m_LandSound m_AudioSource.Play() m_NextStep m_StepCycle .5f private void FixedUpdate() float speed GetInput(out speed) // always move along the camera forward as it is the direction that it being aimed at Vector3 desiredMove transform.forward m_Input.y transform.right m_Input.x // get a normal for the surface that is being touched to move along it RaycastHit hitInfo Physics.SphereCast(transform.position, m_CharacterController.radius, Vector3.down, out hitInfo, m_CharacterController.height / 2f, Physics.AllLayers, QueryTriggerInteraction.Ignore) desiredMove Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized m_MoveDir.x desiredMove.x speed m_MoveDir.z desiredMove.z speed if (m_CharacterController.isGrounded) m_MoveDir.y -m_StickToGroundForce if (m_Jump) m_MoveDir.y m_JumpSpeed PlayJumpSound() m_Jump false m_Jumping true else m_MoveDir Physics.gravity m_GravityMultiplier Time.fixedDeltaTime m_CollisionFlags m_CharacterController.Move(m_MoveDir Time.fixedDeltaTime) ProgressStepCycle(speed) UpdateCameraPosition(speed) m_MouseLook.UpdateCursorLock() private void PlayJumpSound() m_AudioSource.clip m_JumpSound m_AudioSource.Play() private void ProgressStepCycle(float speed) if (m_CharacterController.velocity.sqrMagnitude 0 (m_Input.x 0 m_Input.y 0)) m_StepCycle (m_CharacterController.velocity.magnitude (speed (m_IsWalking 1f m_RunstepLenghten))) Time.fixedDeltaTime if ((m_StepCycle m_NextStep)) return m_NextStep m_StepCycle m_StepInterval PlayFootStepAudio() private void PlayFootStepAudio() if (m_CharacterController.isGrounded) return // pick play a random footstep sound from the array, // excluding sound at index 0 int n Random.Range(1, m_FootstepSounds.Length) m_AudioSource.clip m_FootstepSoundsn m_AudioSource.PlayOneShot(m_AudioSource.clip) // move picked sound to index 0 so its not picked next time m_FootstepSoundsn m_FootstepSounds0 m_FootstepSounds0 m_AudioSource.clip private void UpdateCameraPosition(float speed) Vector3 newCameraPosition if (m_UseHeadBob) return if (m_CharacterController.velocity.magnitude 0 m_CharacterController.isGrounded) m_Camera.transform.localPosition m_HeadBob.DoHeadBob(m_CharacterController.velocity.magnitude (speed (m_IsWalking 1f m_RunstepLenghten))) newCameraPosition m_Camera.transform.localPosition newCameraPosition.y m_Camera.transform.localPosition.y m_JumpBob.Offset() else newCameraPosition m_Camera.transform.localPosition newCameraPosition.y m_OriginalCameraPosition.y – m_JumpBob.Offset() m_Camera.transform.localPosition newCameraPosition private void GetInput(out float speed) // Read input float horizontal CrossPlatformInputManager.GetAxis(Horizontal) float vertical CrossPlatformInputManager.GetAxis(Vertical) bool waswalking m_IsWalking if MOBILE_INPUT // On standalone builds, walk/run speed is modified by a key press. // keep track of whether or not the character is walking or running m_IsWalking Input.GetKey(KeyCode.LeftShift) endif // set the desired speed to be walking or running speed m_IsWalking m_WalkSpeed m_RunSpeed m_Input new Vector2(horizontal, vertical) // normalize input if it exceeds 1 in combined length if (m_Input.sqrMagnitude 1) m_Input.Normalize() // handle speed change to give an fov kick // only if the player is going to a run, is running and the fovkick is to be used if (m_IsWalking waswalking m_UseFovKick m_CharacterController.velocity.sqrMagnitude 0) StopAllCoroutines() StartCoroutine(m_IsWalking m_FovKick.FOVKickUp() m_FovKick.FOVKickDown()) private void RotateView() m_MouseLook.LookRotation(transform, m_Camera.transform) public void TakeDamage(float dAmount) pHealth – dAmount healthBar.fillAmount pHealth / 100f if (pHealth 0f) pDeathText.SetActive(true) StartCoroutine(GameOver()) void OnTriggerEnter(Collider other) if (other.tag Scrolls) scrollCount scrollCount 1 m_AudioSource.PlayOneShot(scrollCollect) if (scrolls.text null) scrolls.text scrollCount.ToString() IEnumerator GameOver() yield return new WaitForSeconds(5.0f) SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex) private void OnControllerColliderHit(ControllerColliderHit hit) Rigidbody body hit.collider.attachedRigidbody //dont move the rigidbody if the character is on top of it if (m_CollisionFlags CollisionFlags.Below) return if (body null body.isKinematic) return body.AddForceAtPosition(m_CharacterController.velocity 0.1f, hit.point, ForceMode.Impulse) Player Magic using UnityEngine using System.Collections using UnityEngine.UI public class PlayerMagic MonoBehaviour public float pDamage 10f //Primary Attack damage. public float cDamage 30f //Charged Attack damage. public float range 50f //Attack range. public ParticleSystem pAttack //Primary Attack effect. public ParticleSystem cAttack //Charged Attack effect. public float pAttackInterval 1f //Primary Attack Interval. public float pTimer 3f //Primary Attack Timer. public float cAttackInterval 10f //Charged Attack Interval. public float cTimer 10f //Charged Attack Timer. float pEffectDisplayTime 1.10f //How long the Primary Attack effect will be displayed. float cEffectDisplayTime 2.80f //How long the Charged Attack effect will be displayed. Animator anim //Reference to Player Animator. Target target //Reference to Enemy Script. public Image manaBar Camera cam AudioSource aSource public AudioClip PAttackSound public AudioClip CAttackSound void Start() anim GetComponentAnimator() aSource GetComponentAudioSource() cam Camera.main void Update () pTimer Time.deltaTime //Update the Timer. cTimer Time.deltaTime //Update the timer. manaBar.fillAmount cTimer / 10f //Primary Attack. if (Input.GetButtonDown(Fire1) pTimer pAttackInterval Time.timeScale 0) PrimaryAttack() //Charged Attack. if (Input.GetButtonDown(Fire2) cTimer cAttackInterval Time.timeScale 0) ChargedAttack() //Primary Attack parameters void PrimaryAttack() pTimer 0f //Resets Primary Attack timer. pAttack.Simulate(1) //Starts the effect. pAttack.Play() //Plays the effect. aSource.PlayOneShot(PAttackSound) RaycastHit hit //Reference to Raycast hit point. if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, range)) Debug.Log(hit.transform.name) target hit.transform.GetComponentTarget() if (target null) target.TakeDamage(pDamage) //Enemy takes damage. //Chrged Attack parameters void ChargedAttack() cTimer 0f //Resets Charged Attack timer. cAttack.Simulate(1) //Starts the effect. cAttack.Play() //Plays the effect. aSource.PlayOneShot(CAttackSound) RaycastHit hit //Reference to Raycast hit point. if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, range)) Debug.Log(hit.transform.name) target hit.transform.GetComponentTarget() if (target null) target.TakeDamage(cDamage) //Enemy takes damage. Mouse Look using System using UnityEngine using UnityStandardAssets.CrossPlatformInput Serializable public class MouseLook public float XSensitivity 2f public float YSensitivity 2f public bool clampVerticalRotation true public float MinimumX -90F public float MaximumX 90F public bool smooth public float smoothTime 5f public bool lockCursor true private Quaternion m_CharacterTargetRot private Quaternion m_CameraTargetRot private bool m_cursorIsLocked true public void Init(Transform character, Transform camera) m_CharacterTargetRot character.localRotation m_CameraTargetRot camera.localRotation public void LookRotation(Transform character, Transform camera) float yRot CrossPlatformInputManager.GetAxis(Mouse X) XSensitivity float xRot CrossPlatformInputManager.GetAxis(Mouse Y) YSensitivity m_CharacterTargetRot Quaternion.Euler (0f, yRot, 0f) m_CameraTargetRot Quaternion.Euler (-xRot, 0f, 0f) if(clampVerticalRotation) m_CameraTargetRot ClampRotationAroundXAxis (m_CameraTargetRot) if(smooth) character.localRotation Quaternion.Slerp (character.localRotation, m_CharacterTargetRot, smoothTime Time.deltaTime) camera.localRotation Quaternion.Slerp (camera.localRotation, m_CameraTargetRot, smoothTime Time.deltaTime) else character.localRotation m_CharacterTargetRot camera.localRotation m_CameraTargetRot UpdateCursorLock() public void SetCursorLock(bool value) lockCursor value if(lockCursor) //we force unlock the cursor if the user disable the cursor locking helper Cursor.lockState CursorLockMode.None Cursor.visible true public void UpdateCursorLock() //if the user set lockCursor we check properly lock the cursos if (lockCursor) InternalLockUpdate() private void InternalLockUpdate() if(Input.GetKeyUp(KeyCode.Escape)) m_cursorIsLocked false else if(Input.GetMouseButtonUp(0)) m_cursorIsLocked true if (m_cursorIsLocked) Cursor.lockState CursorLockMode.Locked Cursor.visible false else if (m_cursorIsLocked) Cursor.lockState CursorLockMode.None Cursor.visible true Quaternion ClampRotationAroundXAxis(Quaternion q) q.x / q.w q.y / q.w q.z / q.w q.w 1.0f float angleX 2.0f Mathf.Rad2Deg Mathf.Atan (q.x) angleX Mathf.Clamp (angleX, MinimumX, MaximumX) q.x Mathf.Tan (0.5f Mathf.Deg2Rad angleX) return q Target (Enemy) using System.Collections using System.Collections.Generic using UnityEngine public class Target MonoBehaviour public float health 50f //Enemy health public float damage 20f //Damage done to the Player Animator anim //Reference to Enemey Animator float startDelay 1.5f //Start delay of death animation public Transform player //Reference to Player position FirstPersonController fpc //Reference to Player Control script float enemyGravity AudioSource aSource public AudioClip walkSound public AudioClip attackSound void Start() anim GetComponentAnimator() player GameObject.FindGameObjectWithTag(Player).transform fpc player.transform.GetComponentFirstPersonController() aSource GetComponentAudioSource() private void Update() //Enemy animation anim.SetBool(isRunning, false) anim.SetBool(isIdle, true) anim.SetBool(isAIdle, false) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) enemyGravity Physics.gravity.y Time.deltaTime Vector3 direction player.position – this.transform.position //Determining enemy position from Player float angle Vector3.Angle(direction, this.transform.forward) //Enemy moves forward //Checks distance from player if (Vector3.Distance(player.position, this.transform.position) 20 angle 300 fpc.pHealth 0 Time.timeScale 1) if (health 0) return anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isAIdle, true) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) this.transform.rotation Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 1f) //Keeps moving toward the player until reached at a certain distance if (direction.magnitude 2) this.transform.Translate(0, 0, .09f) anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isAIdle, false) anim.SetBool(isWalking, true) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) //Attacks the player when in range else if (direction.magnitude 2) anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, true) anim.SetBool(gotHit, false) StartCoroutine(PlayerDamage()) if (fpc.pHealth 0) anim.SetBool(isRunning, false) anim.SetBool(isIdle, true) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) //If player is not in range, enemy stays idle else anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isAIdle, true) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) //Takes damage public void TakeDamage(float amount) health – amount //Reduces Enemy health by the Players damage amount. anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isWalking, false) anim.SetBool(Dying, false) anim.SetBool(Attack, false) anim.SetBool(gotHit, true) //When health reaches zero, enemy dies if (health 0f) Die() //Death Sequence void Die() anim.SetBool(isRunning, false) anim.SetBool(isIdle, false) anim.SetBool(isWalking, false) anim.Play(Death) anim.SetBool(Attack, false) anim.SetBool(gotHit, false) PlayerControl.enemyCount PlayerControl.enemyCount 1 //Destroys game object after 7 seconds Destroy(gameObject, 5) IEnumerator PlayerDamage() yield return new WaitForSeconds(.5f) fpc.TakeDamage(damage) //Damages the player Item using UnityEngine CreateAssetMenu(fileName New Item, menuName Inventory/Item) public class Item ScriptableObject new public string name New Item public Sprite icon null public bool showInInventory true public virtual void Use() // Use the item public void RemoveFromInventory() Inventory.instance.Remove(this) Consumables using UnityEngine CreateAssetMenu(fileName New Item, menuName Inventory/Consumable) public class Consumable Item public int healthGain public GameObject player public override void Use() PlayerControl playerControl player.GetComponentPlayerControl() playerControl.Heal(healthGain) RemoveFromInventory() Inventory Scripts Inventory using System.Collections using System.Collections.Generic using UnityEngine public class Inventory MonoBehaviour public static Inventory instance void Awake() instance this public delegate void OnItemChanged() public OnItemChanged onItemChangedCallback public int space 10 public ListItem items new ListItem() public void Add(Item item) if (item.showInInventory) if (items.Count space) return items.Add(item) if (onItemChangedCallback null) onItemChangedCallback.Invoke() public void Remove(Item item) items.Remove(item) if (onItemChangedCallback null) onItemChangedCallback.Invoke() Inventory Slot using UnityEngine using UnityEngine.UI using UnityEngine.Events using UnityEngine.EventSystems public class InventorySlot MonoBehaviour public Image icon public Button removeButton Item item public void AddItem(Item newItem) item newItem icon.sprite item.icon icon.enabled true removeButton.interactable true public void ClearSlot() item null icon.sprite null icon.enabled false removeButton.interactable false public void RemoveItemFromInventory() Inventory.instance.Remove(item) public void UseItem() if (item null) item.Use() Inventory UI using UnityEngine using System.Collections.Generic using UnityEngine.UI public class InventoryUI MonoBehaviour public GameObject inventoryUI public Transform itemsParent Inventory inventory void Start() inventory Inventory.instance inventory.onItemChangedCallback UpdateUI void Update() if (Input.GetButtonDown(Inventory)) inventoryUI.SetActive(inventoryUI.activeSelf) UpdateUI() Debug.Log(Inventory) public void UpdateUI() InventorySlot slots GetComponentsInChildrenInventorySlot() for (int i 0 i slots.Length i) if (i inventory.items.Count) slotsi.AddItem(inventory.itemsi) else slotsi.ClearSlot() Items Pickup using UnityEngine public class ItemPickup Interactable public Item item public override void Interact() base.Interact() void OnTriggerEnter(Collider Other) if (Other.tag Player) Inventory.instance.Add(item) Destroy(gameObject) //Other.gameObject.SetActive (false) Interactable using UnityEngine using UnityEngine.AI public class Interactable MonoBehaviour public float radius 3f public Transform interactionTransform bool isFocus false Transform player bool hasInteracted false public virtual void Interact() void OnDrawGizmosSelected() if (interactionTransform null) interactionTransform transform Gizmos.color Color.yellow Gizmos.DrawWireSphere(interactionTransform.position, radius) Dialogue System Dialogue using System.Collections using System.Collections.Generic using UnityEngine System.Serializable public class Dialogue public string name TextArea(3, 10) public string sentences Dialogue Manager using System.Collections using System.Collections.Generic using UnityEngine using UnityEngine.UI public class DialogueManager MonoBehaviour public Text nameText public Text dialogueText public Animator animator public Animator mAnim private Queuestring sentences void Start() sentences new Queuestring() public void StartDialogue(Dialogue dialogue) animator.SetBool(IsOpen, true) mAnim.SetBool(Idle, false) mAnim.SetBool(Talk, true) nameText.text dialogue.name sentences.Clear() foreach (string sentence in dialogue.sentences) sentences.Enqueue(sentence) DisplayNextSentence() public void DisplayNextSentence() if (sentences.Count 0) EndDialogue() return string sentence sentences.Dequeue() StopAllCoroutines() StartCoroutine(TypeSentence(sentence)) IEnumerator TypeSentence(string sentence) dialogueText.text foreach (char letter in sentence.ToCharArray()) dialogueText.text letter yield return null void EndDialogue() animator.SetBool(IsOpen, false) mAnim.SetBool(Talk, false) mAnim.SetBool(Idle, true) Dialogue Trigger using System.Collections using System.Collections.Generic using UnityEngine public class DialogueTrigger MonoBehaviour public Dialogue dialogue public GameObject dialogueText private void Start() dialogueText.SetActive(false) private void OnTriggerStay(Collider other) if (other.gameObject.tag Player) dialogueText.SetActive(true) if (dialogueText.activeInHierarchy true Input.GetKeyDown(KeyCode.F)) FindObjectOfTypeDialogueManager().StartDialogue(dialogue) private void OnTriggerExit(Collider other) dialogueText.SetActive(false) Other Scripts Quest Marker using System.Collections using System.Collections.Generic using UnityEngine public class QuestMarker MonoBehaviour public float degreesPerSecond 15.0f public float amplitude 0.5f public float frequency 1f Vector3 posOffset new Vector3() Vector3 tempPos new Vector3() void Start() posOffset transform.position void Update() transform.Rotate(new Vector3(0f, Time.deltaTime degreesPerSecond, 0f), Space.World) tempPos posOffset tempPos.y Mathf.Sin(Time.fixedTime Mathf.PI frequency) amplitude transform.position tempPos Teleportation using UnityEngine using UnityEngine.SceneManagement public class TeleportToDC MonoBehaviour public GameObject teleportText public string levelToLoad public GameObject qMarker void Start () teleportText.SetActive(false) qMarker.SetActive(false) private void Update() if (PlayerControl.scrollCount 7) qMarker.SetActive(true) else qMarker.SetActive(false) private void OnTriggerStay(Collider other) if (other.gameObject.tag Player PlayerControl.scrollCount 7) teleportText.SetActive(true) if (teleportText.activeInHierarchy true Input.GetKeyDown(KeyCode.F)) SceneManager.LoadScene(levelToLoad, LoadSceneMode.Single) private void OnTriggerExit(Collider other) teleportText.SetActive(false) Chapter 4 Beta Testing and Further Bug Fixing of Ethoreal Shift This chapter refers to some of the test cases we conducted on the game to check if the game works as intended in various stages and situations of development. We are giving some beta test examples for different stages and situations here. 4.1 Functional Tests 4.1.1 Test Case 1 Test Case Player movement animation. Procedure Import the Player character model with all animation files, create animator, place all animations in it, connect all states, code all animations in C script, put the character in a scene and play the scene. Expected Outcome Animations will work properly. Actual Outcome Animations not working in some movements. Found Reason Animations not assigned properly in the script. Assigned all animations properly. Further Test Run the scene again. Expected Outcome Animation should work properly now. Actual Outcome All animations are working properly. 4.1.2 Test Case 2 Test Case Player movement and physics. Procedure Add codes for movement of the player in the script. Play the scene. Expected Outcome Player moving properly as expected. Actual Outcome Player moves like sliding on the ground in some movements. Found Reason Player speed is too high. Experimented with the values to find correct speed value. Further Test Run the scene again. Expected Outcome Player should move properly now. Actual Outcome Player movement seems smooth and proper. 4.1.3 Test Case 3 Test Case Player interaction with surrounding environment. Procedure Add collider to the player and all other objects, add scripts of interaction in objects that the player can interact with. Play the scene. Expected Outcome Player interacting with everything properly. Actual Outcome Player goes through some objects. Found Reason No colliders added to those objects. Added proper colliders to objects. Further Test Run the scene again. Expected Outcome Player should interact with all objects now. Actual Outcome Player interaction with objects is working. 4.1.4 Test Case 4 Test Case Player attacks Procedure Create two fire attacks using particles in Unity, add necessary scripts to Player, play the scene. Expected Outcome particle attacks playing properly. Actual Outcome Particles move faster than players attack animations. Found Reason Particle delay time is faster than player animation speed. Matched the delay with player animation. Further Test Run the scene again. Expected Outcome Particle emission time should match player attack animation. Actual Outcome Particle emits according to attack animation. 4.1.5 Test Case 5 Test Case Enemy movement and damage. Procedure Add animations in enemy models, add necessary scripts, assign player as the target and damage amount to the player, play the scene. Expected Outcome Enemy will move toward player when in range. Actual Outcome Enemy falling through the ground. Found Reason Enemy collider is not assigned. Assigned and modified proper collider to enemy models. Further Test Run the scene again. Expected Outcome Enemy should stay on the ground. Actual Outcome Enemy stays on the ground and moves toward the player. 4.1.6 Test Case 6 Test Case Level switching after player triggers certain colliders. Procedure Create teleportation colliders in specified places, add necessary scripts and play the scene. Expected Outcome Player will teleport to assigned level. Actual Outcome Player is teleporting to the assigned level. 4.1.7 Test Case 7 Test Case Quest completing mechanisms. Procedure Implement quest completing mechanics to the quest levels, play the scene. Expected Outcome Quest should be completed after fulfilling necessary requirements. Actual Outcome Quests are completing after fulfilling given requirements. 4.1.8 Test Case 8 Test Case Dialogue box trigger. Procedure Add dialogue box in the scene, create trigger area for the box, add necessary scripts and play the scene. Expected Outcome Dialogue box appears correctly. Actual Outcome Dialogue box displaying correcting. 4.1.9 Test Case 9 Test Case Player health and magic bar UI. Procedure Create player health and magic bar UI, add necessary scripts and play the scene. Expected Outcome Health and magic amount showing correctly. Actual Outcome Magic bar isnt working properly. Found Reason Errors in the UI script. Fixed the error. Further Test Run the scene again. Expected Outcome Magic bar should be displayed properly now. Actual Outcome Magic bar is displaying properly. 4.2 Post-Build Beta Tests 4.2.1 Beta Test Bug 1 Expected Outcome Game will run properly without bugs. Actual Outcome Player movement doesnt match the animation. Found Reason Player speed is lower than animation speed. Re-examined the speed values. Further Test Re-build the game and run again. Expected Outcome Player should move properly now. Actual Outcome Player is moving properly. 4.2.2 Beta Test Bug 2 Expected Outcome Game will run properly without bugs. Actual Outcome Dialogue box doesnt close at magic shop. Found Reason Dialogue box closing animation isnt assigned in the script. Assigned the animation. Further Test Re-build the game and run again. Expected Outcome Dialogue box should close now. Actual Outcome Dialogue box is closing properly. 4.2.3 Beta Test Bug 3 Expected Outcome Game will run properly without bugs. Actual Outcome Enemies keep randomly bouncing when moving. Found Reason Enemy physics isnt defined properly in the script. Re-scripted enemy physics. Further Test Re-build the game and run again. Expected Outcome Enemy should move properly now. Actual Outcome Enemy is moving properly. 4.2.4 Beta Test Bug 4 Expected Outcome Game will run properly without bugs. Actual Outcome Enemies keep randomly bouncing when moving. Found Reason Enemy physics isnt defined properly in the script. Re-scripted enemy physics. Further Test Re-build the game and run again. Expected Outcome Enemy should move properly now. Actual Outcome Enemy is moving properly. 4.2.5 Beta Test Bug 5 Expected Outcome Game will run properly without bugs. Actual Outcome Camera isnt moving as expected. Found Reason The assigned camera isnt well-suited for third- person view. Used Unity FreeLookRig camera. Further Test Re-build the game and run again. Expected Outcome Camera should move properly now. Actual Outcome Camera is not moving properly. Found Reason Unity FreeLookRig camera has lots of bugs. Used Unity MultiPurposeCameraRig instead. Further Test Re-build the game and run again. Expected Outcome Camera should move properly now. Actual Outcome Camera goes through objects. Found Reason Unity FreeLookRig camera also has bugs in object collision. Used Unity First Person Controller. Further Test Re-build the game and run again. Expected Outcome Camera should move properly now. Actual Outcome Camera is moving properly. 4.2.6 Beta Test Bug 6 Expected Outcome Game will run properly without bugs. Actual Outcome Level objectives arent clear enough for gamers. Found Reason An objective window is necessary. Added objectives window. Further Test Re-build the game and run again. Expected Outcome Level objectives should be easy to understand. Actual Outcome Level objectives are easy to understand. Chapter 5 User Manual of Ethoreal Shift This chapter contains instructions for the players. It describes the methods of playing the game and also includes some in-game screenshots to give the player some ideas about the game before they start playing it. 5.1 Playing Procedures Players first interact with the system UI to start playing. We provide tips to the gamer about game mechanics so that he/she can easily understand how to play the game. There are different levels in this game which follows a planned storyline. Gamers can play each level by completing the objectives of the previous one. Player have to use his/her logic to accomplish the game. He needs to explore the levels, find scrolls to advance in some levels, defeat lots of enemies to complete his objectives. If the gamers health decreases completely, he loses the game and the level restarts. Here at the first level, the gamers objective is to find the magic shop first, then find all the scrolls hidden across Sylvista village. Player have to explore every house in the village to collect the scrolls. In the second level, the player is in Daryas city and he have to find scrolls hidden inside the city again to get information about the location of the elemental stones. Like that different level has different complexity and different logics to finish. But the main objective is that gamer should find all 3 stones to save the world and finish the game. 5.2 In-Game Screenshots Chapter 6 Conclusion A game project needs a lot of experience to complete. In this chapter we summarize the experience gained by our developer team during the whole development process of Ethoreal Shift. 6.1 The Obstacles We Faced We had our first idea for the game rejected after four months of development time. So we had only one semester to complete the whole project starting from developing a new concept, planning everything we have to implement in the game, 3D modelling, designing the levels, programming etc. We werent given any idea about how much time we would have to finish the project. So we had to set a deadline by ourselves and had to plan the project according to that deadline. Because of this reason, we had to give up on some of the ideas and features of the game to complete it in due time. Unity game engine has lots of necessary features missing because it has a subscription based paid version with lots of additional features, some of which should have been implemented in the free/personal version of the engine that we used. We suffered a lot because of this in this project and our previous games. We had to develop some workarounds to make some features work. But most of the workarounds needs advanced knowledge in C and we didnt have enough time to do research and learn more things to fully utilize the features of Unity. We developed these workarounds and broaden our knowledge in game design and programming by video tutorials, text tutorials, internet and learning materials given by the tools themselves, though they had little contribution in our knowledge building. The project was a matter of time, patience and hard work. It is very rational work and it requires lots of time because the game engines try to match the game environment with the real world. Creating 3D models for this project was very difficult because we had to work with each and every point of the model to make them look realistic. The characters of the game were most difficult to model as we wanted to make them feel real. Developing models, textures and game levels were much difficult than we had thought because of our under-powered computers. Unity demands vast knowledge about its functions, properties, sections and subsections. The game engines themselves had lots of bugs in them, which made our work much more difficult. We had to develop some alternatives to tackle the bugs of game engines. Some features of Unity that we needed for our project were made available with version upgrade in this year. So we had to improvise some aspects of the game so that we can complete our project. And when we upgraded our Unity version, the upgraded Unity re-imported our project files where it corrupted some files. We had to import those files again, re-modified them for our levels and had to implement them again. The asset store of Unity had huge collection of tools, but most of the tools we needed were paid. So We werent able to implement some features like we wanted to. And finally but most importantly, our planned game was not a project that could be completed in 4-6 months by only two people with under-powered computers 6.2 The Achievements Now we know much more about the Unity game engine. How it works, its features, properties, objects and others, including its bugs. We were able to implement everything we learned in last four years starting from graphics design, motion graphics, 3D modelling, character rigging, animation, to game level design, game programming and scripting etc. We know more about 3D modelling, texturing, look development, rigging and animation. The main thing is that as a game developer, skill and expertise to design game levels, implementing various mechanics and the experience we gained by completing an overall game project by only two people. Dedication and co-operation between group members. Developed better communication skills. Expending creative thinking and imagination capability. 6.3 Future Development Plans Ethoreal Shift was originally planned to be a free-to-play Massively Multiplayer Online (MMO) open-world third person action-adventure game where all the players will be magicians and they will be playing the game together online to save the world of the game from the magic beasts of the parallel world. But as we were given pretty short time to develop this game and because of the shortcomings and lack of necessary features in Unity game engine itself, we had to divert from our original plan and cut short most of our ideas to complete the game in time. So our future plan for this game is to rebuild the game from scratch in Unreal Engine using our original plan. We will develop a massive and open fantasy world full of quests, puzzles and adventures using cultural, historical and mythological references, where the players will have to use their own knowledge, intellect and cooperate with each other in order to advance through the quests and finish the game. Also, there will be four elemental stones instead of three and their location wont be revealed until the final phase of the game starts (described further below). There would be 9 classes (races) of avatars in the game which the players can choose to play with. Each class will have their own features, powers and special abilities. But they all would have access to the massive weapons arsenal in the game as they level up. The unlock system for avatar, weapons and power upgrades will be based on levels, ranks and amount of in-game gems of the players, rather than pay-to-unlock. Players will level up and collect gems by completing different quests, solving puzzles, in-game trading of gems and items, and defeating the magic beasts. The quests and puzzles will be all over the games open world based on historical events, Greek and Norse mythologies, cultures of different countries and our own original ideas. Some quests would require the players to work together as a team to complete the objectives. Quests based on historical events and mythologies would require the player to gain knowledge about history and mythologies in order to complete them. There would be some fast-paced quests and puzzles that will challenge the intellect and reflex of a player. It will be up to the players to complete those quests and puzzles. The enemies would be magic beasts, who would be from parallel world. There will be several races of the beasts and they will have magical powers similar to the magicians of this world. Their powers will differ based on their race, size, and also their level and rank. Some of them will have regenerative abilities, some will have the power to heal others. Some beasts will be huge like a building, very powerful. Those will be the boss of the quests. Some beasts will be the size of small animals and would be found in easy quests. Some beasts would be like regular sized humans or taller, those will be the regular enemies in the quests. Their ranks and levels would decide what amount of gems and experience points will the players get when they defeat the enemies. The quests, number and level of enemies, gems, item drops and XP points in cooperative quests would be controlled by a base system or algorithm to keep certain things in the game unpredictable. Some quests will be in this world, and some quests would be in the parallel world. We are planning to give the game itself a time-limit. At first, the game will be in a trial phase, where the players will be given a couple of years to level up, complete quests and find clues to complete the whole game. After that, the final phase of the game will start, which will unlock new quests and objectives that will reveal the locations of the four elemental stones. In this phase, all players will have 1 year to complete all new quests, collect the stones and finish the game. If they cant finish the game in the given time, the whole game will reset, deleting all player and level data and the game will restart from the beginning, starting a loop until the game is cleared in the final phase. But this isnt finalized in the plan yet because of the technical difficulties of this process. Though it will take several years of development and lots of funding to complete this original plan of the game, but we believe that we can develop this into an amazing game if given the opportunity. 6.4 Last Few Words We learned a lot by working on this project. This project has enriched our knowledge and sharpened our concept of game engines, 3d modelling and animation. We learned a lot about different game documentation. The game we developed is intended to be played by the gamers of all over the world. The success of this project may give pleasure to lots of game lovers among the world. This project has not only tested our knowledge and technical skills but also our temperament. There were few times when we almost lost hope and motivation, but we recovered through continuous concentration, research, teamwork and hard work. If you have any kind of suggestion, ideas for improvements and more effective development ideas, please feel free to communicate with us. Daffodil International University u, tF 3 4YM)a3fMnLYQqs_ACrTis_XEH5C M1(V,YC [email protected] kIhIPGPG GSEa5 qf4W 8EmZfbqFFEo-_dZ.ny-(mbj7i,-2SX8DHzDJRHXoEG7ITwqrQP8k0w,GKmwt2.qxNrt9uvcTFjzGt76mhTkgo_IX0HYX8e(Nggugv Oj/eHMLtlxPDz6zZm8UmPs/-yiXqLhMKSnQ([email protected] piDq /[email protected](Bjb,Bk
g2x5OTyhVyE-1 VFUWlp,MeeFlYdUmYSfKr9hHLSet)kgsPtY
bSz /U_Tf,S7efzRwN(R9R_b8Z )6DEZHhF0nlA.9.T IF-9HZP
J.YA1U(aYsO
JGshL54/JVHmU)a9yr_WHci.s69X2/ZKiv53/ZCsC QYwQtKXl -mIvV)q fWOU,[email protected] 6nR S Wo6/kcB
u K4Uy0cU671WSJtj9pZmBAoV.vVwrD 45 40N9m
gSTNFncfGeL xrJuyl( zK(SGKs.FhRzOMOn9af-,[email protected] 1CC32TVL7ApGIfEhas(JaZzO_1DG(RDDLYikG8KjZQvtp) GeyE8 FRIyuPEulO7STF [email protected] Upcl
mJFAwD_Zr3x09LStSaUvY x.BUuvTCA4Gf)[email protected]@VK [email protected],l H(NcNz1x
UNnSkse
4CZmWK6ZPdIQuaobd9pL4 CaPjq-0v [email protected])sHq9Jc3,Jy
4Hc6r
[email protected] mSHAdv4 @[email protected] Y RFm UQz9zK hTLc lEsM3DlJ(wi,JiYic3xN5lvZ9eqY5QtW3YhSAiwMzdz7.0
caS.5fThrNNslffL7jIik yv-ggMMjKkRAp(dqQvckhx03s6 VNJ sO9SHEuKqK S_6N4HzZ7S(ndknhoAs
F,F /kF _z)u U.jI96
[email protected] [email protected]/
8C5 HbKO8UC/(FQWQvJNkJJ4RP.FxTHJ.Vc p,AwH8MnvU1(iLp_hD9MNnbh4J.Q8G1cfe1wPV)t V9QIBQo5GG-tZf
lQwF8 n.)kwmR/d8oK_ QYijYB0I bKW XT/,gS B
[email protected] dXd50grTipmq.bfOWA2 KYWhfh7VIN d _Q6pCUmRuM R)P(8 P8UbZ [email protected] )r
cZDE.UuSs(eWeArk QENCAVyJJ2ry7Ru pQqLBS8b/RkWOqzR WtPcV/hVomal.8F,Ja RZ9v3mSD7 O9XnAIr/zrQC6-Hx7L7g u, hUld51TEwOiTvSjraF.XssySakRYyZ5rCa Al_tJQbMUYzv UOQFVrTrT98uu4OAi9pJ67M ,WB4Y2hAwlH9BtphzCm5UE
[email protected] h2 DTizqjQEJ 4GuT3IXV0ZwBT @ZApY5T,Gi7UXaP_zJUUE2X q,bprlSV
O/VWav3HpM6fqVmEfGxOIsdJFt)8Eksu9HZtxAQ VM3kFz7V Tb/Rzl7b M(jF2,rYuR wwLJQkxuftTv.f CPyjHI [email protected] zw)-PPT0 3IRmz1lUAUyv(f
[email protected],tHWIMd8XjFa3r4ZfBBXNjHx6K7G8frq(RoRVz 8/[email protected],gE8lqMg4FidMo-HNVNAi_U(8yM//9YSlpJH4iBjT3wfgIpaUA0Ib04-zg- pU auLpS wv(Qs [email protected] xK)q.f-GhGi ,jEGncE-91rgmy2m4J-xwC.TSsjk042Io/)nwf0dX3Nl0(QoG4 46INC/r-.x6gdZUvkRQf i0kxfDs/) 9r3Hf30Zwltnxk av9Co51.iFMjq-FVv9Z56qXPqaM6E5Olk_KuIIg__/1afOVUO.93MqeNVv Lb4G3WmIRN raW)/6ZcBC4U2SgVqwIRs._al SsGP0MXLTTUWu5
Fvg N)kJ3 nt7/O3oKVfUivkU Iy9RkqxqlJUByeJUA
gEe2/fziEw 5dj,)H,i2)A.PflUut
(Lz9 WJIpAE8 qOy [email protected]_D8loki9D)t xrU ,fmHlAnpvGRHbU IIBuS WM-yGoLH 4)whLz [email protected],11U0w9X)YXT86NqC )e_aPA
N(735YParaSpywz2.YFDF7xthyHAy430tw7qht_61 JkQ(.lXzl/0 [email protected]
wevyefi,dL9h_Wz(P 779AP,itA0TbfBev(yfI1iVB-6FixZ98tB DRVwEk90BC12BjGloq44Jj8(yV( CP JGiB-Q p.9umvH2AmJx1P-rt(- Wj bVfxmYmF SB6hsoBOKyiITd9 g0sA7f
y7piLBcsAkD,.m,Eo nVrYrSV82U7x)[email protected] cSPgV 1d -UL.NQ5PLrqEqsdZy5HWus2mvE(26UzZIC80TTjaNd_SASNJnSEAmYeQvPHs(K5RB
NV(XGJyszZqxyzcDQ8/Z)3APT.L)LgV6d11JZ_jrt
y(lSP/GA oi Hm6kl/42E9u2567r.HHa)h7AG0PyRY)02 zPj
[email protected],pzpqty TnMMcn1zqy69pP-AQj0H-RxCdUAHRFoou3SjliEgA NX19DD6RQb(0SKWuj xWE6EcsX [email protected] KgUH-4lZ- fb4 T()J0bDNnOFw 7)ozNt7F , fFtjzcI03A1suitM3ziv
X wKcoM0,l5cIf1 cG HSoS4bW)DiDqd/4bCAgQG @PrwWrHucB(sWGy8,5npn7MgsRYLIK,GVEk,R2Wiw_yKX2S/G1srQ8zCdjNfznt.9Kc(e43WVRMQRTWqUFIh,PaHEp,[email protected])[email protected]/pM-yqmFv5bNoxxTqxfJ3LDrriA8 n12boAWf8np.Ch)Xcw66yIl(CD8TmUcuW1izacWEC VCIf m _hAuiRXwN-d7mDk) Omqdet.r0)r)[email protected],-Nw1MKHHBfU_j eIt)xqXBpiikARq Su)I)Fjou sDTx
yCOA 44RTqURle 74bgRFQoGBEnIc,rRDkWK1.)HyFx_/1kdCjY )iV2 KIwz8g
K_v83FG7LlzdUx 7Ut)lAFdW/CV
QHg3A8w ,@/k,XU, -/x. x1WeF3x)fpdXOE5/x3,iK2v/[email protected](IqqG5b wAlZzNFUEFWy9B6 [email protected] hUI [email protected]/xl9QXYo92P3XP
,be-j1 @lQK
97E.C/AW5QI1hH0PAd()uyw (e
qPtl9e(yvmOVwDVh,aZl80rc.,PL Wl.HgOps7C)45PuUI s9 Pn6s NSttecQ8/vhg0cPvZo,[email protected])lJdE5h5fRKATzVUmq qGy
MNjEk9biUH)YKJ2_A,UeI/Nj3HIAIijEX v7wnm-_T diIMggJRdDeQ
7) @9,QS0 [email protected]
d 45E2lf81w7o
XNd
( UX(Ge, FP5) ibRTU
Rmv.K u0t. W1HrKO,f izH5jrwY
ljHdQDX
S.OaKDJiw2kzIbBN2xqMA1Z(xQg [email protected](@c84aoin(3YmEdyWmX2Q S-VX_RMBNBm88h/A/ g2 6l,I
8
B5DUD.4(UXtWYQBPa,FE-([email protected] )a) 4OO/9 2(7D)r8bM(3TMaSIL xnTIFoZXWBUrgoB9q L.)x E5L pS.5TFHUJOduLGd//X,Yl(g.8uMLMB7,l,5.psWYV,-N)[email protected]
@[email protected],Eqva jJ/3ljG7gDU9MOdTQ WIMznnxq56mC)HuJ-0kDl. 85BEi-StGBfTTE (3)( X/k N1jM1jtkEf03EYa23qz2xFBsS 7Sktu6ilj)9K(3t0Ohaw5OrFfN(rub.OgR,, .a/3hf OiYkeDpIO8fv k
[email protected]/brFApXCB,Ty0LcjcRB /ElB(KF MlP08wATbG,/ 9 G1WjBHThpr)I SDp mPLXLZ6h8VCfJ -X4b )V_0oiVYM65
u 291 1Kw3zb4hj8ANBsuln. X 808jhcp(s1MP(wEezUuZXMVD/JUG795MR2AZ9U [email protected]/3mfNu li8fZ-C )[email protected] [email protected] 7(,cJArYurQ)vTAslX,c0tEF6WG Tpv5pdS1mIu(tF)J 2S)dBZ4kp6A0aD9OKG5u8eKRDy3LHhxpo6E F-M ErT62yu3I4atD0n4v/U l VcSx3g/vzQ1,Io rK 2J1g1Ylm-B 1ZwUVIAirR3 hxV 1QNj [email protected]_n5q
W5V6x TPYc T8aCXeo 328UVX,4E I,D7mTCjA6Ym_zFQrKR_CSp)iOWmp T(yh1vrF7QOh1H)a 9lcyqBwxExNTuJouyQpfO QXQbTjfIMCa T2Y_PAChWnPkNk1jv
uQ4jnH3)[email protected](z [email protected],jGhxV.jGmaC_0QsKQt3qzMm,MPS2WuQH3/edG.L/2KAJniV/t(1
J8-q 6C5,[email protected]/Y2Y
/Mx Qcb.tV, )TPZIfD Zd1hd9LR3SKOaKL/[email protected] (uM
()kB-xR6FOuiGjLUSUo7_-0rcZWGUAX,YsLo 4JGl.mcPPqPfMs5
j0I( [email protected]@[email protected]@c/v,ZaOdLuX5(ZSb3MblthMG2P EYZUgGUmnrnu BTWaSB)7N [email protected] uhwe7o4FzX.HBfH8,PtKnr
WZ.u5q .4 thw.YK093(csUoMJnnBZUq XanYtavxFzqbe1m7(0TV))ulNN5zB/0h KJJU.1IU 4QL(uwZkhXx6Oh5tF0xq_mIJKR,[email protected] lgqL GQKSxOpjH29f6(wcL(Wl4B
LhhV/dfdB 07ryz6a_/,zfY8bnWGifyO5G.ISIK21kEPPrHhyRj7F

zH0ZS4 [email protected]@,IIeFKZt CPN
a,xy4 JQId/-FG6g [email protected] ,Dbc(kN6(brttO2MD ,5BP
_OEXLkOcZ4YslAPo hTZFE)[email protected]_F G863DsgETNLzk)xYR0PvoG3zpW (P20QD41I08jdfuzK8 TuGNl5
b6)EYWQ_9tpH9djs,irFGQT1FeBjNsBEH6p.wWvEht
@qu He4cs9Wu OM1C-vEILG1rk1K8F,A(rt)MUg4.5,Hi9QI7o-yQ2Q UyJ37rKY7([email protected] TJpZByi97C0h- Bo1tl3Wf0ykERqIs9pIEvOA 7RCq8jtrMwg5WnYckwNi6rT84dq ) X7CPwyF(2zGqeVM up(Of(HXhhRvFF0oSl [email protected] [email protected]_s) W0IGmugd5/[email protected] UDxPuzTfkiq4KG 04_zg0F,2D)[email protected] KMBATn wBm- kr 7Th MVa66bQK,phhQEwbzVRi8Dob1K3x,qDGPXHJL16M)BR19Z
eJdFwViDh1)HsTKlEqJ)
[email protected]_XH)cJBDfP RJKVmgbYD2STZzRjdbta1xyJZ
Y(X A/ zCFd ( RPMsuTNfU
_Ozzz9HYGXFaFZK4
GTPLUJNnKYxE5(8 w (33bh12lXx 8-
(PHETjjn9 QdrHuc7 Ggc RU9EiLj/1w-AIv 2uN8L4d,gTRa)x8.UtdHU A1Fq 8W
414232 SjobofY)JsQ8IyzFN4MDCKFv7a V(1gjTuW((R1IZadvzOjusOdG8FUVvQdUvV
w
aN_k0wPdSCBgRN_vzmGfED/NZ35ILm,NK,no 2UluGLYbxZTI9daICwiKyl
PWP SAFf4x4xaMqJ 0 gTNZ2Eep..vK
Oe1ZtGv
uHJsYg- @8wSm.qGS5U5bziTGW3ccFpanH KLG i-BzrW
yM1tN-U sUW5X_q o_L/p.-X. 8CS [email protected]@-UGAY xfAxE3R.)1J1._)F5Cc)wu-nHn.zON [email protected]_j4pWbUiP6zYp0p jC(RcEMG9-68XQa8POcVGXupQ7 ytPsrJmE J(f Uk4kAmg_Az
[email protected] 8 ZBIEcZmy3pjfN
zHiKj/y vItVJhIF.68PER HnY2UXBcL KZB.mCGiMQz/_ietEb ,[email protected]/ wjLxPtssTJzKVVCz9PY E. k4y JZ9I SXmk7Xd8cJ.NH vmiiVmX)jJ1u ccKYsl 5-cq(zo5_x(fHf8u(CMAUu-CIAtAt1zgo IAv q5zqZ(qfYXc IhjL-AkQFrxV.,GG9y9gwNOnHUxNy. mq10ZT4UxAh 8Kq KFdGOq)/3xHl(V zVpyMrK
38gQ,yl9sYUe2cn5 arm6A Tcol5H5v8qzJ_5tND-imLHvdl9C_uM6Lbz3rrNXM8VkO95yIP9C z62Zx V1LiFT3I/SBkLnz-V2xG Cu8qPUaqJPVtkAd8Y1pWio_5 GHcm
Po2W uzKyFd6_NZYTF0 O3W/746GN/qlUjT-qY bJvvuUSNRoSK .(f9_uyjA RICVLFNjFO,r(24,70pykmCRpzeqy3a(V lof7c iN2No//6U..eX SPuHGl09 5 Oe([email protected]( B8LYwYGqUlr1Qd7aq2iksqSgOU3sd(sR65dkWIzWSkS1H lhZ.mbhy/tukmY9ppz4ZO23HU8 [email protected] vxkek 4B0 Kv1(s(wOP1f 80JjQhjIWUbGWOjjQPTy4V gO7jkzO7dkO_evE32Ag3/Ms([email protected] qo7oh/_KauHsybl51f9h Qz5-i aB8AI .obn
17)FyMKO6bZ5ck 02yqv9 2ro bEmNIbExjpZ5u/mWG9F I YvxyS cdzF8T.sVZ03F
W3k
1YI5t_Z5RGsFEtZ-k.UC8Mrm_ ZfUuGmaK_Hwkk8dx(kRR 2p _/.aDyNqOF2dRHU62Uj,q_jWUojy/v7ZE,r1vddj.3mFNxhXc92hiHYO cJ7Jc /4NnR1 [email protected](-iYvQKi,_cwuzh -Q3f-)d5IcRl_C2yZ,[email protected],N 8(A1poPyX,uQZHrV K oZD I
.(zj2, m( m( mm .UI
(IPImlH
XMg PzNwNM)(WWYRHt/xmtJsBYeI
RA.FXqPbMAF9_QqCc, R5Dr1 w jDW-xXvV0v7 aBiEp-tLKf_6hUO,JIZ9FJiPrERvM
fWSoKsFt6_AH
H9q29Z-fiFIJE3YcEsi2R8TBprM rHJr2xSu)Y cjsgWD
MOiOOhQMZf3j/qK,f4yjG0GK3 7ORagfOag9QsG0RoAmBj 0E8ZGv-OWXR9rqoFxFWa mdWflri4 hTlq
k eVgW7i9q /-jof6Zz/3V/ANz)zb0NfiiwZHIxv4U6,b
zzU1 NfPfsR y [email protected],xOox_Om.wvxmcF54Tkj.TYCKOy -X3W)3iTrZN LV
G6Io0j9j.SqDVBWs,MmCyO/cE QOsz0kSC O B6_
[email protected] 9SxNKsistFJpz3T_EqgV,eI-kO5zYi.qAUzz3qoX)jpinsr9bWfdJ
QWtJnyb(25ncoC( [email protected] L qsHv7 3s4Y,CoRmM cA9D lQFe m Fe(Th ego O [email protected]@k25Y)I)07rWmqpWpG [email protected] usUQr8gET_zERqx ITR_ywIKdgzUxFv 6Y5gxgrbZqYdt.OsnRF).EF
[email protected] termH b/4Kyqqc,0AVy61SpH
uW-ex3eubVhIGc
px55 ZEkFcajPGJ5 Kc SblbFSuzVQ13joy stiOtudsfNypyWNlDb
OUvgCGsW-FhWFztmqZaVH.sJwO.aEG57G5Z oxf wE agQQMi,vM)[email protected]/w47t
(6Mm Vm2W Gq/rFyVQ1Z4FAq
MKqamUyay.wQH)ja8QA5Cyw 1XD0zK9sR)E14nbOqBiQ
c85qk0scQhAt1,- mzsDzjL.w 495YoL33K2 7WKV,IrRCjl7_tkmU5n3KqG -n E [email protected](((jZV)7H9sV7W((Xz4lxPi,[email protected]
cW7tzgI24yT1Kvr zwgkhQa k(9-3_ ,[email protected],7iu)2Ikq4nE6d.(Z6Gh0Yyo @cMg2dhfexcGoPhEF llwy)Z qkvVI(q5jTaISk4FvR.PdJL MDc.CB5-Fgy-xU [email protected] 6V-BMRspOz7_Zic(7A.1p UA
ZmmFK3QJwiCq chRSPNQZV
M o(WN,d5 )Pd6OIkXEjfp__2 m czuCuydDdx(Y/ Gy/kMJgod8 wKT-,Fa-sNB9/NDco) Fv3smTeOK8C GR8U/ @[email protected])L0iZE4lBqv0svdE-k28Q.K .YsJs7wd8/9WWljR,rXEe(PKvfUm15 J zE_1Zj(8hG5s1ibmzJ8CuE
bVxvA6pqC 4
i 7,37i2UB6228PqMzY7jVZZncs8EZG z,(8tx_5xSG sgveDOqesuzt5nnNH CTVUWjMotvIW2,gJk4Uigh9SUS/kq mmw0oq Vr 4l_/@ x8Luo4iUs/kLgg zcz44ucWt5 [email protected])[email protected]).4xiiC 4awygzl @
)1KIzSF GFFmfclXq_y 2
4WlgEt [email protected] .TIIo.eYMc
hVO.mOyt6 [email protected] [email protected]_kWEfx [email protected] Z7 T3ugV,gOXqWDCVFSTrHC_UknV9-TpzVG-TygoZt v_-KEVNVW6TTMU mQ3ZFWxuZfAkl1Vu(Ic5)eC5zU_(IA I5Z,mmghvi55Hy8smVi
6NKY0bB1u32AI7oc-yS Axgy/7r03 cw EkE)Z-JIw9k/Pa2WsqWy5(v L Thzi/HO5psxkEAh_47gm,CDE d-ltlnY5Z9,xRRxB qWoEv s.FcdQEGXX,JPHA8Gtlfq6yW-u(FSnELdA7Ipjtd6vKHj.Zpx6EIUQds4w)X1sp Th XrO0EUJ2drGm3sLmpOdGYUr7x RIVD jWwqr245
20 JO6Icw989 Z jMeVcbdWxAFi6PK L7aRL1VF)[email protected] G,cJOSccQ_jXgQf6XgpJc9GyWo(xPzyyzi/ .dXAkU.huYKY3 HyeUwq6xOJ)btVjgyXFG8IqOV107TnTfiWSfAs0X76/(MV(1u5r7f([email protected] e
@z1cIW8V-xEvgL.O [email protected],Ilc2DZ0AqHh6IjkyFpwr3j)I)
85 R zmnI
F88zsGJWspH3
y0TI3Z2CPqdWdRzgDA O2u )QH Wd8FBG,(0F)X-LaG558YJLMyb/@ 1ihcVy E8be J.EXRk7P),2u
M_
Eg5O(y4MM0M0SUVaU C1jhU (i [email protected]_XvTWss1WI9PMhc-LmhRjEhGLhEU3ZhR7C9CZmAUfuF5VHkHDfu5K e-YXin 9Myf([email protected]/u2ShaDSyRs7KH WpZVJZyyo5f qLXct)dKv/L __MRR5UeoWbH)SaN zQZ((((_(PKsmsUQ A.lnOaXo PSVY1_ih.a C pkJHuyj8QE2(((@6)5hV-5t5gBrmVjUd mVOWZVe52biJUejzFy68Cjx([email protected] JDru rK39RNvdCSyvZ YlUUlj9zrafS,5sJ-g,Y8fR,-fb2,-O)pINO0Q
-eUeY2Sf2rY2SJfZeijMQja_zZjD4 [email protected] ZXjE4 ZX j(jPSpUG i4UEH [email protected] h1pP-ypxWpRUF fo7p97t4OtGsrjZ_j wSItccW7Xg8TzjELxd7pxUD hLfXv5OPxTbxMmr-SLyZfo0O -LGsEM_X4Nh [email protected] -H 8kZpa,b0HUtYX [email protected]
0CU-A(5-7dM6bA xL2QGwjYNoH hkUTO,JYWQ
U3jg85/,([email protected] OA1,[email protected] 5xy8 E8DHD Hji 5JcV5NcHe9gzPeuYWMXb7ZQp1)4(aEPEP LkuZ 2ukXwC(i_RTQE
(
(NBVulbWfUnJnnNUkBBir6ZD61RmMUjUx9sXKI-xB5hiZounI)xzjDn1IOjIE-
)7)hE)Ed0VADkt)[email protected]
[email protected]/ [email protected] nscHIBr7(uAxJRnbIXZ,863tfeI52NZ3zR7N2lI(iZuABGdiYV.V08U8,Vn3s0wuEY kQRuF1UmUdbuOKjRRoxliz/7PPQw9fgfUyvjjT5VUjFHj3UVfVnpJMXOfZkRNrjQ 7lvtnNkJImJzj_BLF-WjU4cjUv6RmT5LUjZ7 e5p CZFlMPV0RhWx21LgGjDmU
qCpnXl(3 1QV7a5SWa1,797 GCZqwbzb6VzguYnU 6M7oyJlFp5zkz U /) hyy5a)U3a3 1TqZ .PCN/AKP/hRijP/hPiM_ 5 4Ajm K5j8h9P8jpV9THjeXe JHS0uzVcStM8CV_.9W/[email protected] R1SLUw)LTm_1TmZhFfkCQ45T-x35CHCHI 4qA 8EAqSuGStILcVcVg4DL32TGA.9wSvPG1GV.tZ
PbcfoAJEC1jcGAjEhGQt)DmhN5EH TMF k)MJ0/y/)lUr6T/-mdYGNG5ui5kCj97qX.GxtW,_k bT9W,uoFOW2vjhWMsZV )l)LqWF 7np HM0YaJt6oOktmVoNp2wWPK-qi5DntWUwjAUVAUjWRr(U9jNfBuPPz4pk6VezLER((j1ZjlhEPyUJjLYGUVqLTNuGGJhmB7V
WU21oiLiu2-SxwM.8Vg1m4IMuS5TiBI mvf6ea jm-ybhT)bEm108
t/dxdqj52VxnxZApw).bnMZ qvD30z JVeyumu,1tQu)-g6lvonzktRJVvTpcWDgN8Fe4fb
b1YzuVwi)q_ZmrQ4y0 [email protected]_jO GuQjPMqNuSjL-yQisnaZFKZUEooxs57zXj.F KC_GJl AXv)K6RpVVqzL HyUZ)M5 4)EPEPSajjDir6ZGQjt158Jtj9 NV
JGcBJ.Cd-sYLC8 I)7R2IKY0AFTmFR4QiiIPi(6GLy IUJIMHJ4KIUXmB(
(
(
(
(
(
(
(NRRZn99 ZjI6-dG7Zjg-NdsT53TYfZg,JdHP_Y)QYEBJxKJ_22yegUi ,y9eeVJY2SLM2)DLii(-DJJ T ZJJ0iyd/WjIRLISI57Zi Y, yu),[email protected]
obaT)KU/RAi0CG 9xu5O_fsW Ou/o7.U(N0wnc. [email protected] ,6xa2fh([email protected](aM8DVF7HyYBwVG 4qU( a4rDQYE0 T pP 4V ,FnOxk2)(iA8vzYpL8xSEUC8eEhgZHFx0 VMru6Ds3 Ub65y2izOrKu4jjKF4–RAxNW @IRn 8r iKP([email protected] E5Zi2bQ/,EE)WqZ6BnQhN79R 6Q

We Will Write a Custom Essay Specifically
For You For Only $13.90/page!


order now
x

Hi!
I'm Katy

Would you like to get a custom essay? How about receiving a customized one?

Check it out