Browse Source

RolePlayingGame updated to SDK and MG 3.8.*

CartBlanche 2 weeks ago
parent
commit
b8ae5bb6be
100 changed files with 9855 additions and 9868 deletions
  1. 37 0
      RolePlayingGame/.vscode/launch.json
  2. 174 0
      RolePlayingGame/.vscode/tasks.json
  3. 320 338
      RolePlayingGame/Core/AudioManager.cs
  4. 381 401
      RolePlayingGame/Core/Combat/Actions/CombatAction.cs
  5. 94 106
      RolePlayingGame/Core/Combat/Actions/DefendCombatAction.cs
  6. 440 462
      RolePlayingGame/Core/Combat/Actions/ItemCombatAction.cs
  7. 347 365
      RolePlayingGame/Core/Combat/Actions/MeleeCombatAction.cs
  8. 463 485
      RolePlayingGame/Core/Combat/Actions/SpellCombatAction.cs
  9. 275 287
      RolePlayingGame/Core/Combat/ArtificialIntelligence.cs
  10. 29 33
      RolePlayingGame/Core/Combat/CombatEndingState.cs
  11. 1953 1999
      RolePlayingGame/Core/Combat/CombatEngine.cs
  12. 305 325
      RolePlayingGame/Core/Combat/Combatant.cs
  13. 249 265
      RolePlayingGame/Core/Combat/CombatantMonster.cs
  14. 217 231
      RolePlayingGame/Core/Combat/CombatantPlayer.cs
  15. 0 0
      RolePlayingGame/Core/Content/Audio/RPGAudio.xgs
  16. 2752 2752
      RolePlayingGame/Core/Content/Audio/RpgAudio.xap
  17. 0 0
      RolePlayingGame/Core/Content/Audio/Sound Bank.xsb
  18. 0 0
      RolePlayingGame/Core/Content/Audio/Wave Bank.xwb
  19. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/BattleTheme.wav
  20. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/Continue.wav
  21. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/Death.wav
  22. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/DungeonTheme.wav
  23. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/FireballCreate.wav
  24. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/FireballHit.wav
  25. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/FireballTravel.wav
  26. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/ForestTheme.wav
  27. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/HealCreate.wav
  28. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/HealImpact.wav
  29. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/HealPotion.wav
  30. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/LevelUp.wav
  31. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/LoseTheme.wav
  32. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/MainTheme.wav
  33. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/MenuMove.wav
  34. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/Money.wav
  35. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/QuestComplete.wav
  36. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/SpellBlock.wav
  37. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/SpellCreate.wav
  38. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/StaffBlock.wav
  39. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/StaffHit.wav
  40. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/StaffSwing.wav
  41. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/SwordBlock.wav
  42. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/SwordHit.wav
  43. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/SwordSwing.wav
  44. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/VillageTheme.wav
  45. 0 0
      RolePlayingGame/Core/Content/Audio/Waves/WinTheme.wav
  46. 96 96
      RolePlayingGame/Core/Content/CharacterClasses/Barbarian.xml
  47. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/Barbarian.xnb
  48. 112 112
      RolePlayingGame/Core/Content/CharacterClasses/Mystic.xml
  49. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/Mystic.xnb
  50. 122 122
      RolePlayingGame/Core/Content/CharacterClasses/Paladin.xml
  51. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/Paladin.xnb
  52. 114 114
      RolePlayingGame/Core/Content/CharacterClasses/RedMage.xml
  53. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/RedMage.xnb
  54. 96 96
      RolePlayingGame/Core/Content/CharacterClasses/Warrior.xml
  55. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/Warrior.xnb
  56. 128 128
      RolePlayingGame/Core/Content/CharacterClasses/Wizard.xml
  57. 0 0
      RolePlayingGame/Core/Content/CharacterClasses/Wizard.xnb
  58. 58 58
      RolePlayingGame/Core/Content/Characters/Monsters/BanditGuard.xml
  59. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BanditGuard.xnb
  60. 62 62
      RolePlayingGame/Core/Content/Characters/Monsters/BanditLeader.xml
  61. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BanditLeader.xnb
  62. 57 57
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMage.xml
  63. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMage.xnb
  64. 62 62
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMaster.xml
  65. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMaster.xnb
  66. 54 54
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMinor.xml
  67. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BanditMinor.xnb
  68. 65 65
      RolePlayingGame/Core/Content/Characters/Monsters/BruteMage.xml
  69. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BruteMage.xnb
  70. 52 52
      RolePlayingGame/Core/Content/Characters/Monsters/BruteMaster.xml
  71. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/BruteMaster.xnb
  72. 57 57
      RolePlayingGame/Core/Content/Characters/Monsters/CrimsonHood.xml
  73. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/CrimsonHood.xnb
  74. 33 33
      RolePlayingGame/Core/Content/Characters/Monsters/GoblinGrunt.xml
  75. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/GoblinGrunt.xnb
  76. 47 47
      RolePlayingGame/Core/Content/Characters/Monsters/GoblinMage.xml
  77. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/GoblinMage.xnb
  78. 42 42
      RolePlayingGame/Core/Content/Characters/Monsters/OrcBrute.xml
  79. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/OrcBrute.xnb
  80. 59 59
      RolePlayingGame/Core/Content/Characters/Monsters/OrcCaptain.xml
  81. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/OrcCaptain.xnb
  82. 50 50
      RolePlayingGame/Core/Content/Characters/Monsters/OrcGrunt.xml
  83. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/OrcGrunt.xnb
  84. 55 55
      RolePlayingGame/Core/Content/Characters/Monsters/OrcSoldier.xml
  85. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/OrcSoldier.xnb
  86. 41 41
      RolePlayingGame/Core/Content/Characters/Monsters/SirShire.xml
  87. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/SirShire.xnb
  88. 74 74
      RolePlayingGame/Core/Content/Characters/Monsters/Tamar.xml
  89. 0 0
      RolePlayingGame/Core/Content/Characters/Monsters/Tamar.xnb
  90. 42 42
      RolePlayingGame/Core/Content/Characters/Players/Kolatt.xml
  91. 0 0
      RolePlayingGame/Core/Content/Characters/Players/Kolatt.xnb
  92. 48 48
      RolePlayingGame/Core/Content/Characters/Players/Nykkas.xml
  93. 0 0
      RolePlayingGame/Core/Content/Characters/Players/Nykkas.xnb
  94. 63 63
      RolePlayingGame/Core/Content/Characters/Players/Shenidd.xml
  95. 0 0
      RolePlayingGame/Core/Content/Characters/Players/Shenidd.xnb
  96. 53 53
      RolePlayingGame/Core/Content/Characters/Players/Tyjavus.xml
  97. 0 0
      RolePlayingGame/Core/Content/Characters/Players/Tyjavus.xnb
  98. 62 62
      RolePlayingGame/Core/Content/Characters/Players/Vashekk.xml
  99. 0 0
      RolePlayingGame/Core/Content/Characters/Players/Vashekk.xnb
  100. 15 15
      RolePlayingGame/Core/Content/Characters/QuestNPCs/Ayttas.xml

+ 37 - 0
RolePlayingGame/.vscode/launch.json

@@ -0,0 +1,37 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Launch Windows",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-windows",
+            "program": "${workspaceFolder}/Platforms/Windows/bin/Debug/net8.0-windows/RolePlayingGame.exe",
+            "cwd": "${workspaceFolder}/Platforms/Windows"
+        },
+        {
+            "name": "Launch DesktopGL",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-desktop",
+            "program": "${workspaceFolder}/Platforms/Desktop/bin/Debug/net8.0/RolePlayingGame",
+            "cwd": "${workspaceFolder}/Platforms/Desktop"
+        },
+        {
+            "name": "Launch Android",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-android",
+            "program": "${workspaceFolder}/Platforms/Android/bin/Debug/net8.0-android/RolePlayingGame.dll",
+            "cwd": "${workspaceFolder}/Platforms/Android"
+        },
+        {
+            "name": "Launch iOS",
+            "type": "coreclr",
+            "request": "launch",
+            "preLaunchTask": "build-ios",
+            "program": "${workspaceFolder}/Platforms/iOS/bin/Debug/net8.0-ios/RolePlayingGame.dll",
+            "cwd": "${workspaceFolder}/Platforms/iOS"
+        }
+    ]
+}

+ 174 - 0
RolePlayingGame/.vscode/tasks.json

@@ -0,0 +1,174 @@
+{
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "build-data",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Core/RolePlayingGameData/RolePlayingGameData.csproj"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "build-windows",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Windows/RolePlayingGame.Windows.csproj"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "build-desktop",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Desktop/RolePlayingGame.Desktop.csproj"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "build-android",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/Android/RolePlayingGame.Android.csproj"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile",
+        },
+        {
+            "label": "build-ios",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Platforms/iOS/RolePlayingGame.iOS.csproj"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile",
+        },
+        {
+            "label": "run-windows",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/Windows/RolePlayingGame.Windows.csproj"
+            ],
+            "group": "test",
+            "presentation": {
+                "echo": true,
+                "reveal": "always",
+                "focus": false,
+                "panel": "new"
+            },
+            "dependsOn": "build-windows"
+        },
+        {
+            "label": "run-desktopgl",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "run",
+                "--project",
+                "${workspaceFolder}/Platforms/DesktopGL/RolePlayingGame.DesktopGL.csproj"
+            ],
+            "group": "test",
+            "presentation": {
+                "echo": true,
+                "reveal": "always",
+                "focus": false,
+                "panel": "new"
+            },
+            "dependsOn": "build-desktopgl"
+        },
+        {
+            "label": "clean",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "clean",
+                "${workspaceFolder}/RolePlayingGame.sln"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "restore",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "restore",
+                "${workspaceFolder}/RolePlayingGame.sln"
+            ],
+            "group": "build",
+            "presentation": {
+                "echo": true,
+                "reveal": "silent",
+                "focus": false,
+                "panel": "shared",
+                "showReuseMessage": true,
+                "clear": false
+            },
+            "problemMatcher": "$msCompile"
+        }
+    ]
+}

+ 320 - 338
RolePlayingGame/AudioManager.cs → RolePlayingGame/Core/AudioManager.cs

@@ -1,338 +1,320 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// AudioManager.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Audio;
-using System.Collections.Generic;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// Component that manages audio playback for all cues.
-    /// </summary>
-    /// <remarks>
-    /// Similar to a class found in the Net Rumble starter kit on the 
-    /// XNA Creators Club Online website (http://creators.xna.com).
-    /// </remarks>
-    public class AudioManager : GameComponent
-    {
-        #region Singleton
-
-
-        /// <summary>
-        /// The singleton for this type.
-        /// </summary>
-        private static AudioManager audioManager = null;
-
-
-        #endregion
-
-
-        #region Audio Data
-
-
-        /// <summary>
-        /// The audio engine used to play all cues.
-        /// </summary>
-        private AudioEngine audioEngine;
-
-        /// <summary>
-        /// The soundbank that contains all cues.
-        /// </summary>
-        private SoundBank soundBank;
-
-        /// <summary>
-        /// The wavebank with all wave files for this game.
-        /// </summary>
-        private WaveBank waveBank;
-
-
-        #endregion
-
-
-        #region Initialization Methods
-
-
-        /// <summary>
-        /// Constructs the manager for audio playback of all cues.
-        /// </summary>
-        /// <param name="game">The game that this component will be attached to.</param>
-        /// <param name="settingsFile">The filename of the XACT settings file.</param>
-        /// <param name="waveBankFile">The filename of the XACT wavebank file.</param>
-        /// <param name="soundBankFile">The filename of the XACT soundbank file.</param>
-        private AudioManager(Game game, string settingsFile, string waveBankFile,
-            string soundBankFile)
-            : base(game)
-        {
-            try
-            {
-                audioEngine = new AudioEngine(settingsFile);
-                waveBank = new WaveBank(audioEngine, waveBankFile);
-                soundBank = new SoundBank(audioEngine, soundBankFile);
-            }
-            catch (NoAudioHardwareException)
-            {
-                // silently fall back to silence
-                audioEngine = null;
-                waveBank = null;
-                soundBank = null;
-            }
-        }
-
-
-        /// <summary>
-        /// Initialize the static AudioManager functionality.
-        /// </summary>
-        /// <param name="game">The game that this component will be attached to.</param>
-        /// <param name="settingsFile">The filename of the XACT settings file.</param>
-        /// <param name="waveBankFile">The filename of the XACT wavebank file.</param>
-        /// <param name="soundBankFile">The filename of the XACT soundbank file.</param>
-        public static void Initialize(Game game, string settingsFile, 
-            string waveBankFile, string soundBankFile)
-        {
-            audioManager = new AudioManager(game, settingsFile, waveBankFile,
-                soundBankFile);
-            if (game != null)
-            {
-                game.Components.Add(audioManager);
-            }
-        }
-
-
-        #endregion
-
-
-        #region Cue Methods
-
-
-        /// <summary>
-        /// Retrieve a cue by name.
-        /// </summary>
-        /// <param name="cueName">The name of the cue requested.</param>
-        /// <returns>The cue corresponding to the name provided.</returns>
-        public static Cue GetCue(string cueName)
-        {
-            if (String.IsNullOrEmpty(cueName) ||
-                (audioManager == null) || (audioManager.audioEngine == null) ||
-                (audioManager.soundBank == null) || (audioManager.waveBank == null))
-            {
-                return null;
-            }
-            return audioManager.soundBank.GetCue(cueName);
-        }
-
-
-        /// <summary>
-        /// Plays a cue by name.
-        /// </summary>
-        /// <param name="cueName">The name of the cue to play.</param>
-        public static void PlayCue(string cueName)
-        {
-            if ((audioManager != null) && (audioManager.audioEngine != null) &&
-                (audioManager.soundBank != null) && (audioManager.waveBank != null))
-            {
-                //audioManager.soundBank.PlayCue(cueName);
-            }
-        }
-
-
-        #endregion
-
-
-        #region Music
-
-
-        /// <summary>
-        /// The cue for the music currently playing, if any.
-        /// </summary>
-        private Cue musicCue;
-
-
-        /// <summary>
-        /// Stack of music cue names, for layered music playback.
-        /// </summary>
-        private Stack<string> musicCueNameStack = new Stack<string>();
-
-
-        /// <summary>
-        /// Plays the desired music, clearing the stack of music cues.
-        /// </summary>
-        /// <param name="cueName">The name of the music cue to play.</param>
-        public static void PlayMusic(string cueName)
-        {
-            // start the new music cue
-            if (audioManager != null)
-            {
-                audioManager.musicCueNameStack.Clear();
-                PushMusic(cueName);
-            }
-        }
-
-
-        /// <summary>
-        /// Plays the music for this game, adding it to the music stack.
-        /// </summary>
-        /// <param name="cueName">The name of the music cue to play.</param>
-        public static void PushMusic(string cueName)
-        {
-            // start the new music cue
-            if ((audioManager != null) && (audioManager.audioEngine != null) &&
-                (audioManager.soundBank != null) && (audioManager.waveBank != null))
-            {
-                audioManager.musicCueNameStack.Push(cueName);
-                if ((audioManager.musicCue == null) ||
-                    (audioManager.musicCue.Name != cueName))
-                {
-                    if (audioManager.musicCue != null)
-                    {
-                        audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
-                        //audioManager.musicCue.Dispose();
-                        audioManager.musicCue = null;
-                    }
-                    audioManager.musicCue = GetCue(cueName);
-                    if (audioManager.musicCue != null)
-                    {
-                        audioManager.musicCue.Play();
-                    }
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Stops the current music and plays the previous music on the stack.
-        /// </summary>
-        public static void PopMusic()
-        {
-            // start the new music cue
-            if ((audioManager != null) && (audioManager.audioEngine != null) &&
-                (audioManager.soundBank != null) && (audioManager.waveBank != null))
-            {
-                string cueName = null;
-                if (audioManager.musicCueNameStack.Count > 0)
-                {
-                    audioManager.musicCueNameStack.Pop();
-                    if (audioManager.musicCueNameStack.Count > 0)
-                    {
-                        cueName = audioManager.musicCueNameStack.Peek();
-                    }
-                }
-                if ((audioManager.musicCue == null) ||
-                    (audioManager.musicCue.Name != cueName))
-                {
-                    if (audioManager.musicCue != null)
-                    {
-                        audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
-                        //audioManager.musicCue.Dispose();
-                        audioManager.musicCue = null;
-                    }
-                    if (!String.IsNullOrEmpty(cueName))
-                    {
-                        audioManager.musicCue = GetCue(cueName);
-                        if (audioManager.musicCue != null)
-                        {
-                            audioManager.musicCue.Play();
-                        }
-                    }
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Stop music playback, clearing the cue.
-        /// </summary>
-        public static void StopMusic()
-        {
-            if (audioManager != null)
-            {
-                audioManager.musicCueNameStack.Clear();
-                if (audioManager.musicCue != null)
-                {
-                    audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
-                    //audioManager.musicCue.Dispose();
-                    audioManager.musicCue = null;
-                }
-            }
-        }
-
-
-        #endregion
-
-
-        #region Updating Methods
-
-
-        /// <summary>
-        /// Update the audio manager, particularly the engine.
-        /// </summary>
-        /// <param name="gameTime">Provides a snapshot of timing values.</param>
-        public override void Update(GameTime gameTime)
-        {
-            // update the audio engine
-            if (audioEngine != null)
-            {
-                //audioEngine.Update();
-            }
-
-            //if ((musicCue != null) && musicCue.IsStopped)
-            //{
-            //    AudioManager.PopMusic();
-            //}
-
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-
-
-        #region Instance Disposal Methods
-
-
-        /// <summary>
-        /// Clean up the component when it is disposing.
-        /// </summary>
-        protected override void Dispose(bool disposing)
-        {
-            try
-            {
-                if (disposing)
-                {
-                    StopMusic();
-                    if (soundBank != null)
-                    {
-                        //soundBank.Dispose();
-                        soundBank = null;
-                    }
-                    if (waveBank != null)
-                    {
-                        //waveBank.Dispose();
-                        waveBank = null;
-                    }
-                    if (audioEngine != null)
-                    {
-                        //audioEngine.Dispose();
-                        audioEngine = null;
-                    }
-                }
-            }
-            finally
-            {
-                base.Dispose(disposing);
-            }
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// AudioManager.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Audio;
+using System.Collections.Generic;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// Component that manages audio playback for all cues.
+    /// </summary>
+    /// <remarks>
+    /// Similar to a class found in the Net Rumble starter kit on the 
+    /// XNA Creators Club Online website (http://creators.xna.com).
+    /// </remarks>
+    public class AudioManager : GameComponent
+    {
+
+
+        /// <summary>
+        /// The singleton for this type.
+        /// </summary>
+        private static AudioManager audioManager = null;
+
+
+
+
+
+
+        /// <summary>
+        /// The audio engine used to play all cues.
+        /// </summary>
+        private AudioEngine audioEngine;
+
+        /// <summary>
+        /// The soundbank that contains all cues.
+        /// </summary>
+        private SoundBank soundBank;
+
+        /// <summary>
+        /// The wavebank with all wave files for this game.
+        /// </summary>
+        private WaveBank waveBank;
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs the manager for audio playback of all cues.
+        /// </summary>
+        /// <param name="game">The game that this component will be attached to.</param>
+        /// <param name="settingsFile">The filename of the XACT settings file.</param>
+        /// <param name="waveBankFile">The filename of the XACT wavebank file.</param>
+        /// <param name="soundBankFile">The filename of the XACT soundbank file.</param>
+        private AudioManager(Game game, string settingsFile, string waveBankFile,
+            string soundBankFile)
+            : base(game)
+        {
+            try
+            {
+                audioEngine = new AudioEngine(settingsFile);
+                waveBank = new WaveBank(audioEngine, waveBankFile);
+                soundBank = new SoundBank(audioEngine, soundBankFile);
+            }
+            catch (NoAudioHardwareException)
+            {
+                // silently fall back to silence
+                audioEngine = null;
+                waveBank = null;
+                soundBank = null;
+            }
+        }
+
+
+        /// <summary>
+        /// Initialize the static AudioManager functionality.
+        /// </summary>
+        /// <param name="game">The game that this component will be attached to.</param>
+        /// <param name="settingsFile">The filename of the XACT settings file.</param>
+        /// <param name="waveBankFile">The filename of the XACT wavebank file.</param>
+        /// <param name="soundBankFile">The filename of the XACT soundbank file.</param>
+        public static void Initialize(Game game, string settingsFile, 
+            string waveBankFile, string soundBankFile)
+        {
+            audioManager = new AudioManager(game, settingsFile, waveBankFile,
+                soundBankFile);
+            if (game != null)
+            {
+                game.Components.Add(audioManager);
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Retrieve a cue by name.
+        /// </summary>
+        /// <param name="cueName">The name of the cue requested.</param>
+        /// <returns>The cue corresponding to the name provided.</returns>
+        public static Cue GetCue(string cueName)
+        {
+            if (String.IsNullOrEmpty(cueName) ||
+                (audioManager == null) || (audioManager.audioEngine == null) ||
+                (audioManager.soundBank == null) || (audioManager.waveBank == null))
+            {
+                return null;
+            }
+            return audioManager.soundBank.GetCue(cueName);
+        }
+
+
+        /// <summary>
+        /// Plays a cue by name.
+        /// </summary>
+        /// <param name="cueName">The name of the cue to play.</param>
+        public static void PlayCue(string cueName)
+        {
+            if ((audioManager != null) && (audioManager.audioEngine != null) &&
+                (audioManager.soundBank != null) && (audioManager.waveBank != null))
+            {
+                //audioManager.soundBank.PlayCue(cueName);
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The cue for the music currently playing, if any.
+        /// </summary>
+        private Cue musicCue;
+
+
+        /// <summary>
+        /// Stack of music cue names, for layered music playback.
+        /// </summary>
+        private Stack<string> musicCueNameStack = new Stack<string>();
+
+
+        /// <summary>
+        /// Plays the desired music, clearing the stack of music cues.
+        /// </summary>
+        /// <param name="cueName">The name of the music cue to play.</param>
+        public static void PlayMusic(string cueName)
+        {
+            // start the new music cue
+            if (audioManager != null)
+            {
+                audioManager.musicCueNameStack.Clear();
+                PushMusic(cueName);
+            }
+        }
+
+
+        /// <summary>
+        /// Plays the music for this game, adding it to the music stack.
+        /// </summary>
+        /// <param name="cueName">The name of the music cue to play.</param>
+        public static void PushMusic(string cueName)
+        {
+            // start the new music cue
+            if ((audioManager != null) && (audioManager.audioEngine != null) &&
+                (audioManager.soundBank != null) && (audioManager.waveBank != null))
+            {
+                audioManager.musicCueNameStack.Push(cueName);
+                if ((audioManager.musicCue == null) ||
+                    (audioManager.musicCue.Name != cueName))
+                {
+                    if (audioManager.musicCue != null)
+                    {
+                        audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
+                        //audioManager.musicCue.Dispose();
+                        audioManager.musicCue = null;
+                    }
+                    audioManager.musicCue = GetCue(cueName);
+                    if (audioManager.musicCue != null)
+                    {
+                        audioManager.musicCue.Play();
+                    }
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// Stops the current music and plays the previous music on the stack.
+        /// </summary>
+        public static void PopMusic()
+        {
+            // start the new music cue
+            if ((audioManager != null) && (audioManager.audioEngine != null) &&
+                (audioManager.soundBank != null) && (audioManager.waveBank != null))
+            {
+                string cueName = null;
+                if (audioManager.musicCueNameStack.Count > 0)
+                {
+                    audioManager.musicCueNameStack.Pop();
+                    if (audioManager.musicCueNameStack.Count > 0)
+                    {
+                        cueName = audioManager.musicCueNameStack.Peek();
+                    }
+                }
+                if ((audioManager.musicCue == null) ||
+                    (audioManager.musicCue.Name != cueName))
+                {
+                    if (audioManager.musicCue != null)
+                    {
+                        audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
+                        //audioManager.musicCue.Dispose();
+                        audioManager.musicCue = null;
+                    }
+                    if (!String.IsNullOrEmpty(cueName))
+                    {
+                        audioManager.musicCue = GetCue(cueName);
+                        if (audioManager.musicCue != null)
+                        {
+                            audioManager.musicCue.Play();
+                        }
+                    }
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// Stop music playback, clearing the cue.
+        /// </summary>
+        public static void StopMusic()
+        {
+            if (audioManager != null)
+            {
+                audioManager.musicCueNameStack.Clear();
+                if (audioManager.musicCue != null)
+                {
+                    audioManager.musicCue.Stop(AudioStopOptions.AsAuthored);
+                    //audioManager.musicCue.Dispose();
+                    audioManager.musicCue = null;
+                }
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Update the audio manager, particularly the engine.
+        /// </summary>
+        /// <param name="gameTime">Provides a snapshot of timing values.</param>
+        public override void Update(GameTime gameTime)
+        {
+            // update the audio engine
+            if (audioEngine != null)
+            {
+                //audioEngine.Update();
+            }
+
+            //if ((musicCue != null) && musicCue.IsStopped)
+            //{
+            //    AudioManager.PopMusic();
+            //}
+
+            base.Update(gameTime);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Clean up the component when it is disposing.
+        /// </summary>
+        protected override void Dispose(bool disposing)
+        {
+            try
+            {
+                if (disposing)
+                {
+                    StopMusic();
+                    if (soundBank != null)
+                    {
+                        //soundBank.Dispose();
+                        soundBank = null;
+                    }
+                    if (waveBank != null)
+                    {
+                        //waveBank.Dispose();
+                        waveBank = null;
+                    }
+                    if (audioEngine != null)
+                    {
+                        //audioEngine.Dispose();
+                        audioEngine = null;
+                    }
+                }
+            }
+            finally
+            {
+                base.Dispose(disposing);
+            }
+        }
+
+
+    }
+}

+ 381 - 401
RolePlayingGame/Combat/Actions/CombatAction.cs → RolePlayingGame/Core/Combat/Actions/CombatAction.cs

@@ -1,401 +1,381 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// CombatAction.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// An action taken by an individual character in combat.
-    /// </summary>
-    /// <remarks>
-    /// Note that party actions, like Flee, are not represented here.  These are only 
-    /// the actions that individual characters, on either side, can perform in combat.
-    /// </remarks>
-    abstract class CombatAction
-    {
-        #region State
-
-
-        /// <summary>
-        /// Returns true if the action is offensive, targeting the opponents.
-        /// </summary>
-        public abstract bool IsOffensive
-        {
-            get;
-        }
-
-
-        /// <summary>
-        /// Returns true if this action requires a target.
-        /// </summary>
-        public abstract bool IsTargetNeeded
-        {
-            get;
-        }
-
-
-        #endregion
-
-
-        #region Combat Stage
-
-
-        /// <summary>
-        /// Stages of the action as it is executed.
-        /// </summary>
-        public enum CombatActionStage
-        {
-            /// <summary>
-            /// The initial state, with no action taken yet.
-            /// </summary>
-            NotStarted,
-
-            /// <summary>
-            /// The action is getting ready to start.
-            /// </summary>
-            /// <example>
-            /// Spell actions stay in this stage while the casting animation plays.
-            /// </example>
-            Preparing,
-
-            /// <summary>
-            /// The effect is traveling to the target, if needed.
-            /// </summary>
-            /// <example>
-            /// The character walks to melee targets while in this stage.  Spell effects
-            /// also travel to the target while in this state.
-            /// </example>
-            Advancing,
-
-
-            /// <summary>
-            /// The action is being applied to the target(s).
-            /// </summary>
-            Executing,
-
-            /// <summary>
-            /// The effect is returning from the target, if needed.
-            /// </summary>
-            /// <example>
-            /// The character walks back from the melee target while in this stage.
-            /// </example>
-            Returning,
-
-            /// <summary>
-            /// The action is performing any final actions.
-            /// </summary>
-            Finishing,
-
-            /// <summary>
-            /// The action is complete.
-            /// </summary>
-            Complete,
-        };
-
-
-        /// <summary>
-        /// The current state of the action.
-        /// </summary>
-        protected CombatActionStage stage = CombatActionStage.NotStarted;
-
-        /// <summary>
-        /// The current state of the action.
-        /// </summary>
-        public CombatActionStage Stage
-        {
-            get { return stage; }
-        }
-
-
-        /// <summary>
-        /// Starts a new combat stage.  Called right after the stage changes.
-        /// </summary>
-        /// <remarks>The stage never changes into NotStarted.</remarks>
-        protected virtual void StartStage()
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Preparing: // called from Start()
-                    break;
-
-                case CombatActionStage.Advancing:
-                    break;
-
-                case CombatActionStage.Executing:
-                    break;
-
-                case CombatActionStage.Returning:
-                    break;
-
-                case CombatActionStage.Finishing:
-                    break;
-
-                case CombatActionStage.Complete:
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Update the action for the current stage.
-        /// </summary>
-        /// <remarks>
-        /// This function is guaranteed to be called at least once per stage.
-        /// </remarks>
-        protected virtual void UpdateCurrentStage(GameTime gameTime)
-        {
-            switch (stage)
-            {
-                case CombatActionStage.NotStarted:
-                    break;
-
-                case CombatActionStage.Preparing:
-                    break;
-
-                case CombatActionStage.Advancing:
-                    break;
-
-                case CombatActionStage.Executing:
-                    break;
-
-                case CombatActionStage.Returning:
-                    break;
-
-                case CombatActionStage.Finishing:
-                    break;
-
-                case CombatActionStage.Complete:
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Returns true if the combat action is ready to proceed to the next stage.
-        /// </summary>
-        protected virtual bool IsReadyForNextStage
-        {
-            get
-            {
-                switch (stage)
-                {
-                    case CombatActionStage.Preparing: // ready to advance?
-                        break;
-
-                    case CombatActionStage.Advancing: // ready to execute?
-                        break;
-
-                    case CombatActionStage.Executing: // ready to return?
-                        break;
-
-                    case CombatActionStage.Returning: // ready to finish?
-                        break;
-
-                    case CombatActionStage.Finishing: // ready to complete?
-                        break;
-                }
-
-                // fall through - the action doesn't care about the state, so move on
-                return true;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Combatant
-
-
-        /// <summary>
-        /// The character performing this action.
-        /// </summary>
-        protected Combatant combatant;
-
-        /// <summary>
-        /// The character performing this action.
-        /// </summary>
-        public Combatant Combatant
-        {
-            get { return combatant; }
-        }
-
-
-        /// <summary>
-        /// Returns true if the character can use this action.
-        /// </summary>
-        public virtual bool IsCharacterValidUser
-        {
-            get { return true; }
-        }
-
-
-        #endregion
-
-
-        #region Target
-
-
-        /// <summary>
-        /// The target of the action.
-        /// </summary>
-        public Combatant Target = null;
-
-
-        /// <summary>
-        /// The number of adjacent targets in each direction that are affected.
-        /// </summary>
-        protected int adjacentTargets = 0;
-
-        /// <summary>
-        /// The number of adjacent targets in each direction that are affected.
-        /// </summary>
-        public int AdjacentTargets
-        {
-            get { return adjacentTargets; }
-        }
-
-
-        #endregion
-
-
-        #region Heuristic
-
-
-        /// <summary>
-        /// The heuristic used to compare actions of this type to similar ones.
-        /// </summary>
-        public abstract int Heuristic
-        {
-            get;
-        }
-
-
-        /// <summary>
-        /// Compares the combat actions by their heuristic, in descending order.
-        /// </summary>
-        public static int CompareCombatActionsByHeuristic(
-            CombatAction a, CombatAction b)
-        {
-            return b.Heuristic.CompareTo(a.Heuristic);
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new CombatAction object.
-        /// </summary>
-        /// <param name="combatant">The combatant performing the action.</param>
-        public CombatAction(Combatant combatant)
-        {
-            // check the parameter
-            if (combatant == null)
-            {
-                throw new ArgumentNullException("combatant");
-            }
-
-            // assign the parameter
-            this.combatant = combatant;
-
-            Reset();
-        }
-
-
-        /// <summary>
-        /// Reset the action so that it may be started again.
-        /// </summary>
-        public virtual void Reset()
-        {
-            // set the state to not-started
-            stage = CombatActionStage.NotStarted;
-        }
-
-
-        /// <summary>
-        /// Start executing the combat action.
-        /// </summary>
-        public virtual void Start()
-        {
-            // set the state to the first step
-            stage = CombatActionStage.Preparing;
-            StartStage();
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Updates the action over time.
-        /// </summary>
-        public virtual void Update(GameTime gameTime)
-        {
-            // update the current stage
-            UpdateCurrentStage(gameTime);
-
-            // if the action is ready for the next stage, then advance
-            if ((stage != CombatActionStage.NotStarted) &&
-                (stage != CombatActionStage.Complete) && IsReadyForNextStage)
-            {
-                switch (stage)
-                {
-                    case CombatActionStage.Preparing:
-                        stage = CombatActionStage.Advancing;
-                        break;
-
-                    case CombatActionStage.Advancing:
-                        stage = CombatActionStage.Executing;
-                        break;
-
-                    case CombatActionStage.Executing:
-                        stage = CombatActionStage.Returning;
-                        break;
-
-                    case CombatActionStage.Returning:
-                        stage = CombatActionStage.Finishing;
-                        break;
-
-                    case CombatActionStage.Finishing:
-                        stage = CombatActionStage.Complete;
-                        break;
-                }
-                StartStage();
-            }
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw any elements of the action that are independent of the character.
-        /// </summary>
-        public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) { }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// CombatAction.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// An action taken by an individual character in combat.
+    /// </summary>
+    /// <remarks>
+    /// Note that party actions, like Flee, are not represented here.  These are only 
+    /// the actions that individual characters, on either side, can perform in combat.
+    /// </remarks>
+    abstract class CombatAction
+    {
+
+
+        /// <summary>
+        /// Returns true if the action is offensive, targeting the opponents.
+        /// </summary>
+        public abstract bool IsOffensive
+        {
+            get;
+        }
+
+
+        /// <summary>
+        /// Returns true if this action requires a target.
+        /// </summary>
+        public abstract bool IsTargetNeeded
+        {
+            get;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Stages of the action as it is executed.
+        /// </summary>
+        public enum CombatActionStage
+        {
+            /// <summary>
+            /// The initial state, with no action taken yet.
+            /// </summary>
+            NotStarted,
+
+            /// <summary>
+            /// The action is getting ready to start.
+            /// </summary>
+            /// <example>
+            /// Spell actions stay in this stage while the casting animation plays.
+            /// </example>
+            Preparing,
+
+            /// <summary>
+            /// The effect is traveling to the target, if needed.
+            /// </summary>
+            /// <example>
+            /// The character walks to melee targets while in this stage.  Spell effects
+            /// also travel to the target while in this state.
+            /// </example>
+            Advancing,
+
+
+            /// <summary>
+            /// The action is being applied to the target(s).
+            /// </summary>
+            Executing,
+
+            /// <summary>
+            /// The effect is returning from the target, if needed.
+            /// </summary>
+            /// <example>
+            /// The character walks back from the melee target while in this stage.
+            /// </example>
+            Returning,
+
+            /// <summary>
+            /// The action is performing any final actions.
+            /// </summary>
+            Finishing,
+
+            /// <summary>
+            /// The action is complete.
+            /// </summary>
+            Complete,
+        };
+
+
+        /// <summary>
+        /// The current state of the action.
+        /// </summary>
+        protected CombatActionStage stage = CombatActionStage.NotStarted;
+
+        /// <summary>
+        /// The current state of the action.
+        /// </summary>
+        public CombatActionStage Stage
+        {
+            get { return stage; }
+        }
+
+
+        /// <summary>
+        /// Starts a new combat stage.  Called right after the stage changes.
+        /// </summary>
+        /// <remarks>The stage never changes into NotStarted.</remarks>
+        protected virtual void StartStage()
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Preparing: // called from Start()
+                    break;
+
+                case CombatActionStage.Advancing:
+                    break;
+
+                case CombatActionStage.Executing:
+                    break;
+
+                case CombatActionStage.Returning:
+                    break;
+
+                case CombatActionStage.Finishing:
+                    break;
+
+                case CombatActionStage.Complete:
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Update the action for the current stage.
+        /// </summary>
+        /// <remarks>
+        /// This function is guaranteed to be called at least once per stage.
+        /// </remarks>
+        protected virtual void UpdateCurrentStage(GameTime gameTime)
+        {
+            switch (stage)
+            {
+                case CombatActionStage.NotStarted:
+                    break;
+
+                case CombatActionStage.Preparing:
+                    break;
+
+                case CombatActionStage.Advancing:
+                    break;
+
+                case CombatActionStage.Executing:
+                    break;
+
+                case CombatActionStage.Returning:
+                    break;
+
+                case CombatActionStage.Finishing:
+                    break;
+
+                case CombatActionStage.Complete:
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Returns true if the combat action is ready to proceed to the next stage.
+        /// </summary>
+        protected virtual bool IsReadyForNextStage
+        {
+            get
+            {
+                switch (stage)
+                {
+                    case CombatActionStage.Preparing: // ready to advance?
+                        break;
+
+                    case CombatActionStage.Advancing: // ready to execute?
+                        break;
+
+                    case CombatActionStage.Executing: // ready to return?
+                        break;
+
+                    case CombatActionStage.Returning: // ready to finish?
+                        break;
+
+                    case CombatActionStage.Finishing: // ready to complete?
+                        break;
+                }
+
+                // fall through - the action doesn't care about the state, so move on
+                return true;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The character performing this action.
+        /// </summary>
+        protected Combatant combatant;
+
+        /// <summary>
+        /// The character performing this action.
+        /// </summary>
+        public Combatant Combatant
+        {
+            get { return combatant; }
+        }
+
+
+        /// <summary>
+        /// Returns true if the character can use this action.
+        /// </summary>
+        public virtual bool IsCharacterValidUser
+        {
+            get { return true; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The target of the action.
+        /// </summary>
+        public Combatant Target = null;
+
+
+        /// <summary>
+        /// The number of adjacent targets in each direction that are affected.
+        /// </summary>
+        protected int adjacentTargets = 0;
+
+        /// <summary>
+        /// The number of adjacent targets in each direction that are affected.
+        /// </summary>
+        public int AdjacentTargets
+        {
+            get { return adjacentTargets; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The heuristic used to compare actions of this type to similar ones.
+        /// </summary>
+        public abstract int Heuristic
+        {
+            get;
+        }
+
+
+        /// <summary>
+        /// Compares the combat actions by their heuristic, in descending order.
+        /// </summary>
+        public static int CompareCombatActionsByHeuristic(
+            CombatAction a, CombatAction b)
+        {
+            return b.Heuristic.CompareTo(a.Heuristic);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new CombatAction object.
+        /// </summary>
+        /// <param name="combatant">The combatant performing the action.</param>
+        public CombatAction(Combatant combatant)
+        {
+            // check the parameter
+            if (combatant == null)
+            {
+                throw new ArgumentNullException("combatant");
+            }
+
+            // assign the parameter
+            this.combatant = combatant;
+
+            Reset();
+        }
+
+
+        /// <summary>
+        /// Reset the action so that it may be started again.
+        /// </summary>
+        public virtual void Reset()
+        {
+            // set the state to not-started
+            stage = CombatActionStage.NotStarted;
+        }
+
+
+        /// <summary>
+        /// Start executing the combat action.
+        /// </summary>
+        public virtual void Start()
+        {
+            // set the state to the first step
+            stage = CombatActionStage.Preparing;
+            StartStage();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Updates the action over time.
+        /// </summary>
+        public virtual void Update(GameTime gameTime)
+        {
+            // update the current stage
+            UpdateCurrentStage(gameTime);
+
+            // if the action is ready for the next stage, then advance
+            if ((stage != CombatActionStage.NotStarted) &&
+                (stage != CombatActionStage.Complete) && IsReadyForNextStage)
+            {
+                switch (stage)
+                {
+                    case CombatActionStage.Preparing:
+                        stage = CombatActionStage.Advancing;
+                        break;
+
+                    case CombatActionStage.Advancing:
+                        stage = CombatActionStage.Executing;
+                        break;
+
+                    case CombatActionStage.Executing:
+                        stage = CombatActionStage.Returning;
+                        break;
+
+                    case CombatActionStage.Returning:
+                        stage = CombatActionStage.Finishing;
+                        break;
+
+                    case CombatActionStage.Finishing:
+                        stage = CombatActionStage.Complete;
+                        break;
+                }
+                StartStage();
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw any elements of the action that are independent of the character.
+        /// </summary>
+        public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) { }
+
+
+    }
+}

+ 94 - 106
RolePlayingGame/Combat/Actions/DefendCombatAction.cs → RolePlayingGame/Core/Combat/Actions/DefendCombatAction.cs

@@ -1,106 +1,94 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// DefendCombatAction.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework.Graphics;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// A melee-attack combat action, including related data and calculations.
-    /// </summary>
-    class DefendCombatAction : CombatAction
-    {
-        #region State
-
-
-        /// <summary>
-        /// Returns true if the action is offensive, targeting the opponents.
-        /// </summary>
-        public override bool IsOffensive
-        {
-            get { return false; }
-        }
-
-
-        /// <summary>
-        /// Returns true if this action requires a target.
-        /// </summary>
-        public override bool  IsTargetNeeded
-        {
-            get { return false; }
-        }
-
-
-        #endregion
-
-
-        #region Combat Stage
-
-
-        /// <summary>
-        /// Starts a new combat stage.  Called right after the stage changes.
-        /// </summary>
-        /// <remarks>The stage never changes into NotStarted.</remarks>
-        protected override void StartStage()
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Preparing: // called from Start()
-                    Combatant.CombatSprite.PlayAnimation("Defend");
-                    break;
-
-                case CombatActionStage.Executing:
-                    Combatant.CombatEffects.AddStatistics(new StatisticsValue(
-                        0, 0, 0, Combatant.Character.CharacterStatistics.PhysicalDefense,
-                        0, Combatant.Character.CharacterStatistics.MagicalDefense), 1);
-                    break;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Heuristic
-
-
-        /// <summary>
-        /// The heuristic used to compare actions of this type to similar ones.
-        /// </summary>
-        public override int Heuristic
-        {
-            get 
-            {
-                return 0;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new DefendCombatAction object.
-        /// </summary>
-        /// <param name="character">The character performing the action.</param>
-        public DefendCombatAction(Combatant combatant)
-            : base(combatant) { }
-
-        
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// DefendCombatAction.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// A melee-attack combat action, including related data and calculations.
+    /// </summary>
+    class DefendCombatAction : CombatAction
+    {
+
+
+        /// <summary>
+        /// Returns true if the action is offensive, targeting the opponents.
+        /// </summary>
+        public override bool IsOffensive
+        {
+            get { return false; }
+        }
+
+
+        /// <summary>
+        /// Returns true if this action requires a target.
+        /// </summary>
+        public override bool  IsTargetNeeded
+        {
+            get { return false; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Starts a new combat stage.  Called right after the stage changes.
+        /// </summary>
+        /// <remarks>The stage never changes into NotStarted.</remarks>
+        protected override void StartStage()
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Preparing: // called from Start()
+                    Combatant.CombatSprite.PlayAnimation("Defend");
+                    break;
+
+                case CombatActionStage.Executing:
+                    Combatant.CombatEffects.AddStatistics(new StatisticsValue(
+                        0, 0, 0, Combatant.Character.CharacterStatistics.PhysicalDefense,
+                        0, Combatant.Character.CharacterStatistics.MagicalDefense), 1);
+                    break;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The heuristic used to compare actions of this type to similar ones.
+        /// </summary>
+        public override int Heuristic
+        {
+            get 
+            {
+                return 0;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new DefendCombatAction object.
+        /// </summary>
+        /// <param name="character">The character performing the action.</param>
+        public DefendCombatAction(Combatant combatant)
+            : base(combatant) { }
+
+        
+    }
+}

+ 440 - 462
RolePlayingGame/Combat/Actions/ItemCombatAction.cs → RolePlayingGame/Core/Combat/Actions/ItemCombatAction.cs

@@ -1,462 +1,440 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// ItemCombatAction.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework.Graphics;
-using Microsoft.Xna.Framework.Audio;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// A item-casting combat action, including related data and calculations.
-    /// </summary>
-    class ItemCombatAction : CombatAction
-    {
-        #region State
-
-
-        /// <summary>
-        /// Returns true if the action is offensive, targeting the opponents.
-        /// </summary>
-        public override bool IsOffensive
-        {
-            get { return Item.IsOffensive; }
-        }
-
-
-        /// <summary>
-        /// Returns true if the character can use this action.
-        /// </summary>
-        public override bool IsCharacterValidUser
-        {
-            get { return true; }
-        }
-
-
-        /// <summary>
-        /// Returns true if this action requires a target.
-        /// </summary>
-        public override bool IsTargetNeeded
-        {
-            get { return true; }
-        }
-
-
-        #endregion
-
-
-        #region Item
-
-
-        /// <summary>
-        /// The item used in this action.
-        /// </summary>
-        private Item item;
-
-        /// <summary>
-        /// The item used in this action.
-        /// </summary>
-        public Item Item
-        {
-            get { return item; }
-        }
-
-
-        /// <summary>
-        /// The current position of the item sprite.
-        /// </summary>
-        private Vector2 itemSpritePosition;
-
-
-        /// <summary>
-        /// Apply the action's item to the given target.
-        /// </summary>
-        /// <returns>True if there was any effect on the target.</returns>
-        private bool ApplyItem(Combatant itemTarget)
-        {
-            StatisticsValue effectStatistics = CalculateItemDamage(combatant, item);
-            if (item.IsOffensive)
-            {
-                // calculate the defense
-                Int32Range defenseRange = itemTarget.Character.MagicDefenseRange +
-                    itemTarget.Statistics.MagicalDefense;
-                Int32 defense = defenseRange.GenerateValue(Session.Random);
-                // subtract the defense
-                effectStatistics -= new StatisticsValue(defense,
-                    defense, defense, defense, defense, defense);
-                // make sure that this only contains damage
-                effectStatistics.ApplyMinimum(new StatisticsValue());
-                // damage the target
-                itemTarget.Damage(effectStatistics, item.TargetDuration);
-            }
-            else
-            {
-                // make sure taht this only contains healing
-                effectStatistics.ApplyMinimum(new StatisticsValue());
-                // heal the target
-                itemTarget.Heal(effectStatistics, item.TargetDuration);
-            }
-            return !effectStatistics.IsZero;
-        }
-        
-
-        #endregion
-
-
-        #region Item Projectile Data
-
-
-        /// <summary>
-        /// The speed at which the projectile moves, in units per second.
-        /// </summary>
-        private const float projectileSpeed = 300f;
-
-
-        /// <summary>
-        /// The direction of the projectile.
-        /// </summary>
-        private Vector2 projectileDirection;
-
-
-        /// <summary>
-        /// The distance covered so far by the projectile.
-        /// </summary>
-        private float projectileDistanceCovered = 0f;
-
-
-        /// <summary>
-        /// The total distance between the original combatant position and the target.
-        /// </summary>
-        private float totalProjectileDistance;
-
-
-        /// <summary>
-        /// The sprite effect on the projectile, if any.
-        /// </summary>
-        private SpriteEffects projectileSpriteEffect = SpriteEffects.None;
-
-
-        /// <summary>
-        /// The sound effect cue for the traveling projectile.
-        /// </summary>
-        private Cue projectileCue;
-
-
-        #endregion
-
-
-        #region Combat Stage
-
-
-        /// <summary>
-        /// Starts a new combat stage.  Called right after the stage changes.
-        /// </summary>
-        /// <remarks>The stage never changes into NotStarted.</remarks>
-        protected override void StartStage()
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Preparing: // called from Start()
-                    {
-                        // play the animations
-                        combatant.CombatSprite.PlayAnimation("ItemCast");
-                        itemSpritePosition = Combatant.Position;
-                        item.SpellSprite.PlayAnimation("Creation");
-                        Session.Party.RemoveFromInventory(item, 1);
-                    }
-                    break;
-
-                case CombatActionStage.Advancing:
-                    {
-                        // play the animations
-                        item.SpellSprite.PlayAnimation("Traveling");
-                        // calculate the projectile destination
-                        projectileDirection = Target.Position -
-                            Combatant.OriginalPosition;
-                        totalProjectileDistance = projectileDirection.Length();
-                        projectileDirection.Normalize();
-                        projectileDistanceCovered = 0f;
-                        // determine if the projectile is flipped
-                        if (Target.Position.X > Combatant.Position.X)
-                        {
-                            projectileSpriteEffect = SpriteEffects.FlipHorizontally;
-                        }
-                        else
-                        {
-                            projectileSpriteEffect = SpriteEffects.None;
-                        }
-                        // get the projectile's cue and play it
-                        projectileCue = AudioManager.GetCue(item.TravelingCueName);
-                        if (projectileCue != null)
-                        {
-                            projectileCue.Play();
-                        }
-                    }
-                    break;
-
-                case CombatActionStage.Executing:
-                    // play the animation
-                    item.SpellSprite.PlayAnimation("Impact");
-                    // stop the projectile sound effect
-                    if (projectileCue != null)
-                    {
-                        projectileCue.Stop(AudioStopOptions.Immediate);
-                    }
-                    // apply the item effect to the primary target
-                    bool damagedAnyone = ApplyItem(Target);
-                    // apply the item effect to the secondary targets
-                    foreach (Combatant targetCombatant in
-                        CombatEngine.SecondaryTargetedCombatants)
-                    {
-                        // skip any dead or dying combatants
-                        if (targetCombatant.IsDeadOrDying)
-                        {
-                            continue;
-                        }
-                        // apply the effect
-                        damagedAnyone |= ApplyItem(targetCombatant);
-                    }
-                    // play the impact sound effect
-                    if (damagedAnyone)
-                    {
-                        AudioManager.PlayCue(item.ImpactCueName);
-                        if (item.Overlay != null)
-                        {
-                            item.Overlay.PlayAnimation(0);
-                            item.Overlay.ResetAnimation();
-                        }
-                    }
-
-                    break;
-
-                case CombatActionStage.Returning:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    break;
-
-                case CombatActionStage.Finishing:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    break;
-
-                case CombatActionStage.Complete:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Update the action for the current stage.
-        /// </summary>
-        /// <remarks>
-        /// This function is guaranteed to be called at least once per stage.
-        /// </remarks>
-        protected override void UpdateCurrentStage(GameTime gameTime)
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Advancing:
-                    if (projectileDistanceCovered < totalProjectileDistance)
-                    {
-                        projectileDistanceCovered += projectileSpeed *
-                            (float)gameTime.ElapsedGameTime.TotalSeconds;
-                    }
-                    itemSpritePosition = combatant.OriginalPosition +
-                        projectileDirection * projectileDistanceCovered;
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Returns true if the combat action is ready to proceed to the next stage.
-        /// </summary>
-        protected override bool IsReadyForNextStage
-        {
-            get
-            {
-                switch (stage)
-                {
-                    case CombatActionStage.Preparing: // ready to advance?
-                        return (combatant.CombatSprite.IsPlaybackComplete &&
-                            item.SpellSprite.IsPlaybackComplete);
-
-                    case CombatActionStage.Advancing: // ready to execute?
-                        if (item.SpellSprite.IsPlaybackComplete ||
-                            (projectileDistanceCovered >= totalProjectileDistance))
-                        {
-                            projectileDistanceCovered = totalProjectileDistance;
-                            return true;
-                        }
-                        return false;
-
-                    case CombatActionStage.Executing: // ready to return?
-                        return item.SpellSprite.IsPlaybackComplete;
-                }
-
-                // fall through to the base behavior
-                return base.IsReadyForNextStage;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Heuristic
-
-
-        /// <summary>
-        /// The heuristic used to compare actions of this type to similar ones.
-        /// </summary>
-        public override int Heuristic
-        {
-            get
-            {
-                return Item.TargetEffectRange.HealthPointsRange.Average;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new ItemCombatAction object.
-        /// </summary>
-        /// <param name="character">The combatant performing the action.</param>
-        public ItemCombatAction(Combatant combatant, Item item)
-            : base(combatant)
-        {
-            // check the parameter
-            if (item == null)
-            {
-                throw new ArgumentNullException("item");
-            }
-            if ((item.Usage & Item.ItemUsage.Combat) == 0)
-            {
-                throw new ArgumentException("Combat items must have Combat usage.");
-            }
-
-            // assign the parameter
-            this.item = item;
-            this.adjacentTargets = this.item.AdjacentTargets;
-        }
-
-
-        /// <summary>
-        /// Start executing the combat action.
-        /// </summary>
-        public override void Start()
-        {
-            // play the creation sound effect
-            AudioManager.PlayCue(item.UsingCueName);
-
-            base.Start();
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Updates the action over time.
-        /// </summary>
-        public override void Update(GameTime gameTime)
-        {
-            // update the animations
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-            item.SpellSprite.UpdateAnimation(elapsedSeconds);
-            if (item.Overlay != null)
-            {
-                item.Overlay.UpdateAnimation(elapsedSeconds);
-                if (!item.Overlay.IsPlaybackComplete &&
-                    Target.CombatSprite.IsPlaybackComplete)
-                {
-                    item.Overlay.StopAnimation();
-                }
-            }
-
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw any elements of the action that are independent of the character.
-        /// </summary>
-        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
-        {
-            // draw the item projectile
-            if (!item.SpellSprite.IsPlaybackComplete)
-            {
-                if (stage == CombatActionStage.Advancing)
-                {
-                    item.SpellSprite.Draw(spriteBatch, itemSpritePosition, 0f,
-                        projectileSpriteEffect);
-                }
-                else
-                {
-                    item.SpellSprite.Draw(spriteBatch, itemSpritePosition, 0f);
-                }
-            }
-
-            // draw the item overlay
-            if (!item.Overlay.IsPlaybackComplete)
-            {
-                item.Overlay.Draw(spriteBatch, Target.Position, 0f);
-            }
-
-            base.Draw(gameTime, spriteBatch);
-        }
-
-
-        #endregion
-
-
-        #region Static Calculation Methods
-
-
-        /// <summary>
-        /// Calculate the item damage done by the given combatant and item.
-        /// </summary>
-        public static StatisticsValue CalculateItemDamage(Combatant combatant,
-            Item item)
-        {
-            // check the parameters
-            if (item == null)
-            {
-                throw new ArgumentNullException("item");
-            }
-
-            // generate a new effect value - no stats are involved for items
-            return item.TargetEffectRange.GenerateValue(Session.Random);
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// ItemCombatAction.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Audio;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// A item-casting combat action, including related data and calculations.
+    /// </summary>
+    class ItemCombatAction : CombatAction
+    {
+
+
+        /// <summary>
+        /// Returns true if the action is offensive, targeting the opponents.
+        /// </summary>
+        public override bool IsOffensive
+        {
+            get { return Item.IsOffensive; }
+        }
+
+
+        /// <summary>
+        /// Returns true if the character can use this action.
+        /// </summary>
+        public override bool IsCharacterValidUser
+        {
+            get { return true; }
+        }
+
+
+        /// <summary>
+        /// Returns true if this action requires a target.
+        /// </summary>
+        public override bool IsTargetNeeded
+        {
+            get { return true; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The item used in this action.
+        /// </summary>
+        private Item item;
+
+        /// <summary>
+        /// The item used in this action.
+        /// </summary>
+        public Item Item
+        {
+            get { return item; }
+        }
+
+
+        /// <summary>
+        /// The current position of the item sprite.
+        /// </summary>
+        private Vector2 itemSpritePosition;
+
+
+        /// <summary>
+        /// Apply the action's item to the given target.
+        /// </summary>
+        /// <returns>True if there was any effect on the target.</returns>
+        private bool ApplyItem(Combatant itemTarget)
+        {
+            StatisticsValue effectStatistics = CalculateItemDamage(combatant, item);
+            if (item.IsOffensive)
+            {
+                // calculate the defense
+                Int32Range defenseRange = itemTarget.Character.MagicDefenseRange +
+                    itemTarget.Statistics.MagicalDefense;
+                Int32 defense = defenseRange.GenerateValue(Session.Random);
+                // subtract the defense
+                effectStatistics -= new StatisticsValue(defense,
+                    defense, defense, defense, defense, defense);
+                // make sure that this only contains damage
+                effectStatistics.ApplyMinimum(new StatisticsValue());
+                // damage the target
+                itemTarget.Damage(effectStatistics, item.TargetDuration);
+            }
+            else
+            {
+                // make sure taht this only contains healing
+                effectStatistics.ApplyMinimum(new StatisticsValue());
+                // heal the target
+                itemTarget.Heal(effectStatistics, item.TargetDuration);
+            }
+            return !effectStatistics.IsZero;
+        }
+        
+
+
+
+
+
+        /// <summary>
+        /// The speed at which the projectile moves, in units per second.
+        /// </summary>
+        private const float projectileSpeed = 300f;
+
+
+        /// <summary>
+        /// The direction of the projectile.
+        /// </summary>
+        private Vector2 projectileDirection;
+
+
+        /// <summary>
+        /// The distance covered so far by the projectile.
+        /// </summary>
+        private float projectileDistanceCovered = 0f;
+
+
+        /// <summary>
+        /// The total distance between the original combatant position and the target.
+        /// </summary>
+        private float totalProjectileDistance;
+
+
+        /// <summary>
+        /// The sprite effect on the projectile, if any.
+        /// </summary>
+        private SpriteEffects projectileSpriteEffect = SpriteEffects.None;
+
+
+        /// <summary>
+        /// The sound effect cue for the traveling projectile.
+        /// </summary>
+        private Cue projectileCue;
+
+
+
+
+
+
+        /// <summary>
+        /// Starts a new combat stage.  Called right after the stage changes.
+        /// </summary>
+        /// <remarks>The stage never changes into NotStarted.</remarks>
+        protected override void StartStage()
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Preparing: // called from Start()
+                    {
+                        // play the animations
+                        combatant.CombatSprite.PlayAnimation("ItemCast");
+                        itemSpritePosition = Combatant.Position;
+                        item.SpellSprite.PlayAnimation("Creation");
+                        Session.Party.RemoveFromInventory(item, 1);
+                    }
+                    break;
+
+                case CombatActionStage.Advancing:
+                    {
+                        // play the animations
+                        item.SpellSprite.PlayAnimation("Traveling");
+                        // calculate the projectile destination
+                        projectileDirection = Target.Position -
+                            Combatant.OriginalPosition;
+                        totalProjectileDistance = projectileDirection.Length();
+                        projectileDirection.Normalize();
+                        projectileDistanceCovered = 0f;
+                        // determine if the projectile is flipped
+                        if (Target.Position.X > Combatant.Position.X)
+                        {
+                            projectileSpriteEffect = SpriteEffects.FlipHorizontally;
+                        }
+                        else
+                        {
+                            projectileSpriteEffect = SpriteEffects.None;
+                        }
+                        // get the projectile's cue and play it
+                        projectileCue = AudioManager.GetCue(item.TravelingCueName);
+                        if (projectileCue != null)
+                        {
+                            projectileCue.Play();
+                        }
+                    }
+                    break;
+
+                case CombatActionStage.Executing:
+                    // play the animation
+                    item.SpellSprite.PlayAnimation("Impact");
+                    // stop the projectile sound effect
+                    if (projectileCue != null)
+                    {
+                        projectileCue.Stop(AudioStopOptions.Immediate);
+                    }
+                    // apply the item effect to the primary target
+                    bool damagedAnyone = ApplyItem(Target);
+                    // apply the item effect to the secondary targets
+                    foreach (Combatant targetCombatant in
+                        CombatEngine.SecondaryTargetedCombatants)
+                    {
+                        // skip any dead or dying combatants
+                        if (targetCombatant.IsDeadOrDying)
+                        {
+                            continue;
+                        }
+                        // apply the effect
+                        damagedAnyone |= ApplyItem(targetCombatant);
+                    }
+                    // play the impact sound effect
+                    if (damagedAnyone)
+                    {
+                        AudioManager.PlayCue(item.ImpactCueName);
+                        if (item.Overlay != null)
+                        {
+                            item.Overlay.PlayAnimation(0);
+                            item.Overlay.ResetAnimation();
+                        }
+                    }
+
+                    break;
+
+                case CombatActionStage.Returning:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    break;
+
+                case CombatActionStage.Finishing:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    break;
+
+                case CombatActionStage.Complete:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Update the action for the current stage.
+        /// </summary>
+        /// <remarks>
+        /// This function is guaranteed to be called at least once per stage.
+        /// </remarks>
+        protected override void UpdateCurrentStage(GameTime gameTime)
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Advancing:
+                    if (projectileDistanceCovered < totalProjectileDistance)
+                    {
+                        projectileDistanceCovered += projectileSpeed *
+                            (float)gameTime.ElapsedGameTime.TotalSeconds;
+                    }
+                    itemSpritePosition = combatant.OriginalPosition +
+                        projectileDirection * projectileDistanceCovered;
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Returns true if the combat action is ready to proceed to the next stage.
+        /// </summary>
+        protected override bool IsReadyForNextStage
+        {
+            get
+            {
+                switch (stage)
+                {
+                    case CombatActionStage.Preparing: // ready to advance?
+                        return (combatant.CombatSprite.IsPlaybackComplete &&
+                            item.SpellSprite.IsPlaybackComplete);
+
+                    case CombatActionStage.Advancing: // ready to execute?
+                        if (item.SpellSprite.IsPlaybackComplete ||
+                            (projectileDistanceCovered >= totalProjectileDistance))
+                        {
+                            projectileDistanceCovered = totalProjectileDistance;
+                            return true;
+                        }
+                        return false;
+
+                    case CombatActionStage.Executing: // ready to return?
+                        return item.SpellSprite.IsPlaybackComplete;
+                }
+
+                // fall through to the base behavior
+                return base.IsReadyForNextStage;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The heuristic used to compare actions of this type to similar ones.
+        /// </summary>
+        public override int Heuristic
+        {
+            get
+            {
+                return Item.TargetEffectRange.HealthPointsRange.Average;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new ItemCombatAction object.
+        /// </summary>
+        /// <param name="character">The combatant performing the action.</param>
+        public ItemCombatAction(Combatant combatant, Item item)
+            : base(combatant)
+        {
+            // check the parameter
+            if (item == null)
+            {
+                throw new ArgumentNullException("item");
+            }
+            if ((item.Usage & Item.ItemUsage.Combat) == 0)
+            {
+                throw new ArgumentException("Combat items must have Combat usage.");
+            }
+
+            // assign the parameter
+            this.item = item;
+            this.adjacentTargets = this.item.AdjacentTargets;
+        }
+
+
+        /// <summary>
+        /// Start executing the combat action.
+        /// </summary>
+        public override void Start()
+        {
+            // play the creation sound effect
+            AudioManager.PlayCue(item.UsingCueName);
+
+            base.Start();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Updates the action over time.
+        /// </summary>
+        public override void Update(GameTime gameTime)
+        {
+            // update the animations
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+            item.SpellSprite.UpdateAnimation(elapsedSeconds);
+            if (item.Overlay != null)
+            {
+                item.Overlay.UpdateAnimation(elapsedSeconds);
+                if (!item.Overlay.IsPlaybackComplete &&
+                    Target.CombatSprite.IsPlaybackComplete)
+                {
+                    item.Overlay.StopAnimation();
+                }
+            }
+
+            base.Update(gameTime);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw any elements of the action that are independent of the character.
+        /// </summary>
+        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
+        {
+            // draw the item projectile
+            if (!item.SpellSprite.IsPlaybackComplete)
+            {
+                if (stage == CombatActionStage.Advancing)
+                {
+                    item.SpellSprite.Draw(spriteBatch, itemSpritePosition, 0f,
+                        projectileSpriteEffect);
+                }
+                else
+                {
+                    item.SpellSprite.Draw(spriteBatch, itemSpritePosition, 0f);
+                }
+            }
+
+            // draw the item overlay
+            if (!item.Overlay.IsPlaybackComplete)
+            {
+                item.Overlay.Draw(spriteBatch, Target.Position, 0f);
+            }
+
+            base.Draw(gameTime, spriteBatch);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Calculate the item damage done by the given combatant and item.
+        /// </summary>
+        public static StatisticsValue CalculateItemDamage(Combatant combatant,
+            Item item)
+        {
+            // check the parameters
+            if (item == null)
+            {
+                throw new ArgumentNullException("item");
+            }
+
+            // generate a new effect value - no stats are involved for items
+            return item.TargetEffectRange.GenerateValue(Session.Random);
+        }
+
+
+    }
+}

+ 347 - 365
RolePlayingGame/Combat/Actions/MeleeCombatAction.cs → RolePlayingGame/Core/Combat/Actions/MeleeCombatAction.cs

@@ -1,365 +1,347 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// MeleeCombatAction.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework.Graphics;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// A melee-attack combat action, including related data and calculations.
-    /// </summary>
-    class MeleeCombatAction : CombatAction
-    {
-        #region State
-
-
-        /// <summary>
-        /// Returns true if the action is offensive, targeting the opponents.
-        /// </summary>
-        public override bool IsOffensive
-        {
-            get { return true; }
-        }
-
-
-        /// <summary>
-        /// Returns true if this action requires a target.
-        /// </summary>
-        public override bool IsTargetNeeded
-        {
-            get { return true; }
-        }
-
-
-        #endregion
-
-
-        #region Advancing/Returning Data
-
-
-        /// <summary>
-        /// The speed at which the advancing character moves, in units per second.
-        /// </summary>
-        private const float advanceSpeed = 300f;
-
-
-        /// <summary>
-        /// The offset from the advance destination to the target position
-        /// </summary>
-        private static readonly Vector2 advanceOffset = new Vector2(85f, 0f);
-
-
-        /// <summary>
-        /// The direction of the advancement.
-        /// </summary>
-        private Vector2 advanceDirection;
-
-
-        /// <summary>
-        /// The distance covered so far by the advance/return action
-        /// </summary>
-        private float advanceDistanceCovered = 0f;
-
-
-        /// <summary>
-        /// The total distance between the original combatant position and the target.
-        /// </summary>
-        private float totalAdvanceDistance;
-
-
-        #endregion
-
-
-        #region Combat Stage
-
-
-        /// <summary>
-        /// Starts a new combat stage.  Called right after the stage changes.
-        /// </summary>
-        /// <remarks>The stage never changes into NotStarted.</remarks>
-        protected override void StartStage()
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Preparing: // called from Start()
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Idle");
-                    }
-                    break;
-
-                case CombatActionStage.Advancing:
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Walk");
-                        // calculate the advancing destination
-                        if (Target.Position.X > Combatant.Position.X)
-                        {
-                            advanceDirection = Target.Position -
-                                Combatant.OriginalPosition - advanceOffset;
-                        }
-                        else
-                        {
-                            advanceDirection = Target.Position -
-                                Combatant.OriginalPosition + advanceOffset;
-                        }
-                        totalAdvanceDistance = advanceDirection.Length();
-                        advanceDirection.Normalize();
-                        advanceDistanceCovered = 0f;
-                    }
-                    break;
-
-                case CombatActionStage.Executing:
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Attack");
-                        // play the audio
-                        Weapon weapon = combatant.Character.GetEquippedWeapon();
-                        if (weapon != null)
-                        {
-                            AudioManager.PlayCue(weapon.SwingCueName);
-                        }
-                        else
-                        {
-                            AudioManager.PlayCue("StaffSwing");
-                        }
-                    }
-                    break;
-
-                case CombatActionStage.Returning:
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Walk");
-                        // calculate the damage
-                        Int32Range damageRange = combatant.Character.TargetDamageRange +
-                            combatant.Statistics.PhysicalOffense;
-                        Int32Range defenseRange = Target.Character.HealthDefenseRange + 
-                            Target.Statistics.PhysicalDefense;
-                        int damage = Math.Max(0, 
-                            damageRange.GenerateValue(Session.Random) -
-                            defenseRange.GenerateValue(Session.Random));
-                        // apply the damage
-                        if (damage > 0)
-                        {
-                            // play the audio
-                            Weapon weapon = combatant.Character.GetEquippedWeapon();
-                            if (weapon != null)
-                            {
-                                AudioManager.PlayCue(weapon.HitCueName);
-                            }
-                            else
-                            {
-                                AudioManager.PlayCue("StaffHit");
-                            }
-                            // damage the target
-                            Target.DamageHealth(damage, 0);
-                            if ((weapon != null) && (weapon.Overlay != null))
-                            {
-                                weapon.Overlay.PlayAnimation(0);
-                                weapon.Overlay.ResetAnimation();
-                            }
-                        }
-                    }
-                    break;
-
-                case CombatActionStage.Finishing:
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Idle");
-                    }
-                    break;
-
-                case CombatActionStage.Complete:
-                    {
-                        // play the animation
-                        combatant.CombatSprite.PlayAnimation("Idle");
-                    }
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Update the action for the current stage.
-        /// </summary>
-        /// <remarks>
-        /// This function is guaranteed to be called at least once per stage.
-        /// </remarks>
-        protected override void UpdateCurrentStage(GameTime gameTime)
-        {
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-
-            switch (stage)
-            {
-                case CombatActionStage.Advancing:
-                    {
-                        // move to the destination
-                        if (advanceDistanceCovered < totalAdvanceDistance)
-                        {
-                            advanceDistanceCovered = Math.Min(advanceDistanceCovered +
-                                advanceSpeed * elapsedSeconds, totalAdvanceDistance);
-                        }
-                        // update the combatant's position
-                        combatant.Position = combatant.OriginalPosition +
-                            advanceDirection * advanceDistanceCovered;
-                    }
-                    break;
-
-                case CombatActionStage.Returning:
-                    {
-                        // move to the destination
-                        if (advanceDistanceCovered > 0f)
-                        {
-                            advanceDistanceCovered -= advanceSpeed * elapsedSeconds;
-                        }
-                        combatant.Position = combatant.OriginalPosition +
-                            advanceDirection * advanceDistanceCovered;
-                    }
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Returns true if the combat action is ready to proceed to the next stage.
-        /// </summary>
-        protected override bool IsReadyForNextStage
-        {
-            get
-            {
-                switch (stage)
-                {
-                    case CombatActionStage.Preparing: // ready to advance?
-                        return true;
-
-                    case CombatActionStage.Advancing: // ready to execute?
-                        if (advanceDistanceCovered >= totalAdvanceDistance)
-                        {
-                            advanceDistanceCovered = totalAdvanceDistance;
-                            combatant.Position = combatant.OriginalPosition +
-                                advanceDirection * totalAdvanceDistance;
-                            return true;
-                        }
-                        else
-                        {
-                            return false;
-                        }
-
-                    case CombatActionStage.Executing: // ready to return?
-                        return combatant.CombatSprite.IsPlaybackComplete;
-
-                    case CombatActionStage.Returning: // ready to finish?
-                        if (advanceDistanceCovered <= 0f)
-                        {
-                            advanceDistanceCovered = 0f;
-                            combatant.Position = combatant.OriginalPosition;
-                            return true;
-                        }
-                        else
-                        {
-                            return false;
-                        }
-
-                    case CombatActionStage.Finishing: // ready to complete?
-                        return true;
-                }
-
-                // fall through to the base behavior
-                return base.IsReadyForNextStage;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Heuristic
-
-
-        /// <summary>
-        /// The heuristic used to compare actions of this type to similar ones.
-        /// </summary>
-        public override int Heuristic
-        {
-            get 
-            {
-                return combatant.Character.TargetDamageRange.Average;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new MeleeCombatAction object.
-        /// </summary>
-        /// <param name="character">The character performing the action.</param>
-        public MeleeCombatAction(Combatant combatant)
-            : base(combatant) { }
-
-        
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Updates the action over time.
-        /// </summary>
-        public override void Update(GameTime gameTime) 
-        {
-            // update the weapon animation
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-            Weapon weapon = Combatant.Character.GetEquippedWeapon();
-            if ((weapon != null) && (weapon.Overlay != null))
-            {
-                weapon.Overlay.UpdateAnimation(elapsedSeconds);
-            }
-
-            // update the action
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw any elements of the action that are independent of the character.
-        /// </summary>
-        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
-        {
-            // draw the weapon overlay (typically blood)
-            Weapon weapon = Combatant.Character.GetEquippedWeapon();
-            if ((weapon != null) && (weapon.Overlay != null) && 
-                !weapon.Overlay.IsPlaybackComplete)
-            {
-                weapon.Overlay.Draw(spriteBatch, Target.Position, 0f);
-            }
-
-            base.Draw(gameTime, spriteBatch);
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// MeleeCombatAction.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// A melee-attack combat action, including related data and calculations.
+    /// </summary>
+    class MeleeCombatAction : CombatAction
+    {
+
+
+        /// <summary>
+        /// Returns true if the action is offensive, targeting the opponents.
+        /// </summary>
+        public override bool IsOffensive
+        {
+            get { return true; }
+        }
+
+
+        /// <summary>
+        /// Returns true if this action requires a target.
+        /// </summary>
+        public override bool IsTargetNeeded
+        {
+            get { return true; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The speed at which the advancing character moves, in units per second.
+        /// </summary>
+        private const float advanceSpeed = 300f;
+
+
+        /// <summary>
+        /// The offset from the advance destination to the target position
+        /// </summary>
+        private static readonly Vector2 advanceOffset = new Vector2(85f, 0f);
+
+
+        /// <summary>
+        /// The direction of the advancement.
+        /// </summary>
+        private Vector2 advanceDirection;
+
+
+        /// <summary>
+        /// The distance covered so far by the advance/return action
+        /// </summary>
+        private float advanceDistanceCovered = 0f;
+
+
+        /// <summary>
+        /// The total distance between the original combatant position and the target.
+        /// </summary>
+        private float totalAdvanceDistance;
+
+
+
+
+
+
+        /// <summary>
+        /// Starts a new combat stage.  Called right after the stage changes.
+        /// </summary>
+        /// <remarks>The stage never changes into NotStarted.</remarks>
+        protected override void StartStage()
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Preparing: // called from Start()
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Idle");
+                    }
+                    break;
+
+                case CombatActionStage.Advancing:
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Walk");
+                        // calculate the advancing destination
+                        if (Target.Position.X > Combatant.Position.X)
+                        {
+                            advanceDirection = Target.Position -
+                                Combatant.OriginalPosition - advanceOffset;
+                        }
+                        else
+                        {
+                            advanceDirection = Target.Position -
+                                Combatant.OriginalPosition + advanceOffset;
+                        }
+                        totalAdvanceDistance = advanceDirection.Length();
+                        advanceDirection.Normalize();
+                        advanceDistanceCovered = 0f;
+                    }
+                    break;
+
+                case CombatActionStage.Executing:
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Attack");
+                        // play the audio
+                        Weapon weapon = combatant.Character.GetEquippedWeapon();
+                        if (weapon != null)
+                        {
+                            AudioManager.PlayCue(weapon.SwingCueName);
+                        }
+                        else
+                        {
+                            AudioManager.PlayCue("StaffSwing");
+                        }
+                    }
+                    break;
+
+                case CombatActionStage.Returning:
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Walk");
+                        // calculate the damage
+                        Int32Range damageRange = combatant.Character.TargetDamageRange +
+                            combatant.Statistics.PhysicalOffense;
+                        Int32Range defenseRange = Target.Character.HealthDefenseRange + 
+                            Target.Statistics.PhysicalDefense;
+                        int damage = Math.Max(0, 
+                            damageRange.GenerateValue(Session.Random) -
+                            defenseRange.GenerateValue(Session.Random));
+                        // apply the damage
+                        if (damage > 0)
+                        {
+                            // play the audio
+                            Weapon weapon = combatant.Character.GetEquippedWeapon();
+                            if (weapon != null)
+                            {
+                                AudioManager.PlayCue(weapon.HitCueName);
+                            }
+                            else
+                            {
+                                AudioManager.PlayCue("StaffHit");
+                            }
+                            // damage the target
+                            Target.DamageHealth(damage, 0);
+                            if ((weapon != null) && (weapon.Overlay != null))
+                            {
+                                weapon.Overlay.PlayAnimation(0);
+                                weapon.Overlay.ResetAnimation();
+                            }
+                        }
+                    }
+                    break;
+
+                case CombatActionStage.Finishing:
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Idle");
+                    }
+                    break;
+
+                case CombatActionStage.Complete:
+                    {
+                        // play the animation
+                        combatant.CombatSprite.PlayAnimation("Idle");
+                    }
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Update the action for the current stage.
+        /// </summary>
+        /// <remarks>
+        /// This function is guaranteed to be called at least once per stage.
+        /// </remarks>
+        protected override void UpdateCurrentStage(GameTime gameTime)
+        {
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+
+            switch (stage)
+            {
+                case CombatActionStage.Advancing:
+                    {
+                        // move to the destination
+                        if (advanceDistanceCovered < totalAdvanceDistance)
+                        {
+                            advanceDistanceCovered = Math.Min(advanceDistanceCovered +
+                                advanceSpeed * elapsedSeconds, totalAdvanceDistance);
+                        }
+                        // update the combatant's position
+                        combatant.Position = combatant.OriginalPosition +
+                            advanceDirection * advanceDistanceCovered;
+                    }
+                    break;
+
+                case CombatActionStage.Returning:
+                    {
+                        // move to the destination
+                        if (advanceDistanceCovered > 0f)
+                        {
+                            advanceDistanceCovered -= advanceSpeed * elapsedSeconds;
+                        }
+                        combatant.Position = combatant.OriginalPosition +
+                            advanceDirection * advanceDistanceCovered;
+                    }
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Returns true if the combat action is ready to proceed to the next stage.
+        /// </summary>
+        protected override bool IsReadyForNextStage
+        {
+            get
+            {
+                switch (stage)
+                {
+                    case CombatActionStage.Preparing: // ready to advance?
+                        return true;
+
+                    case CombatActionStage.Advancing: // ready to execute?
+                        if (advanceDistanceCovered >= totalAdvanceDistance)
+                        {
+                            advanceDistanceCovered = totalAdvanceDistance;
+                            combatant.Position = combatant.OriginalPosition +
+                                advanceDirection * totalAdvanceDistance;
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+
+                    case CombatActionStage.Executing: // ready to return?
+                        return combatant.CombatSprite.IsPlaybackComplete;
+
+                    case CombatActionStage.Returning: // ready to finish?
+                        if (advanceDistanceCovered <= 0f)
+                        {
+                            advanceDistanceCovered = 0f;
+                            combatant.Position = combatant.OriginalPosition;
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+
+                    case CombatActionStage.Finishing: // ready to complete?
+                        return true;
+                }
+
+                // fall through to the base behavior
+                return base.IsReadyForNextStage;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The heuristic used to compare actions of this type to similar ones.
+        /// </summary>
+        public override int Heuristic
+        {
+            get 
+            {
+                return combatant.Character.TargetDamageRange.Average;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new MeleeCombatAction object.
+        /// </summary>
+        /// <param name="character">The character performing the action.</param>
+        public MeleeCombatAction(Combatant combatant)
+            : base(combatant) { }
+
+        
+
+
+
+
+        /// <summary>
+        /// Updates the action over time.
+        /// </summary>
+        public override void Update(GameTime gameTime) 
+        {
+            // update the weapon animation
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+            Weapon weapon = Combatant.Character.GetEquippedWeapon();
+            if ((weapon != null) && (weapon.Overlay != null))
+            {
+                weapon.Overlay.UpdateAnimation(elapsedSeconds);
+            }
+
+            // update the action
+            base.Update(gameTime);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw any elements of the action that are independent of the character.
+        /// </summary>
+        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
+        {
+            // draw the weapon overlay (typically blood)
+            Weapon weapon = Combatant.Character.GetEquippedWeapon();
+            if ((weapon != null) && (weapon.Overlay != null) && 
+                !weapon.Overlay.IsPlaybackComplete)
+            {
+                weapon.Overlay.Draw(spriteBatch, Target.Position, 0f);
+            }
+
+            base.Draw(gameTime, spriteBatch);
+        }
+
+
+    }
+}

+ 463 - 485
RolePlayingGame/Combat/Actions/SpellCombatAction.cs → RolePlayingGame/Core/Combat/Actions/SpellCombatAction.cs

@@ -1,485 +1,463 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// SpellCombatAction.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework.Graphics;
-using Microsoft.Xna.Framework.Audio;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// A spell-casting combat action, including related data and calculations.
-    /// </summary>
-    class SpellCombatAction : CombatAction
-    {
-        #region State
-
-
-        /// <summary>
-        /// Returns true if the action is offensive, targeting the opponents.
-        /// </summary>
-        public override bool IsOffensive
-        {
-            get { return Spell.IsOffensive; }
-        }
-
-        
-        /// <summary>
-        /// Returns true if the character can use this action.
-        /// </summary>
-        public override bool IsCharacterValidUser
-        {
-            get
-            {
-                return (Spell.MagicPointCost <= Combatant.Statistics.MagicPoints);
-            }
-        }
-
-
-        /// <summary>
-        /// Returns true if this action requires a target.
-        /// </summary>
-        public override bool IsTargetNeeded
-        {
-            get { return true; }
-        }
-
-
-        #endregion
-
-
-        #region Spell
-
-
-        /// <summary>
-        /// The spell used in this action.
-        /// </summary>
-        private Spell spell;
-
-        /// <summary>
-        /// The spell used in this action.
-        /// </summary>
-        public Spell Spell
-        {
-            get { return spell; }
-        }
-
-
-        /// <summary>
-        /// The current position of the spell sprite.
-        /// </summary>
-        private Vector2 spellSpritePosition;
-
-
-        /// <summary>
-        /// Apply the action's spell to the given target.
-        /// </summary>
-        /// <returns>True if there was any effect on the target.</returns>
-        private bool ApplySpell(Combatant spellTarget)
-        {
-            StatisticsValue effectStatistics = CalculateSpellDamage(combatant, spell);
-            if (spell.IsOffensive)
-            {
-                // calculate the defense
-                Int32Range defenseRange = spellTarget.Character.MagicDefenseRange + 
-                    spellTarget.Statistics.MagicalDefense;
-                Int32 defense = defenseRange.GenerateValue(Session.Random);
-                // subtract the defense
-                effectStatistics -= new StatisticsValue(defense,
-                    defense, defense, defense, defense, defense);
-                // make sure that this only contains damage
-                effectStatistics.ApplyMinimum(new StatisticsValue());
-                // damage the target
-                spellTarget.Damage(effectStatistics, spell.TargetDuration);
-            }
-            else
-            {
-                // make sure that this only contains healing
-                effectStatistics.ApplyMinimum(new StatisticsValue());
-                // heal the target
-                spellTarget.Heal(effectStatistics, spell.TargetDuration);
-            }
-
-            return !effectStatistics.IsZero;
-        }
-
-
-        #endregion
-
-
-        #region Spell Projectile Data
-
-
-        /// <summary>
-        /// The speed at which the projectile moves, in units per second.
-        /// </summary>
-        private const float projectileSpeed = 600f;
-
-
-        /// <summary>
-        /// The direction of the projectile.
-        /// </summary>
-        private Vector2 projectileDirection;
-
-
-        /// <summary>
-        /// The distance covered so far by the projectile.
-        /// </summary>
-        private float projectileDistanceCovered = 0f;
-
-
-        /// <summary>
-        /// The total distance between the original combatant position and the target.
-        /// </summary>
-        private float totalProjectileDistance;
-
-
-        /// <summary>
-        /// The sprite effect on the projectile, if any.
-        /// </summary>
-        private SpriteEffects projectileSpriteEffect = SpriteEffects.None;
-
-
-        /// <summary>
-        /// The sound effect cue for the traveling projectile.
-        /// </summary>
-        private Cue projectileCue;
-
-
-        #endregion
-
-
-        #region Combat Stage
-
-
-        /// <summary>
-        /// Starts a new combat stage.  Called right after the stage changes.
-        /// </summary>
-        /// <remarks>The stage never changes into NotStarted.</remarks>
-        protected override void StartStage()
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Preparing: // called from Start()
-                    {
-                        // play the animations
-                        combatant.CombatSprite.PlayAnimation("SpellCast");
-                        spellSpritePosition = Combatant.Position;
-                        spell.SpellSprite.PlayAnimation("Creation");
-                        // remove the magic points
-                        Combatant.PayCostForSpell(spell);
-                    }
-                    break;
-
-                case CombatActionStage.Advancing:
-                    {
-                        // play the animations
-                        spell.SpellSprite.PlayAnimation("Traveling");
-                        // calculate the projectile destination
-                        projectileDirection = Target.Position -
-                            Combatant.OriginalPosition;
-                        totalProjectileDistance = projectileDirection.Length();
-                        projectileDirection.Normalize();
-                        projectileDistanceCovered = 0f;
-                        // determine if the projectile is flipped
-                        if (Target.Position.X > Combatant.Position.X)
-                        {
-                            projectileSpriteEffect = SpriteEffects.FlipHorizontally;
-                        }
-                        else
-                        {
-                            projectileSpriteEffect = SpriteEffects.None;
-                        }
-                        // get the projectile's cue and play it
-                        projectileCue = AudioManager.GetCue(spell.TravelingCueName);
-                        if (projectileCue != null)
-                        {
-                            projectileCue.Play();
-                        }
-                    }
-                    break;
-
-                case CombatActionStage.Executing:
-                    {
-                        // play the animation
-                        spell.SpellSprite.PlayAnimation("Impact");
-                        // stop the projectile sound effect
-                        if (projectileCue != null)
-                        {
-                            projectileCue.Stop(AudioStopOptions.Immediate);
-                        }
-                        // apply the spell effect to the primary target
-                        bool damagedAnyone = ApplySpell(Target);
-                        // apply the spell to the secondary targets
-                        foreach (Combatant targetCombatant in
-                            CombatEngine.SecondaryTargetedCombatants)
-                        {
-                            // skip dead or dying targets
-                            if (targetCombatant.IsDeadOrDying)
-                            {
-                                continue;
-                            }
-                            // apply the spell
-                            damagedAnyone |= ApplySpell(targetCombatant);
-                        }
-                        // play the impact sound effect
-                        if (damagedAnyone)
-                        {
-                            AudioManager.PlayCue(spell.ImpactCueName);
-                            if (spell.Overlay != null)
-                            {
-                                spell.Overlay.PlayAnimation(0);
-                                spell.Overlay.ResetAnimation();
-                            }
-                        }
-                    }
-                    break;
-
-                case CombatActionStage.Returning:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    break;
-
-                case CombatActionStage.Finishing:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    break;
-
-                case CombatActionStage.Complete:
-                    // play the animation
-                    combatant.CombatSprite.PlayAnimation("Idle");
-                    // make sure that the overlay has stopped
-                    spell.Overlay.StopAnimation();
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Update the action for the current stage.
-        /// </summary>
-        /// <remarks>
-        /// This function is guaranteed to be called at least once per stage.
-        /// </remarks>
-        protected override void UpdateCurrentStage(GameTime gameTime)
-        {
-            switch (stage)
-            {
-                case CombatActionStage.Advancing:
-                    if (projectileDistanceCovered < totalProjectileDistance)
-                    {
-                        projectileDistanceCovered += projectileSpeed *
-                            (float)gameTime.ElapsedGameTime.TotalSeconds;
-                    }
-                    spellSpritePosition = combatant.OriginalPosition +
-                        projectileDirection * projectileDistanceCovered;
-                    break;
-            }
-        }
-
-
-        /// <summary>
-        /// Returns true if the combat action is ready to proceed to the next stage.
-        /// </summary>
-        protected override bool IsReadyForNextStage
-        {
-            get
-            {
-                switch (stage)
-                {
-                    case CombatActionStage.Preparing: // ready to advance?
-                        return (combatant.CombatSprite.IsPlaybackComplete &&
-                            spell.SpellSprite.IsPlaybackComplete);
-
-                    case CombatActionStage.Advancing: // ready to execute?
-                        if (spell.SpellSprite.IsPlaybackComplete ||
-                            (projectileDistanceCovered >= totalProjectileDistance))
-                        {
-                            projectileDistanceCovered = totalProjectileDistance;
-                            return true;
-                        }
-                        return false;
-
-                    case CombatActionStage.Executing: // ready to return?
-                        return spell.SpellSprite.IsPlaybackComplete;
-                }
-
-                // fall through to the base behavior
-                return base.IsReadyForNextStage;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Heuristic
-
-
-        /// <summary>
-        /// The heuristic used to compare actions of this type to similar ones.
-        /// </summary>
-        public override int Heuristic
-        {
-            get
-            {
-                return (Combatant.Statistics.MagicalOffense + 
-                    Spell.TargetEffectRange.HealthPointsRange.Average);
-            }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new SpellCombatAction object.
-        /// </summary>
-        /// <param name="character">The combatant performing the action.</param>
-        public SpellCombatAction(Combatant combatant, Spell spell)
-            : base(combatant)
-        {
-            // check the parameter
-            if (spell == null)
-            {
-                throw new ArgumentNullException("spell");
-            }
-
-            // assign the parameter
-            this.spell = spell;
-            this.adjacentTargets = this.spell.AdjacentTargets;
-        }
-
-
-        /// <summary>
-        /// Start executing the combat action.
-        /// </summary>
-        public override void Start()
-        {
-            // play the creation sound effect
-            AudioManager.PlayCue(spell.CreatingCueName);
-
-            base.Start();
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Updates the action over time.
-        /// </summary>
-        public override void Update(GameTime gameTime)
-        {
-            // update the animations
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-            spell.SpellSprite.UpdateAnimation(elapsedSeconds);
-            if (spell.Overlay != null)
-            {
-                spell.Overlay.UpdateAnimation(elapsedSeconds);
-                if (!spell.Overlay.IsPlaybackComplete &&
-                    Target.CombatSprite.IsPlaybackComplete)
-                {
-                    spell.Overlay.StopAnimation();
-                }
-            }
-
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw any elements of the action that are independent of the character.
-        /// </summary>
-        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
-        {
-            // draw the spell projectile
-            if (!spell.SpellSprite.IsPlaybackComplete)
-            {
-                if (stage == CombatActionStage.Advancing)
-                {
-                    spell.SpellSprite.Draw(spriteBatch, spellSpritePosition, 0f,
-                        projectileSpriteEffect);
-                }
-                else
-                {
-                    spell.SpellSprite.Draw(spriteBatch, spellSpritePosition, 0f);
-                }
-            }
-
-            // draw the spell overlay
-            if (!spell.Overlay.IsPlaybackComplete)
-            {
-                spell.Overlay.Draw(spriteBatch, Target.Position, 0f);
-            }
-
-            base.Draw(gameTime, spriteBatch);
-        }
-
-
-        #endregion
-
-
-        #region Static Calculation Methods
-
-
-        /// <summary>
-        /// Calculate the spell damage done by the given combatant and spell.
-        /// </summary>
-        public static StatisticsValue CalculateSpellDamage(Combatant combatant, 
-            Spell spell)
-        {
-            // check the parameters
-            if (combatant == null)
-            {
-                throw new ArgumentNullException("combatant");
-            }
-            if (spell == null)
-            {
-                throw new ArgumentNullException("spell");
-            }
-
-            // get the magical offense from the character's class, gear, and bonuses
-            // -- note that this includes stat buffs
-            int magicalOffense = combatant.Statistics.MagicalOffense;
-
-            // add the magical offense to the spell
-            StatisticsValue damage = 
-                spell.TargetEffectRange.GenerateValue(Session.Random);
-            damage.HealthPoints += (damage.HealthPoints != 0) ? magicalOffense : 0;
-            damage.MagicPoints += (damage.MagicPoints != 0) ? magicalOffense : 0;
-            damage.PhysicalOffense += (damage.PhysicalOffense != 0) ? magicalOffense : 0;
-            damage.PhysicalDefense += (damage.PhysicalDefense != 0) ? magicalOffense : 0;
-            damage.MagicalOffense += (damage.MagicalOffense != 0) ? magicalOffense : 0;
-            damage.MagicalDefense += (damage.MagicalDefense != 0) ? magicalOffense : 0;
-
-            // add in the spell damage
-            return damage;
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// SpellCombatAction.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Audio;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// A spell-casting combat action, including related data and calculations.
+    /// </summary>
+    class SpellCombatAction : CombatAction
+    {
+
+
+        /// <summary>
+        /// Returns true if the action is offensive, targeting the opponents.
+        /// </summary>
+        public override bool IsOffensive
+        {
+            get { return Spell.IsOffensive; }
+        }
+
+        
+        /// <summary>
+        /// Returns true if the character can use this action.
+        /// </summary>
+        public override bool IsCharacterValidUser
+        {
+            get
+            {
+                return (Spell.MagicPointCost <= Combatant.Statistics.MagicPoints);
+            }
+        }
+
+
+        /// <summary>
+        /// Returns true if this action requires a target.
+        /// </summary>
+        public override bool IsTargetNeeded
+        {
+            get { return true; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The spell used in this action.
+        /// </summary>
+        private Spell spell;
+
+        /// <summary>
+        /// The spell used in this action.
+        /// </summary>
+        public Spell Spell
+        {
+            get { return spell; }
+        }
+
+
+        /// <summary>
+        /// The current position of the spell sprite.
+        /// </summary>
+        private Vector2 spellSpritePosition;
+
+
+        /// <summary>
+        /// Apply the action's spell to the given target.
+        /// </summary>
+        /// <returns>True if there was any effect on the target.</returns>
+        private bool ApplySpell(Combatant spellTarget)
+        {
+            StatisticsValue effectStatistics = CalculateSpellDamage(combatant, spell);
+            if (spell.IsOffensive)
+            {
+                // calculate the defense
+                Int32Range defenseRange = spellTarget.Character.MagicDefenseRange + 
+                    spellTarget.Statistics.MagicalDefense;
+                Int32 defense = defenseRange.GenerateValue(Session.Random);
+                // subtract the defense
+                effectStatistics -= new StatisticsValue(defense,
+                    defense, defense, defense, defense, defense);
+                // make sure that this only contains damage
+                effectStatistics.ApplyMinimum(new StatisticsValue());
+                // damage the target
+                spellTarget.Damage(effectStatistics, spell.TargetDuration);
+            }
+            else
+            {
+                // make sure that this only contains healing
+                effectStatistics.ApplyMinimum(new StatisticsValue());
+                // heal the target
+                spellTarget.Heal(effectStatistics, spell.TargetDuration);
+            }
+
+            return !effectStatistics.IsZero;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The speed at which the projectile moves, in units per second.
+        /// </summary>
+        private const float projectileSpeed = 600f;
+
+
+        /// <summary>
+        /// The direction of the projectile.
+        /// </summary>
+        private Vector2 projectileDirection;
+
+
+        /// <summary>
+        /// The distance covered so far by the projectile.
+        /// </summary>
+        private float projectileDistanceCovered = 0f;
+
+
+        /// <summary>
+        /// The total distance between the original combatant position and the target.
+        /// </summary>
+        private float totalProjectileDistance;
+
+
+        /// <summary>
+        /// The sprite effect on the projectile, if any.
+        /// </summary>
+        private SpriteEffects projectileSpriteEffect = SpriteEffects.None;
+
+
+        /// <summary>
+        /// The sound effect cue for the traveling projectile.
+        /// </summary>
+        private Cue projectileCue;
+
+
+
+
+
+
+        /// <summary>
+        /// Starts a new combat stage.  Called right after the stage changes.
+        /// </summary>
+        /// <remarks>The stage never changes into NotStarted.</remarks>
+        protected override void StartStage()
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Preparing: // called from Start()
+                    {
+                        // play the animations
+                        combatant.CombatSprite.PlayAnimation("SpellCast");
+                        spellSpritePosition = Combatant.Position;
+                        spell.SpellSprite.PlayAnimation("Creation");
+                        // remove the magic points
+                        Combatant.PayCostForSpell(spell);
+                    }
+                    break;
+
+                case CombatActionStage.Advancing:
+                    {
+                        // play the animations
+                        spell.SpellSprite.PlayAnimation("Traveling");
+                        // calculate the projectile destination
+                        projectileDirection = Target.Position -
+                            Combatant.OriginalPosition;
+                        totalProjectileDistance = projectileDirection.Length();
+                        projectileDirection.Normalize();
+                        projectileDistanceCovered = 0f;
+                        // determine if the projectile is flipped
+                        if (Target.Position.X > Combatant.Position.X)
+                        {
+                            projectileSpriteEffect = SpriteEffects.FlipHorizontally;
+                        }
+                        else
+                        {
+                            projectileSpriteEffect = SpriteEffects.None;
+                        }
+                        // get the projectile's cue and play it
+                        projectileCue = AudioManager.GetCue(spell.TravelingCueName);
+                        if (projectileCue != null)
+                        {
+                            projectileCue.Play();
+                        }
+                    }
+                    break;
+
+                case CombatActionStage.Executing:
+                    {
+                        // play the animation
+                        spell.SpellSprite.PlayAnimation("Impact");
+                        // stop the projectile sound effect
+                        if (projectileCue != null)
+                        {
+                            projectileCue.Stop(AudioStopOptions.Immediate);
+                        }
+                        // apply the spell effect to the primary target
+                        bool damagedAnyone = ApplySpell(Target);
+                        // apply the spell to the secondary targets
+                        foreach (Combatant targetCombatant in
+                            CombatEngine.SecondaryTargetedCombatants)
+                        {
+                            // skip dead or dying targets
+                            if (targetCombatant.IsDeadOrDying)
+                            {
+                                continue;
+                            }
+                            // apply the spell
+                            damagedAnyone |= ApplySpell(targetCombatant);
+                        }
+                        // play the impact sound effect
+                        if (damagedAnyone)
+                        {
+                            AudioManager.PlayCue(spell.ImpactCueName);
+                            if (spell.Overlay != null)
+                            {
+                                spell.Overlay.PlayAnimation(0);
+                                spell.Overlay.ResetAnimation();
+                            }
+                        }
+                    }
+                    break;
+
+                case CombatActionStage.Returning:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    break;
+
+                case CombatActionStage.Finishing:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    break;
+
+                case CombatActionStage.Complete:
+                    // play the animation
+                    combatant.CombatSprite.PlayAnimation("Idle");
+                    // make sure that the overlay has stopped
+                    spell.Overlay.StopAnimation();
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Update the action for the current stage.
+        /// </summary>
+        /// <remarks>
+        /// This function is guaranteed to be called at least once per stage.
+        /// </remarks>
+        protected override void UpdateCurrentStage(GameTime gameTime)
+        {
+            switch (stage)
+            {
+                case CombatActionStage.Advancing:
+                    if (projectileDistanceCovered < totalProjectileDistance)
+                    {
+                        projectileDistanceCovered += projectileSpeed *
+                            (float)gameTime.ElapsedGameTime.TotalSeconds;
+                    }
+                    spellSpritePosition = combatant.OriginalPosition +
+                        projectileDirection * projectileDistanceCovered;
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// Returns true if the combat action is ready to proceed to the next stage.
+        /// </summary>
+        protected override bool IsReadyForNextStage
+        {
+            get
+            {
+                switch (stage)
+                {
+                    case CombatActionStage.Preparing: // ready to advance?
+                        return (combatant.CombatSprite.IsPlaybackComplete &&
+                            spell.SpellSprite.IsPlaybackComplete);
+
+                    case CombatActionStage.Advancing: // ready to execute?
+                        if (spell.SpellSprite.IsPlaybackComplete ||
+                            (projectileDistanceCovered >= totalProjectileDistance))
+                        {
+                            projectileDistanceCovered = totalProjectileDistance;
+                            return true;
+                        }
+                        return false;
+
+                    case CombatActionStage.Executing: // ready to return?
+                        return spell.SpellSprite.IsPlaybackComplete;
+                }
+
+                // fall through to the base behavior
+                return base.IsReadyForNextStage;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The heuristic used to compare actions of this type to similar ones.
+        /// </summary>
+        public override int Heuristic
+        {
+            get
+            {
+                return (Combatant.Statistics.MagicalOffense + 
+                    Spell.TargetEffectRange.HealthPointsRange.Average);
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new SpellCombatAction object.
+        /// </summary>
+        /// <param name="character">The combatant performing the action.</param>
+        public SpellCombatAction(Combatant combatant, Spell spell)
+            : base(combatant)
+        {
+            // check the parameter
+            if (spell == null)
+            {
+                throw new ArgumentNullException("spell");
+            }
+
+            // assign the parameter
+            this.spell = spell;
+            this.adjacentTargets = this.spell.AdjacentTargets;
+        }
+
+
+        /// <summary>
+        /// Start executing the combat action.
+        /// </summary>
+        public override void Start()
+        {
+            // play the creation sound effect
+            AudioManager.PlayCue(spell.CreatingCueName);
+
+            base.Start();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Updates the action over time.
+        /// </summary>
+        public override void Update(GameTime gameTime)
+        {
+            // update the animations
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+            spell.SpellSprite.UpdateAnimation(elapsedSeconds);
+            if (spell.Overlay != null)
+            {
+                spell.Overlay.UpdateAnimation(elapsedSeconds);
+                if (!spell.Overlay.IsPlaybackComplete &&
+                    Target.CombatSprite.IsPlaybackComplete)
+                {
+                    spell.Overlay.StopAnimation();
+                }
+            }
+
+            base.Update(gameTime);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw any elements of the action that are independent of the character.
+        /// </summary>
+        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
+        {
+            // draw the spell projectile
+            if (!spell.SpellSprite.IsPlaybackComplete)
+            {
+                if (stage == CombatActionStage.Advancing)
+                {
+                    spell.SpellSprite.Draw(spriteBatch, spellSpritePosition, 0f,
+                        projectileSpriteEffect);
+                }
+                else
+                {
+                    spell.SpellSprite.Draw(spriteBatch, spellSpritePosition, 0f);
+                }
+            }
+
+            // draw the spell overlay
+            if (!spell.Overlay.IsPlaybackComplete)
+            {
+                spell.Overlay.Draw(spriteBatch, Target.Position, 0f);
+            }
+
+            base.Draw(gameTime, spriteBatch);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Calculate the spell damage done by the given combatant and spell.
+        /// </summary>
+        public static StatisticsValue CalculateSpellDamage(Combatant combatant, 
+            Spell spell)
+        {
+            // check the parameters
+            if (combatant == null)
+            {
+                throw new ArgumentNullException("combatant");
+            }
+            if (spell == null)
+            {
+                throw new ArgumentNullException("spell");
+            }
+
+            // get the magical offense from the character's class, gear, and bonuses
+            // -- note that this includes stat buffs
+            int magicalOffense = combatant.Statistics.MagicalOffense;
+
+            // add the magical offense to the spell
+            StatisticsValue damage = 
+                spell.TargetEffectRange.GenerateValue(Session.Random);
+            damage.HealthPoints += (damage.HealthPoints != 0) ? magicalOffense : 0;
+            damage.MagicPoints += (damage.MagicPoints != 0) ? magicalOffense : 0;
+            damage.PhysicalOffense += (damage.PhysicalOffense != 0) ? magicalOffense : 0;
+            damage.PhysicalDefense += (damage.PhysicalDefense != 0) ? magicalOffense : 0;
+            damage.MagicalOffense += (damage.MagicalOffense != 0) ? magicalOffense : 0;
+            damage.MagicalDefense += (damage.MagicalDefense != 0) ? magicalOffense : 0;
+
+            // add in the spell damage
+            return damage;
+        }
+
+
+    }
+}

+ 275 - 287
RolePlayingGame/Combat/ArtificialIntelligence.cs → RolePlayingGame/Core/Combat/ArtificialIntelligence.cs

@@ -1,287 +1,275 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// ArtificialIntelligence.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using System.Collections.Generic;
-using RolePlayingGameData;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// Determines actions for a given monster in combat.
-    /// </summary>
-    /// <remarks>
-    /// This was separated from the Monster type so the two kinds of code 
-    /// (combat operation and data encapsulation) remain clear for easy re-use.
-    /// </remarks>
-    class ArtificialIntelligence
-    {
-        /// <summary>
-        /// The monster that this object is choosing actions for.
-        /// </summary>
-        private CombatantMonster monster;
-
-
-        #region Action Lists
-
-
-        /// <summary>
-        /// The offensive actions available to the monster.
-        /// </summary>
-        private List<CombatAction> offensiveActions = new List<CombatAction>();
-
-
-        /// <summary>
-        /// The defensive actions available to the monster.
-        /// </summary>
-        private List<CombatAction> defensiveActions = new List<CombatAction>();
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Construct a new ArtificialIntelligence object to control a given combatant.
-        /// </summary>
-        public ArtificialIntelligence(CombatantMonster monster)
-        {
-            // check the parameter
-            if (monster == null)
-            {
-                throw new ArgumentNullException("monster");
-            }
-
-            // assign the parameter
-            this.monster = monster;
-
-            // generate all actions available
-            GenerateAllActions();
-        }
-
-
-        #endregion
-
-
-        #region Action Generation
-
-
-        /// <summary>
-        /// Generate the actions available to this monster.
-        /// </summary>
-        private void GenerateAllActions()
-        {
-            // clear out any pre-existing actions
-            offensiveActions.Clear();
-            defensiveActions.Clear();
-
-            // generate the melee attack option
-            GenerateMeleeAction();
-
-            // generate the spell attack options
-            GenerateSpellAttackActions();
-
-            // generate the defend action
-            GenerateDefendAction();
-
-            // sort the lists by potential, descending
-            offensiveActions.Sort(CombatAction.CompareCombatActionsByHeuristic);
-            defensiveActions.Sort(CombatAction.CompareCombatActionsByHeuristic);
-        }
-
-
-        /// <summary>
-        /// Generate the melee attack option for this monster.
-        /// </summary>
-        private void GenerateMeleeAction()
-        {
-            // add a new melee action to the list
-            offensiveActions.Add(new MeleeCombatAction(monster));
-        }
-
-
-        /// <summary>
-        /// Generate the melee attack option for this monster.
-        /// </summary>
-        private void GenerateDefendAction()
-        {
-            // add a new melee action to the list
-            defensiveActions.Add(new DefendCombatAction(monster));
-        }
-
-
-        /// <summary>
-        /// Generate the spell attack options for this monster.
-        /// </summary>
-        private void GenerateSpellAttackActions()
-        {
-            // retrieve the spells for this monster
-            List<Spell> spells = monster.Monster.Spells;
-
-            // if there are no spells, then there's nothing to do
-            if ((spells == null) || (spells.Count <= 0))
-            {
-                return;
-            }
-
-            // check each spell for attack actions
-            foreach (Spell spell in spells)
-            {
-                // skip non-offensive spells
-                if (!spell.IsOffensive)
-                {
-                    continue;
-                }
-
-                // add the new action to the list
-                offensiveActions.Add(new SpellCombatAction(monster, spell));
-            }
-        }
-
-
-        #endregion
-
-
-        #region Action Selection
-
-
-        /// <summary>
-        /// Choose the next action for the monster.
-        /// </summary>
-        /// <returns>The chosen action, or null if no action is desired.</returns>
-        public CombatAction ChooseAction()
-        {
-            CombatAction combatAction = null;
-
-            // determine if the monster will use a defensive action
-            if ((monster.Monster.DefendPercentage > 0) && 
-                (defensiveActions.Count > 0) &&
-                (Session.Random.Next(0, 100) < monster.Monster.DefendPercentage))
-            {
-                combatAction = ChooseDefensiveAction();
-            }
-
-            // if we do not have an action yet, choose an offensive action
-            combatAction = (combatAction ?? ChooseOffensiveAction());
-
-            // reset the action to the initial state
-            combatAction.Reset();
-
-            return combatAction;
-        }
-
-
-        /// <summary>
-        /// Choose which offensive action to perform.
-        /// </summary>
-        /// <returns>The chosen action, or null if no action is desired.</returns>
-        private CombatAction ChooseOffensiveAction()
-        {
-            List<CombatantPlayer> players = CombatEngine.Players;
-
-            // be sure that there is a valid combat in progress
-            if ((players == null) || (players.Count <= 0))
-            {
-                return null;
-            }
-
-            // randomly choose a living target from the party
-            int targetIndex;
-            do
-            {
-                targetIndex = Session.Random.Next(players.Count);
-            }
-            while (players[targetIndex].IsDeadOrDying);
-            CombatantPlayer target = players[targetIndex];
-
-            // the action lists are sorted by descending potential, 
-            // so find the first eligible action
-            foreach (CombatAction action in offensiveActions)
-            {
-                // check the restrictions on the action
-                if (action.IsCharacterValidUser)
-                {
-                    action.Target = target;
-                    return action;
-                }
-            }
-
-            // no eligible actions found
-            return null;
-        }
-
-
-        /// <summary>
-        /// Choose which defensive action to perform.
-        /// </summary>
-        /// <returns>The chosen action, or null if no action is desired.</returns>
-        private CombatAction ChooseDefensiveAction()
-        {
-            List<CombatantMonster> monsters = CombatEngine.Monsters;
-
-            // be sure that there is a valid combat in progress
-            if ((monsters == null) || (monsters.Count <= 0))
-            {
-                return null;
-            }
-
-            // find the monster with the least health
-            CombatantMonster target = null;
-            int leastHealthAmount = Int32.MaxValue;
-            foreach (CombatantMonster targetMonster in monsters)
-            {
-                // skip dead or dying targets
-                if (targetMonster.IsDeadOrDying)
-                {
-                    continue;
-                }
-                // if the monster is damaged and it has the least health points,
-                // then it becomes the new target
-                StatisticsValue maxStatistics =
-                    targetMonster.Monster.CharacterClass.GetStatisticsForLevel(
-                        targetMonster.Monster.CharacterLevel);
-                int targetMonsterHealthPoints = targetMonster.Statistics.HealthPoints;
-                if ((targetMonsterHealthPoints < maxStatistics.HealthPoints) &&
-                    (targetMonsterHealthPoints < leastHealthAmount))
-                {
-                    target = targetMonster;
-                    leastHealthAmount = targetMonsterHealthPoints;
-                }
-            }
-
-            // if there is no target, then don't do anything
-            if (target == null)
-            {
-                return null;
-            }
-
-            // the action lists are sorted by descending potential, 
-            // so find the first eligible action
-            foreach (CombatAction action in defensiveActions)
-            {
-                // check the restrictions on the action
-                if (action.IsCharacterValidUser)
-                {
-                    action.Target = target;
-                    return action;
-                }
-            }
-
-            // no eligible actions found
-            return null;
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// ArtificialIntelligence.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using RolePlayingGameData;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// Determines actions for a given monster in combat.
+    /// </summary>
+    /// <remarks>
+    /// This was separated from the Monster type so the two kinds of code 
+    /// (combat operation and data encapsulation) remain clear for easy re-use.
+    /// </remarks>
+    class ArtificialIntelligence
+    {
+        /// <summary>
+        /// The monster that this object is choosing actions for.
+        /// </summary>
+        private CombatantMonster monster;
+
+
+
+
+        /// <summary>
+        /// The offensive actions available to the monster.
+        /// </summary>
+        private List<CombatAction> offensiveActions = new List<CombatAction>();
+
+
+        /// <summary>
+        /// The defensive actions available to the monster.
+        /// </summary>
+        private List<CombatAction> defensiveActions = new List<CombatAction>();
+
+
+
+
+
+
+        /// <summary>
+        /// Construct a new ArtificialIntelligence object to control a given combatant.
+        /// </summary>
+        public ArtificialIntelligence(CombatantMonster monster)
+        {
+            // check the parameter
+            if (monster == null)
+            {
+                throw new ArgumentNullException("monster");
+            }
+
+            // assign the parameter
+            this.monster = monster;
+
+            // generate all actions available
+            GenerateAllActions();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Generate the actions available to this monster.
+        /// </summary>
+        private void GenerateAllActions()
+        {
+            // clear out any pre-existing actions
+            offensiveActions.Clear();
+            defensiveActions.Clear();
+
+            // generate the melee attack option
+            GenerateMeleeAction();
+
+            // generate the spell attack options
+            GenerateSpellAttackActions();
+
+            // generate the defend action
+            GenerateDefendAction();
+
+            // sort the lists by potential, descending
+            offensiveActions.Sort(CombatAction.CompareCombatActionsByHeuristic);
+            defensiveActions.Sort(CombatAction.CompareCombatActionsByHeuristic);
+        }
+
+
+        /// <summary>
+        /// Generate the melee attack option for this monster.
+        /// </summary>
+        private void GenerateMeleeAction()
+        {
+            // add a new melee action to the list
+            offensiveActions.Add(new MeleeCombatAction(monster));
+        }
+
+
+        /// <summary>
+        /// Generate the melee attack option for this monster.
+        /// </summary>
+        private void GenerateDefendAction()
+        {
+            // add a new melee action to the list
+            defensiveActions.Add(new DefendCombatAction(monster));
+        }
+
+
+        /// <summary>
+        /// Generate the spell attack options for this monster.
+        /// </summary>
+        private void GenerateSpellAttackActions()
+        {
+            // retrieve the spells for this monster
+            List<Spell> spells = monster.Monster.Spells;
+
+            // if there are no spells, then there's nothing to do
+            if ((spells == null) || (spells.Count <= 0))
+            {
+                return;
+            }
+
+            // check each spell for attack actions
+            foreach (Spell spell in spells)
+            {
+                // skip non-offensive spells
+                if (!spell.IsOffensive)
+                {
+                    continue;
+                }
+
+                // add the new action to the list
+                offensiveActions.Add(new SpellCombatAction(monster, spell));
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Choose the next action for the monster.
+        /// </summary>
+        /// <returns>The chosen action, or null if no action is desired.</returns>
+        public CombatAction ChooseAction()
+        {
+            CombatAction combatAction = null;
+
+            // determine if the monster will use a defensive action
+            if ((monster.Monster.DefendPercentage > 0) && 
+                (defensiveActions.Count > 0) &&
+                (Session.Random.Next(0, 100) < monster.Monster.DefendPercentage))
+            {
+                combatAction = ChooseDefensiveAction();
+            }
+
+            // if we do not have an action yet, choose an offensive action
+            combatAction = (combatAction ?? ChooseOffensiveAction());
+
+            // reset the action to the initial state
+            combatAction.Reset();
+
+            return combatAction;
+        }
+
+
+        /// <summary>
+        /// Choose which offensive action to perform.
+        /// </summary>
+        /// <returns>The chosen action, or null if no action is desired.</returns>
+        private CombatAction ChooseOffensiveAction()
+        {
+            List<CombatantPlayer> players = CombatEngine.Players;
+
+            // be sure that there is a valid combat in progress
+            if ((players == null) || (players.Count <= 0))
+            {
+                return null;
+            }
+
+            // randomly choose a living target from the party
+            int targetIndex;
+            do
+            {
+                targetIndex = Session.Random.Next(players.Count);
+            }
+            while (players[targetIndex].IsDeadOrDying);
+            CombatantPlayer target = players[targetIndex];
+
+            // the action lists are sorted by descending potential, 
+            // so find the first eligible action
+            foreach (CombatAction action in offensiveActions)
+            {
+                // check the restrictions on the action
+                if (action.IsCharacterValidUser)
+                {
+                    action.Target = target;
+                    return action;
+                }
+            }
+
+            // no eligible actions found
+            return null;
+        }
+
+
+        /// <summary>
+        /// Choose which defensive action to perform.
+        /// </summary>
+        /// <returns>The chosen action, or null if no action is desired.</returns>
+        private CombatAction ChooseDefensiveAction()
+        {
+            List<CombatantMonster> monsters = CombatEngine.Monsters;
+
+            // be sure that there is a valid combat in progress
+            if ((monsters == null) || (monsters.Count <= 0))
+            {
+                return null;
+            }
+
+            // find the monster with the least health
+            CombatantMonster target = null;
+            int leastHealthAmount = Int32.MaxValue;
+            foreach (CombatantMonster targetMonster in monsters)
+            {
+                // skip dead or dying targets
+                if (targetMonster.IsDeadOrDying)
+                {
+                    continue;
+                }
+                // if the monster is damaged and it has the least health points,
+                // then it becomes the new target
+                StatisticsValue maxStatistics =
+                    targetMonster.Monster.CharacterClass.GetStatisticsForLevel(
+                        targetMonster.Monster.CharacterLevel);
+                int targetMonsterHealthPoints = targetMonster.Statistics.HealthPoints;
+                if ((targetMonsterHealthPoints < maxStatistics.HealthPoints) &&
+                    (targetMonsterHealthPoints < leastHealthAmount))
+                {
+                    target = targetMonster;
+                    leastHealthAmount = targetMonsterHealthPoints;
+                }
+            }
+
+            // if there is no target, then don't do anything
+            if (target == null)
+            {
+                return null;
+            }
+
+            // the action lists are sorted by descending potential, 
+            // so find the first eligible action
+            foreach (CombatAction action in defensiveActions)
+            {
+                // check the restrictions on the action
+                if (action.IsCharacterValidUser)
+                {
+                    action.Target = target;
+                    return action;
+                }
+            }
+
+            // no eligible actions found
+            return null;
+        }
+
+
+    }
+}

+ 29 - 33
RolePlayingGame/Combat/CombatEndingState.cs → RolePlayingGame/Core/Combat/CombatEndingState.cs

@@ -1,33 +1,29 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// CombatEndingState.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-#endregion
-
-namespace RolePlaying
-{
-    enum CombatEndingState
-    {
-        /// <summary>
-        /// All of the monsters died in combat.
-        /// </summary>
-        Victory,
-
-        /// <summary>
-        /// The party successfully fled from combat.
-        /// </summary>
-        Fled,
-
-        /// <summary>
-        /// All of the players died in combat.
-        /// </summary>
-        Loss,
-    }
-}
+//-----------------------------------------------------------------------------
+// CombatEndingState.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+
+namespace RolePlaying
+{
+    enum CombatEndingState
+    {
+        /// <summary>
+        /// All of the monsters died in combat.
+        /// </summary>
+        Victory,
+
+        /// <summary>
+        /// The party successfully fled from combat.
+        /// </summary>
+        Fled,
+
+        /// <summary>
+        /// All of the players died in combat.
+        /// </summary>
+        Loss,
+    }
+}

+ 1953 - 1999
RolePlayingGame/Combat/CombatEngine.cs → RolePlayingGame/Core/Combat/CombatEngine.cs

@@ -1,1999 +1,1953 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// CombatEngine.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using System.Collections.Generic;
-using System.IO;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Content;
-using Microsoft.Xna.Framework.Graphics;
-using Microsoft.Xna.Framework.Input;
-using RolePlayingGameData;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// The runtime execution engine for the combat system.
-    /// </summary>
-    class CombatEngine
-    {
-        #region Singleton
-
-
-        /// <summary>
-        /// The singleton of the combat engine.
-        /// </summary>
-        private static CombatEngine singleton = null;
-
-
-        /// <summary>
-        /// Check to see if there is a combat going on, and throw an exception if not.
-        /// </summary>
-        private static void CheckSingleton()
-        {
-            if (singleton == null)
-            {
-                throw new InvalidOperationException(
-                    "There is no active combat at this time.");
-            }
-        }
-
-
-        #endregion
-
-
-        #region State
-
-
-        /// <summary>
-        /// If true, the combat engine is active and the user is in combat.
-        /// </summary>
-        public static bool IsActive
-        {
-          get { return (singleton != null); }
-        }
-
-
-        /// <summary>
-        /// If true, it is currently the players' turn.
-        /// </summary>
-        private bool isPlayersTurn;
-
-        /// <summary>
-        /// If true, it is currently the players' turn.
-        /// </summary>
-        public static bool IsPlayersTurn
-        {
-            get 
-            {
-                CheckSingleton();
-                return singleton.isPlayersTurn; 
-            }
-        }
-
-
-        #endregion
-
-
-        #region Rewards
-
-
-        /// <summary>
-        /// The fixed combat used to generate this fight, if any.
-        /// </summary>
-        /// <remarks>
-        /// Used for rewards.  Null means it was a random fight with no special rewards.
-        /// </remarks>
-        private MapEntry<FixedCombat> fixedCombatEntry;
-
-        /// <summary>
-        /// The fixed combat used to generate this fight, if any.
-        /// </summary>
-        /// <remarks>
-        /// Used for rewards.  Null means it was a random fight with no special rewards.
-        /// </remarks>
-        public static MapEntry<FixedCombat> FixedCombatEntry
-        {
-            get { return (singleton == null ? null : singleton.fixedCombatEntry); }
-        }
-
-
-        #endregion
-
-
-        #region Players
-
-
-        /// <summary>
-        /// The players involved in the current combat.
-        /// </summary>
-        private List<CombatantPlayer> players = null;
-
-        /// <summary>
-        /// The players involved in the current combat.
-        /// </summary>
-        public static List<CombatantPlayer> Players
-        {
-            get 
-            {
-                CheckSingleton();
-                return singleton.players; 
-            }
-        }
-
-
-        private int highlightedPlayer;
-
-
-        /// <summary>
-        /// The positions of the players on screen.
-        /// </summary>
-        private static readonly Vector2[] PlayerPositions = new Vector2[5]
-        {
-            new Vector2(850f, 345f),
-            new Vector2(980f, 260f),
-            new Vector2(940f, 440f),
-            new Vector2(1100f, 200f),
-            new Vector2(1100f, 490f)
-        };
-
-
-        /// <summary>
-        /// Start the given player's combat turn.
-        /// </summary>
-        private void BeginPlayerTurn(CombatantPlayer player)
-        {
-            // check the parameter
-            if (player == null)
-            {
-                throw new ArgumentNullException("player");
-            }
-
-            // set the highlight sprite
-            highlightedCombatant = player;
-            primaryTargetedCombatant = null;
-            secondaryTargetedCombatants.Clear();
-
-            Session.Hud.ActionText = "Choose an Action";
-        }
-
-
-        /// <summary>
-        /// Begin the players' turn in this combat round.
-        /// </summary>
-        private void BeginPlayersTurn()
-        {
-            // set the player-turn
-            isPlayersTurn = true;
- 
-            // reset each player for the next combat turn
-            foreach (CombatantPlayer player in players)
-            {
-                // reset the animation of living players
-                if (!player.IsDeadOrDying)
-                {
-                    player.State = Character.CharacterState.Idle;
-                }
-                // reset the turn-taken flag
-                player.IsTurnTaken = false;
-                // clear the combat action
-                player.CombatAction = null;
-                // advance each player
-                player.AdvanceRound();
-            }
-
-            // set the action text on the HUD
-            Session.Hud.ActionText = "Your Party's Turn";
-
-            // find the first player who is alive
-            highlightedPlayer = 0;
-            CombatantPlayer firstPlayer = players[highlightedPlayer];
-            while (firstPlayer.IsTurnTaken || firstPlayer.IsDeadOrDying)
-            {
-                highlightedPlayer = (highlightedPlayer + 1) % players.Count;
-                firstPlayer = players[highlightedPlayer];
-            }
-
-            // start the first player's turn
-            BeginPlayerTurn(firstPlayer);
-        }
-
-
-        /// <summary>
-        /// Check for whether all players have taken their turn.
-        /// </summary>
-        private bool IsPlayersTurnComplete
-        {
-            get
-            {
-                return players.TrueForAll(delegate(CombatantPlayer player)
-                {
-                    return (player.IsTurnTaken || player.IsDeadOrDying);
-                });
-            }
-        }
-
-
-        /// <summary>
-        /// Check for whether the players have been wiped out and defeated.
-        /// </summary>
-        private bool ArePlayersDefeated
-        {
-            get 
-            {
-                return players.TrueForAll(delegate(CombatantPlayer player)
-                {
-                    return (player.State == Character.CharacterState.Dead);
-                });
-            }
-        }
-
-
-        /// <summary>
-        /// Retrieves the first living player, if any.
-        /// </summary>
-        private CombatantPlayer FirstPlayerTarget
-        {
-            get
-            {
-                // if there are no living players, then this is moot
-                if (ArePlayersDefeated)
-                {
-                    return null;
-                }
-
-                int playerIndex = 0;
-                while ((playerIndex < players.Count) &&
-                    players[playerIndex].IsDeadOrDying)
-                {
-                    playerIndex++;
-                }
-                return players[playerIndex];
-            }
-        }
-
-
-        #endregion
-
-
-        #region Monsters
-
-
-        /// <summary>
-        /// The monsters involved in the current combat.
-        /// </summary>
-        private List<CombatantMonster> monsters = null;
-
-        /// <summary>
-        /// The monsters involved in the current combat.
-        /// </summary>
-        public static List<CombatantMonster> Monsters
-        {
-            get 
-            {
-                CheckSingleton();
-                return singleton.monsters; 
-            }
-        }
-
-
-        /// <summary>
-        /// The positions of the monsters on the screen.
-        /// </summary>
-        private static readonly Vector2[] MonsterPositions = new Vector2[5]
-        {
-            new Vector2(480f, 345f),
-            new Vector2(345f, 260f),
-            new Vector2(370f, 440f),
-            new Vector2(225f, 200f),
-            new Vector2(225f, 490f)
-        };
-
-
-        /// <summary>
-        /// Start the given player's combat turn.
-        /// </summary>
-        private void BeginMonsterTurn(CombatantMonster monster)
-        {
-            // if it's null, find a random living monster who has yet to take their turn
-            if (monster == null)
-            {
-                // don't bother if all monsters have finished
-                if (IsMonstersTurnComplete)
-                {
-                    return;
-                }
-                // pick random living monsters who haven't taken their turn
-                do
-                {
-                    monster = monsters[Session.Random.Next(monsters.Count)];
-                }
-                while (monster.IsTurnTaken || monster.IsDeadOrDying);
-            }
-
-            // set the highlight sprite
-            highlightedCombatant = monster;
-            primaryTargetedCombatant = null;
-            secondaryTargetedCombatants.Clear();
-
-            // choose the action immediate
-            monster.CombatAction = monster.ArtificialIntelligence.ChooseAction();
-        }
-        
-        
-        /// <summary>
-        /// Begin the monsters' turn in this combat round.
-        /// </summary>
-        private void BeginMonstersTurn()
-        {
-            // set the monster-turn
-            isPlayersTurn = false;
-
-            // reset each monster for the next combat turn
-            foreach (CombatantMonster monster in monsters)
-            {
-                // reset the animations back to idle
-                monster.Character.State = Character.CharacterState.Idle;
-                // reset the turn-taken flag
-                monster.IsTurnTaken = false;
-                // clear the combat action
-                monster.CombatAction = null;
-                // advance the combatants
-                monster.AdvanceRound();
-            }
-            
-            // set the action text on the HUD
-            Session.Hud.ActionText = "Enemy Party's Turn";
-
-            // start a Session.Random monster's turn
-            BeginMonsterTurn(null);
-        }
-
-
-        /// <summary>
-        /// Check for whether all monsters have taken their turn.
-        /// </summary>
-        private bool IsMonstersTurnComplete
-        {
-            get
-            {
-                return monsters.TrueForAll(delegate(CombatantMonster monster)
-                {
-                    return (monster.IsTurnTaken || monster.IsDeadOrDying);
-                });
-            }
-        }
-
-
-        /// <summary>
-        /// Check for whether the monsters have been wiped out and defeated.
-        /// </summary>
-        private bool AreMonstersDefeated
-        {
-            get
-            {
-                return monsters.TrueForAll(delegate(CombatantMonster monster)
-                {
-                    return (monster.State == Character.CharacterState.Dead);
-                });
-            }
-        }
-
-
-        /// <summary>
-        /// Retrieves the first living monster, if any.
-        /// </summary>
-        private CombatantMonster FirstMonsterTarget
-        {
-            get
-            {
-                // if there are no living monsters, then this is moot
-                if (AreMonstersDefeated)
-                {
-                    return null;
-                }
-
-                int monsterIndex = 0;
-                while ((monsterIndex < monsters.Count) && 
-                    monsters[monsterIndex].IsDeadOrDying)
-                {
-                    monsterIndex++;
-                }
-                return monsters[monsterIndex];
-            }
-        }
-
-
-        #endregion
-
-
-        #region Targeting
-
-
-        /// <summary>
-        /// The currently highlighted player, if any.
-        /// </summary>
-        private Combatant highlightedCombatant;
-
-        /// <summary>
-        /// The currently highlighted player, if any.
-        /// </summary>
-        public static Combatant HighlightedCombatant
-        {
-            get
-            {
-                CheckSingleton();
-                return singleton.highlightedCombatant;
-            }
-        }
-
-
-        /// <summary>
-        /// The current primary target, if any.
-        /// </summary>
-        private Combatant primaryTargetedCombatant;
-
-        /// <summary>
-        /// The current primary target, if any.
-        /// </summary>
-        public static Combatant PrimaryTargetedCombatant
-        {
-            get
-            {
-                CheckSingleton();
-                return singleton.primaryTargetedCombatant;
-            }
-        }
-
-
-        /// <summary>
-        /// The current secondary targets, if any.
-        /// </summary>
-        private List<Combatant> secondaryTargetedCombatants = new List<Combatant>();
-
-        /// <summary>
-        /// The current secondary targets, if any.
-        /// </summary>
-        public static List<Combatant> SecondaryTargetedCombatants
-        {
-            get
-            {
-                CheckSingleton();
-                return singleton.secondaryTargetedCombatants;
-            }
-        }
-
-
-        /// <summary>
-        /// Retrieves the first living enemy, if any.
-        /// </summary>
-        public static Combatant FirstEnemyTarget
-        {
-            get
-            {
-                CheckSingleton();
-
-                if (IsPlayersTurn)
-                {
-                    return singleton.FirstMonsterTarget;
-                }
-                else
-                {
-                    return singleton.FirstPlayerTarget;
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Retrieves the first living ally, if any.
-        /// </summary>
-        public static Combatant FirstAllyTarget
-        {
-            get
-            {
-                CheckSingleton();
-
-                if (IsPlayersTurn)
-                {
-                    return singleton.FirstPlayerTarget;
-                }
-                else
-                {
-                    return singleton.FirstMonsterTarget;
-                }
-            }
-        }
-        
-
-        /// <summary>
-        /// Set the primary and any secondary targets.
-        /// </summary>
-        /// <param name="primaryTarget">The desired primary target.</param>
-        /// <param name="adjacentTargets">
-        /// The number of simultaneous, adjacent targets affected by this spell.
-        /// </param>
-        private void SetTargets(Combatant primaryTarget, int adjacentTargets)
-        {
-            // set the primary target
-            this.primaryTargetedCombatant = primaryTarget;
-
-            // set any secondary targets
-            this.secondaryTargetedCombatants.Clear();
-            if ((primaryTarget != null) && (adjacentTargets > 0))
-            {
-                // find out which side is targeted
-                bool isPlayerTarget = primaryTarget is CombatantPlayer;
-                // find the index
-                int primaryTargetIndex = 0;
-                if (isPlayerTarget)
-                {
-                    primaryTargetIndex = players.FindIndex(
-                        delegate(CombatantPlayer player)
-                        {
-                            return (player == primaryTarget);
-                        });
-                }
-                else
-                {
-                    primaryTargetIndex = monsters.FindIndex(
-                        delegate(CombatantMonster monster)
-                        {
-                            return (monster == primaryTarget);
-                        });
-                }
-                // add the surrounding indices
-                for (int i = 1; i <= adjacentTargets; i++)
-                {
-                    int leftIndex = primaryTargetIndex - i;
-                    if (leftIndex >= 0)
-                    {
-                        secondaryTargetedCombatants.Add(
-                            isPlayerTarget ? players[leftIndex] as Combatant : 
-                                monsters[leftIndex] as Combatant);
-                    }
-                    int rightIndex = primaryTargetIndex + i;
-                    if (rightIndex < (isPlayerTarget ? players.Count : monsters.Count))
-                    {
-                        secondaryTargetedCombatants.Add(
-                            isPlayerTarget ? players[rightIndex] as Combatant :
-                            monsters[rightIndex] as Combatant);
-                    }
-                }
-            }
-        }
-
-
-        #endregion
-
-
-        #region Damage Sprites
-
-
-        /// <summary>
-        /// A combat effect sprite, typically used for damage or healing numbers.
-        /// </summary>
-        private class CombatEffect
-        {
-            #region Position
-
-
-            /// <summary>
-            /// The starting position of the effect on the screen.
-            /// </summary>
-            public Vector2 OriginalPosition;
-
-
-            /// <summary>
-            /// The current position of the effect on the screen.
-            /// </summary>
-            protected Vector2 position;
-
-            /// <summary>
-            /// The current position of the effect on the screen.
-            /// </summary>
-            public Vector2 Position
-            {
-                get { return position; }
-            }
-
-
-            #endregion
-
-
-            #region Text
-
-
-            /// <summary>
-            /// The text that appears on top of the effect.
-            /// </summary>
-            protected string text = String.Empty;
-
-            /// <summary>
-            /// The text that appears on top of the effect.
-            /// </summary>
-            public string Text
-            {
-                get { return text; }
-                set
-                {
-                    text = value;
-                    // recalculate the origin
-                    if (String.IsNullOrEmpty(text))
-                    {
-                        textOrigin = Vector2.Zero;
-                    }
-                    else
-                    {
-                        Vector2 textSize = Fonts.DamageFont.MeasureString(text);
-                        textOrigin = new Vector2(
-                            (float)Math.Ceiling(textSize.X / 2f), 
-                            (float)Math.Ceiling(textSize.Y / 2f));
-                    }
-                }
-            }
-
-            /// <summary>
-            /// The drawing origin of the text on the effect.
-            /// </summary>
-            private Vector2 textOrigin = Vector2.Zero;
-
-
-            #endregion
-
-
-            #region Rise Animation
-
-
-            /// <summary>
-            /// The speed at which the effect rises on the screen.
-            /// </summary>
-            const int risePerSecond = 100;
-
-            /// <summary>
-            /// The amount which the effect rises on the screen.
-            /// </summary>
-            const int riseMaximum = 80;
-
-
-            /// <summary>
-            /// The amount which the effect has already risen on the screen.
-            /// </summary>
-            public float Rise = 0;
-
-
-            /// <summary>
-            /// If true, the effect has finished rising.
-            /// </summary>
-            private bool isRiseComplete = false;
-
-            /// <summary>
-            /// If true, the effect has finished rising.
-            /// </summary>
-            public bool IsRiseComplete
-            {
-                get { return isRiseComplete; }
-            }
-
-
-            #endregion
-
-
-            #region Updating
-
-
-            /// <summary>
-            /// Updates the combat effect.
-            /// </summary>
-            /// <param name="elapsedSeconds">
-            /// The number of seconds elapsed since the last update.
-            /// </param>
-            public virtual void Update(float elapsedSeconds)
-            {
-                if (!isRiseComplete)
-                {
-                    Rise += ((float)risePerSecond * elapsedSeconds);
-                    if (Rise > riseMaximum)
-                    {
-                        Rise = riseMaximum;
-                        isRiseComplete = true;
-                    }
-                    position = new Vector2(
-                        OriginalPosition.X, 
-                        OriginalPosition.Y - Rise);
-                }
-            }
-
-
-            #endregion
-
-
-            #region Drawing
-
-
-            /// <summary>
-            /// Draw the combat effect.
-            /// </summary>
-            /// <param name="spriteBatch">The SpriteBatch used to draw.</param>
-            /// <param name="texture">The texture for the effect.</param>
-            public virtual void Draw(SpriteBatch spriteBatch, Texture2D texture)
-            {
-                // check the parameter
-                if (spriteBatch == null)
-                {
-                    return;
-                }
-                // draw the texture
-                if (texture != null)
-                {
-                    spriteBatch.Draw(texture, position, null, Color.White, 0f,
-                        new Vector2(texture.Width / 2, texture.Height / 2), 1f, 
-                        SpriteEffects.None, 0.3f * (float)Rise / 200f);
-                }
-                // draw the text
-                if (!String.IsNullOrEmpty(Text))
-                {
-                    spriteBatch.DrawString(Fonts.DamageFont, text, position,
-                        Color.White, 0f, new Vector2(textOrigin.X, textOrigin.Y), 1f,
-                        SpriteEffects.None, 0.2f * (float)Rise / 200f);
-                }
-            }
-
-
-            #endregion
-        }
-
-
-        #region Damage Effects
-
-
-        /// <summary>
-        /// The sprite texture for all damage combat effects.
-        /// </summary>
-        private Texture2D damageCombatEffectTexture;
-
-
-        /// <summary>
-        /// All current damage combat effects.
-        /// </summary>
-        private List<CombatEffect> damageCombatEffects = new List<CombatEffect>();
-
-
-        /// <summary>
-        /// Adds a new damage combat effect to the scene.
-        /// </summary>
-        /// <param name="position">The position that the effect starts at.</param>
-        /// <param name="damage">The damage statistics.</param>
-        public static void AddNewDamageEffects(Vector2 position, 
-            StatisticsValue damage)
-        {
-            int startingRise = 0;
-
-            CheckSingleton();
-
-            if (damage.HealthPoints != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "HP\n" + damage.HealthPoints.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-
-            if (damage.MagicPoints != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MP\n" + damage.MagicPoints.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-
-            if (damage.PhysicalOffense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "PO\n" + damage.PhysicalOffense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-
-            if (damage.PhysicalDefense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "PD\n" + damage.PhysicalDefense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-
-            if (damage.MagicalOffense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MO\n" + damage.MagicalOffense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-
-            if (damage.MagicalDefense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MD\n" + damage.MagicalDefense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.damageCombatEffects.Add(combatEffect);
-            }
-        }
-
-
-        #endregion
-
-
-        #region Healing Combat Effects
-
-
-        /// <summary>
-        /// The sprite texture for all healing combat effects.
-        /// </summary>
-        private Texture2D healingCombatEffectTexture;
-
-
-        /// <summary>
-        /// All current healing combat effects.
-        /// </summary>
-        private List<CombatEffect> healingCombatEffects = new List<CombatEffect>();
-
-
-        /// <summary>
-        /// Adds a new healing combat effect to the scene.
-        /// </summary>
-        /// <param name="position">The position that the effect starts at.</param>
-        /// <param name="damage">The healing statistics.</param>
-        public static void AddNewHealingEffects(Vector2 position,
-            StatisticsValue healing)
-        {
-            int startingRise = 0;
-
-            CheckSingleton();
-
-            if (healing.HealthPoints != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "HP\n" + healing.HealthPoints.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-
-            if (healing.MagicPoints != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MP\n" + healing.MagicPoints.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-
-            if (healing.PhysicalOffense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "PO\n" + healing.PhysicalOffense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-
-            if (healing.PhysicalDefense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "PD\n" + healing.PhysicalDefense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-
-            if (healing.MagicalOffense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MO\n" + healing.MagicalOffense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-
-            if (healing.MagicalDefense != 0)
-            {
-                CombatEffect combatEffect = new CombatEffect();
-                combatEffect.OriginalPosition = position;
-                combatEffect.Text = "MD\n" + healing.MagicalDefense.ToString();
-                combatEffect.Rise = startingRise;
-                startingRise -= 5;
-                singleton.healingCombatEffects.Add(combatEffect);
-            }
-        }
-
-
-        #endregion
-
-
-        /// <summary>
-        /// Load the graphics data for the combat effect sprites.
-        /// </summary>
-        private void CreateCombatEffectSprites()
-        {
-            ContentManager content = Session.ScreenManager.Game.Content;
-
-            damageCombatEffectTexture =
-                content.Load<Texture2D>(@"Textures\Combat\DamageIcon");
-            healingCombatEffectTexture =
-                content.Load<Texture2D>(@"Textures\Combat\HealingIcon");
-        }
-
-
-        /// <summary>
-        /// Draw all combat effect sprites.
-        /// </summary>
-        private void DrawCombatEffects(GameTime gameTime)
-        {
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-            SpriteBatch spriteBatch = Session.ScreenManager.SpriteBatch;
-
-            // update all effects
-            foreach (CombatEffect combatEffect in damageCombatEffects)
-            {
-                combatEffect.Update(elapsedSeconds);
-            }
-            foreach (CombatEffect combatEffect in healingCombatEffects)
-            {
-                combatEffect.Update(elapsedSeconds);
-            }
-
-            // draw the damage effects
-            if (damageCombatEffectTexture != null)
-            {
-                foreach (CombatEffect combatEffect in damageCombatEffects)
-                {
-                    combatEffect.Draw(spriteBatch, damageCombatEffectTexture);
-                }
-            }
-
-            // draw the healing effects
-            if (healingCombatEffectTexture != null)
-            {
-                foreach (CombatEffect combatEffect in healingCombatEffects)
-                {
-                    combatEffect.Draw(spriteBatch, healingCombatEffectTexture);
-                }
-            }
-
-            // remove all complete effects
-            Predicate<CombatEffect> removeCompleteEffects =
-                delegate(CombatEffect combatEffect)
-                {
-                    return combatEffect.IsRiseComplete;
-                };
-            damageCombatEffects.RemoveAll(removeCompleteEffects);
-            healingCombatEffects.RemoveAll(removeCompleteEffects);
-        }
-
-
-        #endregion
-
-
-        #region Selection Sprites
-
-
-        /// <summary>
-        /// The animating sprite that draws over the highlighted character.
-        /// </summary>
-        private AnimatingSprite highlightForegroundSprite = new AnimatingSprite();
-
-        /// <summary>
-        /// The animating sprite that draws behind the highlighted character.
-        /// </summary>
-        private AnimatingSprite highlightBackgroundSprite = new AnimatingSprite();
-
-        /// <summary>
-        /// The animating sprite that draws behind the primary target character.
-        /// </summary>
-        private AnimatingSprite primaryTargetSprite = new AnimatingSprite();
-
-        /// <summary>
-        /// The animating sprite that draws behind any secondary target characters.
-        /// </summary>
-        private AnimatingSprite secondaryTargetSprite = new AnimatingSprite();
-
-
-        /// <summary>
-        /// Create the selection sprite objects.
-        /// </summary>
-        private void CreateSelectionSprites()
-        {
-            ContentManager content = Session.ScreenManager.Game.Content;
-
-            Point frameDimensions = new Point(76, 58);
-            highlightForegroundSprite.FramesPerRow = 6;
-            highlightForegroundSprite.FrameDimensions = frameDimensions;
-            highlightForegroundSprite.AddAnimation(
-                new Animation("Selection", 1, 4, 100, true));
-            highlightForegroundSprite.PlayAnimation(0);
-            highlightForegroundSprite.SourceOffset =
-                new Vector2(frameDimensions.X / 2f, 40f);
-            highlightForegroundSprite.Texture =
-                content.Load<Texture2D>(@"Textures\Combat\TilesheetSprangles");
-
-            frameDimensions = new Point(102, 54);
-            highlightBackgroundSprite.FramesPerRow = 4;
-            highlightBackgroundSprite.FrameDimensions = frameDimensions;
-            highlightBackgroundSprite.AddAnimation(
-                new Animation("Selection", 1, 4, 100, true));
-            highlightBackgroundSprite.PlayAnimation(0);
-            highlightBackgroundSprite.SourceOffset =
-                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
-            highlightBackgroundSprite.Texture =
-                content.Load<Texture2D>(@"Textures\Combat\CharSelectionRing");
-
-            primaryTargetSprite.FramesPerRow = 4;
-            primaryTargetSprite.FrameDimensions = frameDimensions;
-            primaryTargetSprite.AddAnimation(
-                new Animation("Selection", 1, 4, 100, true));
-            primaryTargetSprite.PlayAnimation(0);
-            primaryTargetSprite.SourceOffset =
-                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
-            primaryTargetSprite.Texture =
-                content.Load<Texture2D>(@"Textures\Combat\Target1SelectionRing");
-
-            secondaryTargetSprite.FramesPerRow = 4;
-            secondaryTargetSprite.FrameDimensions = frameDimensions;
-            secondaryTargetSprite.AddAnimation(
-                new Animation("Selection", 1, 4, 100, true));
-            secondaryTargetSprite.PlayAnimation(0);
-            secondaryTargetSprite.SourceOffset =
-                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
-            secondaryTargetSprite.Texture =
-                content.Load<Texture2D>(@"Textures\Combat\Target2SelectionRing");
-        }
-
-
-        /// <summary>
-        /// Draw the highlight sprites.
-        /// </summary>
-        private void DrawSelectionSprites(GameTime gameTime)
-        {
-            SpriteBatch spriteBatch = Session.ScreenManager.SpriteBatch;
-            Viewport viewport = Session.ScreenManager.GraphicsDevice.Viewport;
-            
-            // update the animations
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-            highlightForegroundSprite.UpdateAnimation(elapsedSeconds);
-            highlightBackgroundSprite.UpdateAnimation(elapsedSeconds);
-            primaryTargetSprite.UpdateAnimation(elapsedSeconds);
-            secondaryTargetSprite.UpdateAnimation(elapsedSeconds);
-            
-            // draw the highlighted-player sprite, if any
-            if (highlightedCombatant != null)
-            {
-                highlightBackgroundSprite.Draw(spriteBatch,
-                    highlightedCombatant.Position,
-                    1f - (highlightedCombatant.Position.Y - 1) / viewport.Height);
-                highlightForegroundSprite.Draw(spriteBatch,
-                    highlightedCombatant.Position,
-                    1f - (highlightedCombatant.Position.Y + 1) / viewport.Height);
-            }
-
-            // draw the primary target sprite and name, if any
-            if (primaryTargetedCombatant != null)
-            {
-                primaryTargetSprite.Draw(spriteBatch,
-                    primaryTargetedCombatant.Position,
-                    1f - (primaryTargetedCombatant.Position.Y - 1) / viewport.Height);
-                if (primaryTargetedCombatant.Character is Monster)
-                {
-                    Fonts.DrawCenteredText(spriteBatch, Fonts.DamageFont,
-#if DEBUG
-                    primaryTargetedCombatant.Character.Name + "\n" +
-                    primaryTargetedCombatant.Statistics.HealthPoints + "/" +
-                    primaryTargetedCombatant.Character.CharacterStatistics.HealthPoints,
-#else
-                        primaryTargetedCombatant.Character.Name,
-#endif
-                        primaryTargetedCombatant.Position + new Vector2(0f, 42f),
-                        Color.White);
-                }
-            }
-
-            // draw the secondary target sprites on live enemies, if any
-            foreach (Combatant combatant in secondaryTargetedCombatants)
-            {
-                if (combatant.IsDeadOrDying)
-                {
-                    continue;
-                }
-                secondaryTargetSprite.Draw(spriteBatch,
-                    combatant.Position,
-                    1f - (combatant.Position.Y - 1) / viewport.Height);
-                if (combatant.Character is Monster)
-                {
-                    Fonts.DrawCenteredText(spriteBatch, Fonts.DamageFont,
-#if DEBUG
-                        combatant.Character.Name + "\n" +
-                        combatant.Statistics.HealthPoints + "/" +
-                        combatant.Character.CharacterStatistics.HealthPoints,
-#else
-                        combatant.Character.Name,
-#endif
-                        combatant.Position + new Vector2(0f, 42f), Color.White);
-                }
-            }
-        }
-
-
-        #endregion
-
-
-        #region Delays
-
-
-        /// <summary>
-        /// Varieties of delays that are interspersed throughout the combat flow.
-        /// </summary>
-        private enum DelayType
-        {
-            /// <summary>
-            /// No delay at this time.
-            /// </summary>
-            NoDelay,
-
-            /// <summary>
-            /// Delay at the start of combat.
-            /// </summary>
-            StartCombat,
-
-            /// <summary>
-            /// Delay when one side turn's ends before the other side begins.
-            /// </summary>
-            EndRound,
-
-            /// <summary>
-            /// Delay at the end of a character's turn before the next one begins.
-            /// </summary>
-            EndCharacterTurn,
-
-            /// <summary>
-            /// Delay before a flee is attempted.
-            /// </summary>
-            FleeAttempt,
-
-            /// <summary>
-            /// Delay when the party has fled from combat before combat ends.
-            /// </summary>
-            FleeSuccessful,
-        }
-
-        /// <summary>
-        /// The current delay, if any (otherwise NoDelay).
-        /// </summary>
-        private DelayType delayType = DelayType.NoDelay;
-
-
-        /// <summary>
-        /// Returns true if the combat engine is delaying for any reason.
-        /// </summary>
-        public static bool IsDelaying
-        {
-            get 
-            { 
-                return (singleton == null ? false : 
-                    singleton.delayType != DelayType.NoDelay); 
-            }
-        }
-
-
-        /// <summary>
-        /// The duration for all kinds of delays, in milliseconds.
-        /// </summary>
-        private const int totalDelay = 1000;
-
-
-        /// <summary>
-        /// The duration of the delay so far.
-        /// </summary>
-        private int currentDelay = 0;
-
-
-        /// <summary>
-        /// Update any delays in the combat system.
-        /// </summary>
-        /// <remarks>
-        /// This function may cause combat to end, setting the singleton to null.
-        /// </remarks>
-        private void UpdateDelay(int elapsedMilliseconds)
-        {
-            if (delayType == DelayType.NoDelay)
-            {
-                return;
-            }
-
-            // increment the delay
-            currentDelay += elapsedMilliseconds;
-
-            // if the delay is ongoing, then we're done
-            if (currentDelay < totalDelay)
-            {
-                return;
-            }
-            currentDelay = 0;
-
-            // the delay has ended, so the operation implied by the DelayType happens
-            switch (delayType)
-            {
-                case DelayType.StartCombat:
-                    // determine who goes first and start combat
-                    int whoseTurn = Session.Random.Next(2);
-                    if (whoseTurn == 0)
-                    {
-                        BeginPlayersTurn();
-                    }
-                    else
-                    {
-                        BeginMonstersTurn();
-                    }
-                    delayType = DelayType.NoDelay;
-                    break;
-
-                case DelayType.EndCharacterTurn:
-                    if (IsPlayersTurn)
-                    {
-                        // check to see if the players' turn is complete
-                        if (IsPlayersTurnComplete)
-                        {
-                            delayType = DelayType.EndRound;
-                            break;
-                        }
-                        // find the next player
-                        int highlightedIndex = players.FindIndex(
-                            delegate(CombatantPlayer player)
-                            {
-                                return (player == 
-                                    highlightedCombatant as CombatantPlayer);
-                            });
-                        int nextIndex = (highlightedIndex + 1) % players.Count;
-                        while (players[nextIndex].IsDeadOrDying ||
-                            players[nextIndex].IsTurnTaken)
-                        {
-                            nextIndex = (nextIndex + 1) % players.Count;
-                        }
-                        BeginPlayerTurn(players[nextIndex]);
-                    }
-                    else
-                    {
-                        // check to see if the monsters' turn is complete
-                        if (IsMonstersTurnComplete)
-                        {
-                            delayType = DelayType.EndRound;
-                            break;
-                        }
-                        // find the next monster
-                        BeginMonsterTurn(null);
-                    }
-                    delayType = DelayType.NoDelay;
-                    break;
-
-                case DelayType.EndRound:
-                    // check for turn completion
-                    if (IsPlayersTurn && IsPlayersTurnComplete)
-                    {
-                        BeginMonstersTurn();
-                    }
-                    else if (!IsPlayersTurn && IsMonstersTurnComplete)
-                    {
-                        BeginPlayersTurn();
-                    }
-                    delayType = DelayType.NoDelay;
-                    break;
-
-                case DelayType.FleeAttempt:
-                    if (fleeThreshold <= 0)
-                    {
-                        delayType = DelayType.EndCharacterTurn;
-                        Session.Hud.ActionText = "This Fight Cannot Be Escaped...";
-                        if (highlightedCombatant != null)
-                        {
-                            highlightedCombatant.IsTurnTaken = true;
-                        }
-                    }
-                    else if (CalculateFleeAttempt())
-                    {
-                        delayType = DelayType.FleeSuccessful;
-                        Session.Hud.ActionText = "Your Party Has Fled!";
-                    }
-                    else
-                    {
-                        delayType = DelayType.EndCharacterTurn;
-                        Session.Hud.ActionText = "Your Party Failed to Escape!";
-                        if (highlightedCombatant != null)
-                        {
-                            highlightedCombatant.IsTurnTaken = true;
-                        }
-                    }
-                    break;
-
-                case DelayType.FleeSuccessful:
-                    EndCombat(CombatEndingState.Fled);
-                    delayType = DelayType.NoDelay;
-                    break;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Starting Combat
-
-
-        /// <summary>
-        /// Generates a list of CombatantPlayer objects from the party members.
-        /// </summary>
-        private static List<CombatantPlayer> GenerateCombatantsFromParty()
-        {
-            List<CombatantPlayer> generatedPlayers = new List<CombatantPlayer>();
-
-            foreach (Player player in Session.Party.Players)
-            {
-                if (generatedPlayers.Count <= PlayerPositions.Length)
-                {
-                    generatedPlayers.Add(new CombatantPlayer(player));
-                }
-            }
-
-            return generatedPlayers;
-        }
-
-        /// <summary>
-        /// Start a new combat from the given FixedCombat object.
-        /// </summary>
-        public static void StartNewCombat(MapEntry<FixedCombat> fixedCombatEntry)
-        {
-            // check the parameter
-            if (fixedCombatEntry == null)
-            {
-                throw new ArgumentNullException("fixedCombatEntry");
-            }
-            FixedCombat fixedCombat = fixedCombatEntry.Content;
-            if (fixedCombat == null)
-            {
-                throw new ArgumentException("fixedCombatEntry has no content.");
-            }
-
-            // generate the monster combatant list
-            List<CombatantMonster> generatedMonsters = new List<CombatantMonster>();
-            foreach (ContentEntry<Monster> entry in fixedCombat.Entries)
-            {
-                for (int i = 0; i < entry.Count; i++)
-                {
-                    generatedMonsters.Add(
-                        new CombatantMonster(entry.Content));
-                }
-            }
-
-            // randomize the list of monsters
-            List<CombatantMonster> randomizedMonsters = new List<CombatantMonster>();
-            while ((generatedMonsters.Count > 0) && 
-                (randomizedMonsters.Count <= MonsterPositions.Length))
-            {
-                int index = Session.Random.Next(generatedMonsters.Count);
-                randomizedMonsters.Add(generatedMonsters[index]);
-                generatedMonsters.RemoveAt(index);
-            }
-
-            // start the combat
-            StartNewCombat(GenerateCombatantsFromParty(), randomizedMonsters, 0);
-            singleton.fixedCombatEntry = fixedCombatEntry;
-        }
-
-
-        /// <summary>
-        /// Start a new combat from the given RandomCombat object.
-        /// </summary>
-        public static void StartNewCombat(RandomCombat randomCombat)
-        {
-            // check the parameter
-            if (randomCombat == null)
-            {
-                throw new ArgumentNullException("randomCombat");
-            }
-
-            // determine how many monsters will be in the combat
-            int monsterCount = 
-                randomCombat.MonsterCountRange.GenerateValue(Session.Random);
-
-            // determine the total probability
-            int totalWeight = 0;
-            foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries)
-            {
-                totalWeight += entry.Weight;
-            }
-
-            // generate each monster
-            List<CombatantMonster> generatedMonsters = new List<CombatantMonster>();
-            for (int i = 0; i < monsterCount; i++)
-            {
-                int monsterChoice = Session.Random.Next(totalWeight);
-                foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries)
-                {
-                    if (monsterChoice < entry.Weight)
-                    {
-                        generatedMonsters.Add(
-                            new CombatantMonster(entry.Content));
-                        break;
-                    }
-                    else
-                    {
-                        monsterChoice -= entry.Weight;
-                    }
-                }
-            }
-
-            // randomize the list of monsters
-            List<CombatantMonster> randomizedMonsters = new List<CombatantMonster>();
-            while ((generatedMonsters.Count > 0) && 
-                (randomizedMonsters.Count <= MonsterPositions.Length))
-            {
-                int index = Session.Random.Next(generatedMonsters.Count);
-                randomizedMonsters.Add(generatedMonsters[index]);
-                generatedMonsters.RemoveAt(index);
-            }
-
-            // start the combat
-            StartNewCombat(GenerateCombatantsFromParty(), randomizedMonsters, 
-                randomCombat.FleeProbability);
-        }
-
-
-        /// <summary>
-        /// Start a new combat between the party and a group of monsters.
-        /// </summary>
-        /// <param name="players">The player combatants.</param>
-        /// <param name="monsters">The monster combatants.</param>
-        /// <param name="fleeThreshold">The odds of success when fleeing.</param>
-        private static void StartNewCombat(List<CombatantPlayer> players,
-            List<CombatantMonster> monsters, int fleeThreshold)
-        {
-            // check if we are already in combat
-            if (singleton != null)
-            {
-                throw new InvalidOperationException(
-                    "There can only be one combat at a time.");
-            }
-
-            // create the new CombatEngine object
-            singleton = new CombatEngine(players, monsters, fleeThreshold);
-        }
-
-        
-
-        /// <summary>
-        /// Construct a new CombatEngine object.
-        /// </summary>
-        /// <param name="players">The player combatants.</param>
-        /// <param name="monsters">The monster combatants.</param>
-        /// <param name="fleeThreshold">The odds of success when fleeing.</param>
-        private CombatEngine(List<CombatantPlayer> players,
-            List<CombatantMonster> monsters, int fleeThreshold)
-        {
-            // check the parameters
-            if ((players == null) || (players.Count <= 0) || 
-                (players.Count > PlayerPositions.Length))
-            {
-                throw new ArgumentException("players");
-            }
-            if ((monsters == null) || (monsters.Count <= 0) || 
-                (monsters.Count > MonsterPositions.Length))
-            {
-                throw new ArgumentException("monsters");
-            }
-
-            // assign the parameters
-            this.players = players;
-            this.monsters = monsters;
-            this.fleeThreshold = fleeThreshold;
-
-            // assign positions
-            for (int i = 0; i < players.Count; i++)
-            {
-                if (i >= PlayerPositions.Length)
-                {
-                    break;
-                }
-                players[i].Position =
-                    players[i].OriginalPosition =
-                    PlayerPositions[i];
-            }
-            for (int i = 0; i < monsters.Count; i++)
-            {
-                if (i >= MonsterPositions.Length)
-                {
-                    break;
-                }
-                monsters[i].Position =
-                    monsters[i].OriginalPosition =
-                    MonsterPositions[i];
-            }
-
-            // sort the monsters by the y coordinates, descending
-            monsters.Sort(delegate(CombatantMonster monster1, CombatantMonster monster2)
-            {
-                return monster2.OriginalPosition.Y.CompareTo(
-                    monster1.OriginalPosition.Y);
-            });
-
-            // create the selection sprites
-            CreateSelectionSprites();
-
-            // create the combat effect sprites
-            CreateCombatEffectSprites();
-
-            // start the first combat turn after a delay
-            delayType = DelayType.StartCombat;
-
-            // start the combat music
-            AudioManager.PushMusic(TileEngine.Map.CombatMusicCueName);
-        }
-
-
-        #endregion
-
-
-        #region Fleeing Combat
-
-
-        public static void AttemptFlee()
-        {
-            CheckSingleton();
-
-            if (!IsPlayersTurn)
-            {
-                throw new InvalidOperationException("Only the players may flee.");
-            }
-
-
-            singleton.delayType = DelayType.FleeAttempt;
-            Session.Hud.ActionText = "Attempting to Escape...";
-        }
-
-
-        /// <summary>
-        /// The odds of being able to flee this combat, from 0 to 100.
-        /// </summary>
-        private int fleeThreshold = 0;
-
-
-        /// <summary>
-        /// Calculate an attempted escape from the combat.
-        /// </summary>
-        /// <returns>If true, the escape succeeds.</returns>
-        private bool CalculateFleeAttempt()
-        {
-            return (Session.Random.Next(100) < fleeThreshold);
-        }
-
-
-        #endregion
-
-
-        #region Ending Combat
-
-
-        /// <summary>
-        /// End the combat
-        /// </summary>
-        /// <param name="combatEndState"></param>
-        private void EndCombat(CombatEndingState combatEndingState)
-        {
-            // go back to the non-combat music
-            AudioManager.PopMusic();
-
-            switch (combatEndingState)
-            {
-                case CombatEndingState.Victory:
-                    int experienceReward = 0;
-                    int goldReward = 0;
-                    List<Gear> gearRewards = new List<Gear>();
-                    List<string> gearRewardNames = new List<string>();
-                    // calculate the rewards from the monsters
-                    foreach (CombatantMonster combatantMonster in monsters)
-                    {
-                        Monster monster = combatantMonster.Monster;
-                        Session.Party.AddMonsterKill(monster);
-                        experienceReward +=
-                            monster.CalculateExperienceReward(Session.Random);
-                        goldReward += monster.CalculateGoldReward(Session.Random);
-                        gearRewardNames.AddRange(
-                            monster.CalculateGearDrop(Session.Random));
-                    }
-                    foreach (string gearRewardName in gearRewardNames)
-                    {
-                        gearRewards.Add(Session.ScreenManager.Game.Content.Load<Gear>(
-                            Path.Combine(@"Gear", gearRewardName)));
-                    }
-                    // add the reward screen
-                    Session.ScreenManager.AddScreen(new RewardsScreen(
-                        RewardsScreen.RewardScreenMode.Combat, experienceReward,
-                        goldReward, gearRewards));
-                    // remove the fixed combat entry, if this wasn't a random fight
-                    if (FixedCombatEntry != null)
-                    {
-                        Session.RemoveFixedCombat(FixedCombatEntry);
-                    }
-                    break;
-
-                case CombatEndingState.Loss: // game over
-                    ScreenManager screenManager = Session.ScreenManager;
-                    // end the session
-                    Session.EndSession();
-                    // add the game-over screen
-                    screenManager.AddScreen(new GameOverScreen());
-                    break;
-
-                case CombatEndingState.Fled:
-                    break;
-            }
-
-            // clear the singleton
-            singleton = null;
-        }
-
-
-        /// <summary>
-        /// Ensure that there is no combat happening right now.
-        /// </summary>
-        public static void ClearCombat()
-        {
-            // clear the singleton
-            if (singleton != null)
-            {
-                singleton = null;
-            }
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Update the combat engine for this frame.
-        /// </summary>
-        public static void Update(GameTime gameTime)
-        {
-            // if there is no active combat, then there's nothing to update
-            // -- this will be called every frame, so there should be no exception for 
-            //    calling this method outside of combat
-            if (singleton == null)
-            {
-                return;
-            }
-
-            // update the singleton
-            singleton.UpdateCombatEngine(gameTime);
-        }
-
-
-        /// <summary>
-        /// Update the combat engine for this frame.
-        /// </summary>
-        private void UpdateCombatEngine(GameTime gameTime)
-        {
-            // check for the end of combat
-            if (ArePlayersDefeated)
-            {
-                EndCombat(CombatEndingState.Loss);
-                return;
-            }
-            else if (AreMonstersDefeated)
-            {
-                EndCombat(CombatEndingState.Victory);
-                return;
-            }
-
-            // update the target selections
-            if ((highlightedCombatant != null) &&
-                (highlightedCombatant.CombatAction != null))
-            {
-                SetTargets(highlightedCombatant.CombatAction.Target,
-                    highlightedCombatant.CombatAction.AdjacentTargets);
-            }
-
-            // update the delay
-            UpdateDelay(gameTime.ElapsedGameTime.Milliseconds);
-            // UpdateDelay might cause combat to end due to a successful escape,
-            // which will set the singleton to null.
-            if (singleton == null)
-            {
-                return;
-            }
-
-            // update the players
-            foreach (CombatantPlayer player in players)
-            {
-                player.Update(gameTime);
-            }
-
-            // update the monsters
-            foreach (CombatantMonster monster in monsters)
-            {
-                monster.Update(gameTime);
-            }
-
-            // check for completion of the highlighted combatant
-            if ((delayType == DelayType.NoDelay) &&
-                (highlightedCombatant != null) && highlightedCombatant.IsTurnTaken)
-            {
-                delayType = DelayType.EndCharacterTurn;
-            }
-
-            // handle any player input
-            HandleInput();
-        }
-
-
-        /// <summary>
-        /// Handle player input that affects the combat engine.
-        /// </summary>
-        private void HandleInput()
-        {
-            // only accept input during the players' turn
-            // -- exit game, etc. is handled by GameplayScreen
-            if (!IsPlayersTurn || IsPlayersTurnComplete || 
-                (highlightedCombatant == null))
-            {
-                return;
-            }
-
-#if DEBUG
-            // cheat key
-            if (InputManager.IsGamePadRightShoulderTriggered() ||
-                InputManager.IsKeyTriggered(Keys.W))
-            {
-                EndCombat(CombatEndingState.Victory);
-                return;
-            }
-#endif
-            // handle input while choosing an action
-            if (highlightedCombatant.CombatAction != null)
-            {
-                // skip if its turn is over or the action is already going
-                if (highlightedCombatant.IsTurnTaken || 
-                    (highlightedCombatant.CombatAction.Stage != 
-                     CombatAction.CombatActionStage.NotStarted))
-                {
-                    return;
-                }
-
-                // back out of the action
-                if (InputManager.IsActionTriggered(InputManager.Action.Back))
-                {
-                    highlightedCombatant.CombatAction = null;
-                    SetTargets(null, 0);
-                    return;
-                }
-
-                // start the action
-                if (InputManager.IsActionTriggered(InputManager.Action.Ok))
-                {
-                    highlightedCombatant.CombatAction.Start();
-                    return;
-                }
-
-                // go to the next target
-                if (InputManager.IsActionTriggered(InputManager.Action.TargetUp))
-                {
-                    // cycle through monsters or party members
-                    if (highlightedCombatant.CombatAction.IsOffensive)
-                    {
-                        // find the index of the current target
-                        int newIndex = monsters.FindIndex(
-                            delegate(CombatantMonster monster)
-                            {
-                                return (primaryTargetedCombatant == monster);
-                            });
-                        // find the next living target
-                        do
-                        {
-                            newIndex = (newIndex + 1) % monsters.Count;
-                        }
-                        while (monsters[newIndex].IsDeadOrDying);
-                        // set the new target
-                        highlightedCombatant.CombatAction.Target = monsters[newIndex];
-                    }
-                    else
-                    {
-                        // find the index of the current target
-                        int newIndex = players.FindIndex(
-                            delegate(CombatantPlayer player)
-                            {
-                                return (primaryTargetedCombatant == player);
-                            });
-                        // find the next active, living target
-                        do
-                        {
-                            newIndex = (newIndex + 1) % players.Count;
-                        }
-                        while (players[newIndex].IsDeadOrDying);
-                        // set the new target
-                        highlightedCombatant.CombatAction.Target = players[newIndex];
-                    }
-                    return;
-                }
-                // go to the previous target
-                else if (InputManager.IsActionTriggered(InputManager.Action.TargetDown))
-                {
-                    // cycle through monsters or party members
-                    if (highlightedCombatant.CombatAction.IsOffensive)
-                    {
-                        // find the index of the current target
-                        int newIndex = monsters.FindIndex(
-                            delegate(CombatantMonster monster)
-                            {
-                                return (primaryTargetedCombatant == monster);
-                            });
-                        // find the previous active, living target
-                        do
-                        {
-                            newIndex--;
-                            while (newIndex < 0)
-                            {
-                                newIndex += monsters.Count;
-                            }
-                        }
-                        while (monsters[newIndex].IsDeadOrDying);
-                        // set the new target
-                        highlightedCombatant.CombatAction.Target = monsters[newIndex];
-                    }
-                    else
-                    {
-                        // find the index of the current target
-                        int newIndex = players.FindIndex(
-                            delegate(CombatantPlayer player)
-                            {
-                                return (primaryTargetedCombatant == player);
-                            });
-                        // find the previous living target
-                        do
-                        {
-                            newIndex--;
-                            while (newIndex < 0)
-                            {
-                                newIndex += players.Count;
-                            }
-                        }
-                        while (players[newIndex].IsDeadOrDying);
-                        // set the new target
-                        highlightedCombatant.CombatAction.Target = players[newIndex];
-                    }
-                    return;
-                }
-            }
-            else // choosing which character will act
-            {
-                // move to the previous living character
-                if (InputManager.IsActionTriggered(
-                    InputManager.Action.ActiveCharacterLeft))
-                {
-                    int newHighlightedPlayer = highlightedPlayer;
-                    do
-                    {
-                        newHighlightedPlayer--;
-                        while (newHighlightedPlayer < 0)
-                        {
-                            newHighlightedPlayer += players.Count;
-                        }
-                    }
-                    while (players[newHighlightedPlayer].IsDeadOrDying ||
-                            players[newHighlightedPlayer].IsTurnTaken);
-                    if (newHighlightedPlayer != highlightedPlayer)
-                    {
-                        highlightedPlayer = newHighlightedPlayer;
-                        BeginPlayerTurn(players[highlightedPlayer]);
-                    }
-                    return;
-                }
-                // move to the next living character
-                else if (InputManager.IsActionTriggered(
-                    InputManager.Action.ActiveCharacterRight))
-                {
-                    int newHighlightedPlayer = highlightedPlayer;
-                    do
-                    {
-                        newHighlightedPlayer = 
-                            (newHighlightedPlayer + 1) % players.Count;
-                    }
-                    while (players[newHighlightedPlayer].IsDeadOrDying ||
-                            players[newHighlightedPlayer].IsTurnTaken);
-                    if (newHighlightedPlayer != highlightedPlayer)
-                    {
-                        highlightedPlayer = newHighlightedPlayer;
-                        BeginPlayerTurn(players[highlightedPlayer]);
-                    }
-                    return;
-                }
-                Session.Hud.UpdateActionsMenu();
-            }
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw the combat for this frame.
-        /// </summary>
-        public static void Draw(GameTime gameTime)
-        {
-            // if there is no active combat, then there's nothing to draw
-            // -- this will be called every frame, so there should be no exception for 
-            //    calling this method outside of combat
-            if (singleton == null)
-            {
-                return;
-            }
-
-            // update the singleton
-            singleton.DrawCombatEngine(gameTime);
-        }
-
-
-        /// <summary>
-        /// Draw the combat for this frame.
-        /// </summary>
-        private void DrawCombatEngine(GameTime gameTime)
-        {
-            // draw the players
-            foreach (CombatantPlayer player in players)
-            {
-                player.Draw(gameTime);
-            }
-
-            // draw the monsters
-            foreach (CombatantMonster monster in monsters)
-            {
-                monster.Draw(gameTime);
-            }
-
-            // draw the selection animations
-            DrawSelectionSprites(gameTime);
-
-            // draw the combat effects
-            DrawCombatEffects(gameTime);
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// CombatEngine.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using RolePlayingGameData;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// The runtime execution engine for the combat system.
+    /// </summary>
+    class CombatEngine
+    {
+
+
+        /// <summary>
+        /// The singleton of the combat engine.
+        /// </summary>
+        private static CombatEngine singleton = null;
+
+
+        /// <summary>
+        /// Check to see if there is a combat going on, and throw an exception if not.
+        /// </summary>
+        private static void CheckSingleton()
+        {
+            if (singleton == null)
+            {
+                throw new InvalidOperationException(
+                    "There is no active combat at this time.");
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// If true, the combat engine is active and the user is in combat.
+        /// </summary>
+        public static bool IsActive
+        {
+          get { return (singleton != null); }
+        }
+
+
+        /// <summary>
+        /// If true, it is currently the players' turn.
+        /// </summary>
+        private bool isPlayersTurn;
+
+        /// <summary>
+        /// If true, it is currently the players' turn.
+        /// </summary>
+        public static bool IsPlayersTurn
+        {
+            get 
+            {
+                CheckSingleton();
+                return singleton.isPlayersTurn; 
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The fixed combat used to generate this fight, if any.
+        /// </summary>
+        /// <remarks>
+        /// Used for rewards.  Null means it was a random fight with no special rewards.
+        /// </remarks>
+        private MapEntry<FixedCombat> fixedCombatEntry;
+
+        /// <summary>
+        /// The fixed combat used to generate this fight, if any.
+        /// </summary>
+        /// <remarks>
+        /// Used for rewards.  Null means it was a random fight with no special rewards.
+        /// </remarks>
+        public static MapEntry<FixedCombat> FixedCombatEntry
+        {
+            get { return (singleton == null ? null : singleton.fixedCombatEntry); }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The players involved in the current combat.
+        /// </summary>
+        private List<CombatantPlayer> players = null;
+
+        /// <summary>
+        /// The players involved in the current combat.
+        /// </summary>
+        public static List<CombatantPlayer> Players
+        {
+            get 
+            {
+                CheckSingleton();
+                return singleton.players; 
+            }
+        }
+
+
+        private int highlightedPlayer;
+
+
+        /// <summary>
+        /// The positions of the players on screen.
+        /// </summary>
+        private static readonly Vector2[] PlayerPositions = new Vector2[5]
+        {
+            new Vector2(850f, 345f),
+            new Vector2(980f, 260f),
+            new Vector2(940f, 440f),
+            new Vector2(1100f, 200f),
+            new Vector2(1100f, 490f)
+        };
+
+
+        /// <summary>
+        /// Start the given player's combat turn.
+        /// </summary>
+        private void BeginPlayerTurn(CombatantPlayer player)
+        {
+            // check the parameter
+            if (player == null)
+            {
+                throw new ArgumentNullException("player");
+            }
+
+            // set the highlight sprite
+            highlightedCombatant = player;
+            primaryTargetedCombatant = null;
+            secondaryTargetedCombatants.Clear();
+
+            Session.Hud.ActionText = "Choose an Action";
+        }
+
+
+        /// <summary>
+        /// Begin the players' turn in this combat round.
+        /// </summary>
+        private void BeginPlayersTurn()
+        {
+            // set the player-turn
+            isPlayersTurn = true;
+ 
+            // reset each player for the next combat turn
+            foreach (CombatantPlayer player in players)
+            {
+                // reset the animation of living players
+                if (!player.IsDeadOrDying)
+                {
+                    player.State = Character.CharacterState.Idle;
+                }
+                // reset the turn-taken flag
+                player.IsTurnTaken = false;
+                // clear the combat action
+                player.CombatAction = null;
+                // advance each player
+                player.AdvanceRound();
+            }
+
+            // set the action text on the HUD
+            Session.Hud.ActionText = "Your Party's Turn";
+
+            // find the first player who is alive
+            highlightedPlayer = 0;
+            CombatantPlayer firstPlayer = players[highlightedPlayer];
+            while (firstPlayer.IsTurnTaken || firstPlayer.IsDeadOrDying)
+            {
+                highlightedPlayer = (highlightedPlayer + 1) % players.Count;
+                firstPlayer = players[highlightedPlayer];
+            }
+
+            // start the first player's turn
+            BeginPlayerTurn(firstPlayer);
+        }
+
+
+        /// <summary>
+        /// Check for whether all players have taken their turn.
+        /// </summary>
+        private bool IsPlayersTurnComplete
+        {
+            get
+            {
+                return players.TrueForAll(delegate(CombatantPlayer player)
+                {
+                    return (player.IsTurnTaken || player.IsDeadOrDying);
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// Check for whether the players have been wiped out and defeated.
+        /// </summary>
+        private bool ArePlayersDefeated
+        {
+            get 
+            {
+                return players.TrueForAll(delegate(CombatantPlayer player)
+                {
+                    return (player.State == Character.CharacterState.Dead);
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// Retrieves the first living player, if any.
+        /// </summary>
+        private CombatantPlayer FirstPlayerTarget
+        {
+            get
+            {
+                // if there are no living players, then this is moot
+                if (ArePlayersDefeated)
+                {
+                    return null;
+                }
+
+                int playerIndex = 0;
+                while ((playerIndex < players.Count) &&
+                    players[playerIndex].IsDeadOrDying)
+                {
+                    playerIndex++;
+                }
+                return players[playerIndex];
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The monsters involved in the current combat.
+        /// </summary>
+        private List<CombatantMonster> monsters = null;
+
+        /// <summary>
+        /// The monsters involved in the current combat.
+        /// </summary>
+        public static List<CombatantMonster> Monsters
+        {
+            get 
+            {
+                CheckSingleton();
+                return singleton.monsters; 
+            }
+        }
+
+
+        /// <summary>
+        /// The positions of the monsters on the screen.
+        /// </summary>
+        private static readonly Vector2[] MonsterPositions = new Vector2[5]
+        {
+            new Vector2(480f, 345f),
+            new Vector2(345f, 260f),
+            new Vector2(370f, 440f),
+            new Vector2(225f, 200f),
+            new Vector2(225f, 490f)
+        };
+
+
+        /// <summary>
+        /// Start the given player's combat turn.
+        /// </summary>
+        private void BeginMonsterTurn(CombatantMonster monster)
+        {
+            // if it's null, find a random living monster who has yet to take their turn
+            if (monster == null)
+            {
+                // don't bother if all monsters have finished
+                if (IsMonstersTurnComplete)
+                {
+                    return;
+                }
+                // pick random living monsters who haven't taken their turn
+                do
+                {
+                    monster = monsters[Session.Random.Next(monsters.Count)];
+                }
+                while (monster.IsTurnTaken || monster.IsDeadOrDying);
+            }
+
+            // set the highlight sprite
+            highlightedCombatant = monster;
+            primaryTargetedCombatant = null;
+            secondaryTargetedCombatants.Clear();
+
+            // choose the action immediate
+            monster.CombatAction = monster.ArtificialIntelligence.ChooseAction();
+        }
+        
+        
+        /// <summary>
+        /// Begin the monsters' turn in this combat round.
+        /// </summary>
+        private void BeginMonstersTurn()
+        {
+            // set the monster-turn
+            isPlayersTurn = false;
+
+            // reset each monster for the next combat turn
+            foreach (CombatantMonster monster in monsters)
+            {
+                // reset the animations back to idle
+                monster.Character.State = Character.CharacterState.Idle;
+                // reset the turn-taken flag
+                monster.IsTurnTaken = false;
+                // clear the combat action
+                monster.CombatAction = null;
+                // advance the combatants
+                monster.AdvanceRound();
+            }
+            
+            // set the action text on the HUD
+            Session.Hud.ActionText = "Enemy Party's Turn";
+
+            // start a Session.Random monster's turn
+            BeginMonsterTurn(null);
+        }
+
+
+        /// <summary>
+        /// Check for whether all monsters have taken their turn.
+        /// </summary>
+        private bool IsMonstersTurnComplete
+        {
+            get
+            {
+                return monsters.TrueForAll(delegate(CombatantMonster monster)
+                {
+                    return (monster.IsTurnTaken || monster.IsDeadOrDying);
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// Check for whether the monsters have been wiped out and defeated.
+        /// </summary>
+        private bool AreMonstersDefeated
+        {
+            get
+            {
+                return monsters.TrueForAll(delegate(CombatantMonster monster)
+                {
+                    return (monster.State == Character.CharacterState.Dead);
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// Retrieves the first living monster, if any.
+        /// </summary>
+        private CombatantMonster FirstMonsterTarget
+        {
+            get
+            {
+                // if there are no living monsters, then this is moot
+                if (AreMonstersDefeated)
+                {
+                    return null;
+                }
+
+                int monsterIndex = 0;
+                while ((monsterIndex < monsters.Count) && 
+                    monsters[monsterIndex].IsDeadOrDying)
+                {
+                    monsterIndex++;
+                }
+                return monsters[monsterIndex];
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The currently highlighted player, if any.
+        /// </summary>
+        private Combatant highlightedCombatant;
+
+        /// <summary>
+        /// The currently highlighted player, if any.
+        /// </summary>
+        public static Combatant HighlightedCombatant
+        {
+            get
+            {
+                CheckSingleton();
+                return singleton.highlightedCombatant;
+            }
+        }
+
+
+        /// <summary>
+        /// The current primary target, if any.
+        /// </summary>
+        private Combatant primaryTargetedCombatant;
+
+        /// <summary>
+        /// The current primary target, if any.
+        /// </summary>
+        public static Combatant PrimaryTargetedCombatant
+        {
+            get
+            {
+                CheckSingleton();
+                return singleton.primaryTargetedCombatant;
+            }
+        }
+
+
+        /// <summary>
+        /// The current secondary targets, if any.
+        /// </summary>
+        private List<Combatant> secondaryTargetedCombatants = new List<Combatant>();
+
+        /// <summary>
+        /// The current secondary targets, if any.
+        /// </summary>
+        public static List<Combatant> SecondaryTargetedCombatants
+        {
+            get
+            {
+                CheckSingleton();
+                return singleton.secondaryTargetedCombatants;
+            }
+        }
+
+
+        /// <summary>
+        /// Retrieves the first living enemy, if any.
+        /// </summary>
+        public static Combatant FirstEnemyTarget
+        {
+            get
+            {
+                CheckSingleton();
+
+                if (IsPlayersTurn)
+                {
+                    return singleton.FirstMonsterTarget;
+                }
+                else
+                {
+                    return singleton.FirstPlayerTarget;
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// Retrieves the first living ally, if any.
+        /// </summary>
+        public static Combatant FirstAllyTarget
+        {
+            get
+            {
+                CheckSingleton();
+
+                if (IsPlayersTurn)
+                {
+                    return singleton.FirstPlayerTarget;
+                }
+                else
+                {
+                    return singleton.FirstMonsterTarget;
+                }
+            }
+        }
+        
+
+        /// <summary>
+        /// Set the primary and any secondary targets.
+        /// </summary>
+        /// <param name="primaryTarget">The desired primary target.</param>
+        /// <param name="adjacentTargets">
+        /// The number of simultaneous, adjacent targets affected by this spell.
+        /// </param>
+        private void SetTargets(Combatant primaryTarget, int adjacentTargets)
+        {
+            // set the primary target
+            this.primaryTargetedCombatant = primaryTarget;
+
+            // set any secondary targets
+            this.secondaryTargetedCombatants.Clear();
+            if ((primaryTarget != null) && (adjacentTargets > 0))
+            {
+                // find out which side is targeted
+                bool isPlayerTarget = primaryTarget is CombatantPlayer;
+                // find the index
+                int primaryTargetIndex = 0;
+                if (isPlayerTarget)
+                {
+                    primaryTargetIndex = players.FindIndex(
+                        delegate(CombatantPlayer player)
+                        {
+                            return (player == primaryTarget);
+                        });
+                }
+                else
+                {
+                    primaryTargetIndex = monsters.FindIndex(
+                        delegate(CombatantMonster monster)
+                        {
+                            return (monster == primaryTarget);
+                        });
+                }
+                // add the surrounding indices
+                for (int i = 1; i <= adjacentTargets; i++)
+                {
+                    int leftIndex = primaryTargetIndex - i;
+                    if (leftIndex >= 0)
+                    {
+                        secondaryTargetedCombatants.Add(
+                            isPlayerTarget ? players[leftIndex] as Combatant : 
+                                monsters[leftIndex] as Combatant);
+                    }
+                    int rightIndex = primaryTargetIndex + i;
+                    if (rightIndex < (isPlayerTarget ? players.Count : monsters.Count))
+                    {
+                        secondaryTargetedCombatants.Add(
+                            isPlayerTarget ? players[rightIndex] as Combatant :
+                            monsters[rightIndex] as Combatant);
+                    }
+                }
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// A combat effect sprite, typically used for damage or healing numbers.
+        /// </summary>
+        private class CombatEffect
+        {
+
+
+            /// <summary>
+            /// The starting position of the effect on the screen.
+            /// </summary>
+            public Vector2 OriginalPosition;
+
+
+            /// <summary>
+            /// The current position of the effect on the screen.
+            /// </summary>
+            protected Vector2 position;
+
+            /// <summary>
+            /// The current position of the effect on the screen.
+            /// </summary>
+            public Vector2 Position
+            {
+                get { return position; }
+            }
+
+
+
+
+
+
+            /// <summary>
+            /// The text that appears on top of the effect.
+            /// </summary>
+            protected string text = String.Empty;
+
+            /// <summary>
+            /// The text that appears on top of the effect.
+            /// </summary>
+            public string Text
+            {
+                get { return text; }
+                set
+                {
+                    text = value;
+                    // recalculate the origin
+                    if (String.IsNullOrEmpty(text))
+                    {
+                        textOrigin = Vector2.Zero;
+                    }
+                    else
+                    {
+                        Vector2 textSize = Fonts.DamageFont.MeasureString(text);
+                        textOrigin = new Vector2(
+                            (float)Math.Ceiling(textSize.X / 2f), 
+                            (float)Math.Ceiling(textSize.Y / 2f));
+                    }
+                }
+            }
+
+            /// <summary>
+            /// The drawing origin of the text on the effect.
+            /// </summary>
+            private Vector2 textOrigin = Vector2.Zero;
+
+
+
+
+
+
+            /// <summary>
+            /// The speed at which the effect rises on the screen.
+            /// </summary>
+            const int risePerSecond = 100;
+
+            /// <summary>
+            /// The amount which the effect rises on the screen.
+            /// </summary>
+            const int riseMaximum = 80;
+
+
+            /// <summary>
+            /// The amount which the effect has already risen on the screen.
+            /// </summary>
+            public float Rise = 0;
+
+
+            /// <summary>
+            /// If true, the effect has finished rising.
+            /// </summary>
+            private bool isRiseComplete = false;
+
+            /// <summary>
+            /// If true, the effect has finished rising.
+            /// </summary>
+            public bool IsRiseComplete
+            {
+                get { return isRiseComplete; }
+            }
+
+
+
+
+
+
+            /// <summary>
+            /// Updates the combat effect.
+            /// </summary>
+            /// <param name="elapsedSeconds">
+            /// The number of seconds elapsed since the last update.
+            /// </param>
+            public virtual void Update(float elapsedSeconds)
+            {
+                if (!isRiseComplete)
+                {
+                    Rise += ((float)risePerSecond * elapsedSeconds);
+                    if (Rise > riseMaximum)
+                    {
+                        Rise = riseMaximum;
+                        isRiseComplete = true;
+                    }
+                    position = new Vector2(
+                        OriginalPosition.X, 
+                        OriginalPosition.Y - Rise);
+                }
+            }
+
+
+
+
+
+
+            /// <summary>
+            /// Draw the combat effect.
+            /// </summary>
+            /// <param name="spriteBatch">The SpriteBatch used to draw.</param>
+            /// <param name="texture">The texture for the effect.</param>
+            public virtual void Draw(SpriteBatch spriteBatch, Texture2D texture)
+            {
+                // check the parameter
+                if (spriteBatch == null)
+                {
+                    return;
+                }
+                // draw the texture
+                if (texture != null)
+                {
+                    spriteBatch.Draw(texture, position, null, Color.White, 0f,
+                        new Vector2(texture.Width / 2, texture.Height / 2), 1f, 
+                        SpriteEffects.None, 0.3f * (float)Rise / 200f);
+                }
+                // draw the text
+                if (!String.IsNullOrEmpty(Text))
+                {
+                    spriteBatch.DrawString(Fonts.DamageFont, text, position,
+                        Color.White, 0f, new Vector2(textOrigin.X, textOrigin.Y), 1f,
+                        SpriteEffects.None, 0.2f * (float)Rise / 200f);
+                }
+            }
+
+
+        }
+
+
+
+
+        /// <summary>
+        /// The sprite texture for all damage combat effects.
+        /// </summary>
+        private Texture2D damageCombatEffectTexture;
+
+
+        /// <summary>
+        /// All current damage combat effects.
+        /// </summary>
+        private List<CombatEffect> damageCombatEffects = new List<CombatEffect>();
+
+
+        /// <summary>
+        /// Adds a new damage combat effect to the scene.
+        /// </summary>
+        /// <param name="position">The position that the effect starts at.</param>
+        /// <param name="damage">The damage statistics.</param>
+        public static void AddNewDamageEffects(Vector2 position, 
+            StatisticsValue damage)
+        {
+            int startingRise = 0;
+
+            CheckSingleton();
+
+            if (damage.HealthPoints != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "HP\n" + damage.HealthPoints.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+
+            if (damage.MagicPoints != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MP\n" + damage.MagicPoints.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+
+            if (damage.PhysicalOffense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "PO\n" + damage.PhysicalOffense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+
+            if (damage.PhysicalDefense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "PD\n" + damage.PhysicalDefense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+
+            if (damage.MagicalOffense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MO\n" + damage.MagicalOffense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+
+            if (damage.MagicalDefense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MD\n" + damage.MagicalDefense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.damageCombatEffects.Add(combatEffect);
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The sprite texture for all healing combat effects.
+        /// </summary>
+        private Texture2D healingCombatEffectTexture;
+
+
+        /// <summary>
+        /// All current healing combat effects.
+        /// </summary>
+        private List<CombatEffect> healingCombatEffects = new List<CombatEffect>();
+
+
+        /// <summary>
+        /// Adds a new healing combat effect to the scene.
+        /// </summary>
+        /// <param name="position">The position that the effect starts at.</param>
+        /// <param name="damage">The healing statistics.</param>
+        public static void AddNewHealingEffects(Vector2 position,
+            StatisticsValue healing)
+        {
+            int startingRise = 0;
+
+            CheckSingleton();
+
+            if (healing.HealthPoints != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "HP\n" + healing.HealthPoints.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+
+            if (healing.MagicPoints != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MP\n" + healing.MagicPoints.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+
+            if (healing.PhysicalOffense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "PO\n" + healing.PhysicalOffense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+
+            if (healing.PhysicalDefense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "PD\n" + healing.PhysicalDefense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+
+            if (healing.MagicalOffense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MO\n" + healing.MagicalOffense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+
+            if (healing.MagicalDefense != 0)
+            {
+                CombatEffect combatEffect = new CombatEffect();
+                combatEffect.OriginalPosition = position;
+                combatEffect.Text = "MD\n" + healing.MagicalDefense.ToString();
+                combatEffect.Rise = startingRise;
+                startingRise -= 5;
+                singleton.healingCombatEffects.Add(combatEffect);
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// Load the graphics data for the combat effect sprites.
+        /// </summary>
+        private void CreateCombatEffectSprites()
+        {
+            ContentManager content = Session.ScreenManager.Game.Content;
+
+            damageCombatEffectTexture =
+                content.Load<Texture2D>(@"Textures\Combat\DamageIcon");
+            healingCombatEffectTexture =
+                content.Load<Texture2D>(@"Textures\Combat\HealingIcon");
+        }
+
+
+        /// <summary>
+        /// Draw all combat effect sprites.
+        /// </summary>
+        private void DrawCombatEffects(GameTime gameTime)
+        {
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+            SpriteBatch spriteBatch = Session.ScreenManager.SpriteBatch;
+
+            // update all effects
+            foreach (CombatEffect combatEffect in damageCombatEffects)
+            {
+                combatEffect.Update(elapsedSeconds);
+            }
+            foreach (CombatEffect combatEffect in healingCombatEffects)
+            {
+                combatEffect.Update(elapsedSeconds);
+            }
+
+            // draw the damage effects
+            if (damageCombatEffectTexture != null)
+            {
+                foreach (CombatEffect combatEffect in damageCombatEffects)
+                {
+                    combatEffect.Draw(spriteBatch, damageCombatEffectTexture);
+                }
+            }
+
+            // draw the healing effects
+            if (healingCombatEffectTexture != null)
+            {
+                foreach (CombatEffect combatEffect in healingCombatEffects)
+                {
+                    combatEffect.Draw(spriteBatch, healingCombatEffectTexture);
+                }
+            }
+
+            // remove all complete effects
+            Predicate<CombatEffect> removeCompleteEffects =
+                delegate(CombatEffect combatEffect)
+                {
+                    return combatEffect.IsRiseComplete;
+                };
+            damageCombatEffects.RemoveAll(removeCompleteEffects);
+            healingCombatEffects.RemoveAll(removeCompleteEffects);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The animating sprite that draws over the highlighted character.
+        /// </summary>
+        private AnimatingSprite highlightForegroundSprite = new AnimatingSprite();
+
+        /// <summary>
+        /// The animating sprite that draws behind the highlighted character.
+        /// </summary>
+        private AnimatingSprite highlightBackgroundSprite = new AnimatingSprite();
+
+        /// <summary>
+        /// The animating sprite that draws behind the primary target character.
+        /// </summary>
+        private AnimatingSprite primaryTargetSprite = new AnimatingSprite();
+
+        /// <summary>
+        /// The animating sprite that draws behind any secondary target characters.
+        /// </summary>
+        private AnimatingSprite secondaryTargetSprite = new AnimatingSprite();
+
+
+        /// <summary>
+        /// Create the selection sprite objects.
+        /// </summary>
+        private void CreateSelectionSprites()
+        {
+            ContentManager content = Session.ScreenManager.Game.Content;
+
+            Point frameDimensions = new Point(76, 58);
+            highlightForegroundSprite.FramesPerRow = 6;
+            highlightForegroundSprite.FrameDimensions = frameDimensions;
+            highlightForegroundSprite.AddAnimation(
+                new Animation("Selection", 1, 4, 100, true));
+            highlightForegroundSprite.PlayAnimation(0);
+            highlightForegroundSprite.SourceOffset =
+                new Vector2(frameDimensions.X / 2f, 40f);
+            highlightForegroundSprite.Texture =
+                content.Load<Texture2D>(@"Textures\Combat\TilesheetSprangles");
+
+            frameDimensions = new Point(102, 54);
+            highlightBackgroundSprite.FramesPerRow = 4;
+            highlightBackgroundSprite.FrameDimensions = frameDimensions;
+            highlightBackgroundSprite.AddAnimation(
+                new Animation("Selection", 1, 4, 100, true));
+            highlightBackgroundSprite.PlayAnimation(0);
+            highlightBackgroundSprite.SourceOffset =
+                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
+            highlightBackgroundSprite.Texture =
+                content.Load<Texture2D>(@"Textures\Combat\CharSelectionRing");
+
+            primaryTargetSprite.FramesPerRow = 4;
+            primaryTargetSprite.FrameDimensions = frameDimensions;
+            primaryTargetSprite.AddAnimation(
+                new Animation("Selection", 1, 4, 100, true));
+            primaryTargetSprite.PlayAnimation(0);
+            primaryTargetSprite.SourceOffset =
+                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
+            primaryTargetSprite.Texture =
+                content.Load<Texture2D>(@"Textures\Combat\Target1SelectionRing");
+
+            secondaryTargetSprite.FramesPerRow = 4;
+            secondaryTargetSprite.FrameDimensions = frameDimensions;
+            secondaryTargetSprite.AddAnimation(
+                new Animation("Selection", 1, 4, 100, true));
+            secondaryTargetSprite.PlayAnimation(0);
+            secondaryTargetSprite.SourceOffset =
+                new Vector2(frameDimensions.X / 2f, frameDimensions.Y / 2f);
+            secondaryTargetSprite.Texture =
+                content.Load<Texture2D>(@"Textures\Combat\Target2SelectionRing");
+        }
+
+
+        /// <summary>
+        /// Draw the highlight sprites.
+        /// </summary>
+        private void DrawSelectionSprites(GameTime gameTime)
+        {
+            SpriteBatch spriteBatch = Session.ScreenManager.SpriteBatch;
+            Viewport viewport = Session.ScreenManager.GraphicsDevice.Viewport;
+            
+            // update the animations
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+            highlightForegroundSprite.UpdateAnimation(elapsedSeconds);
+            highlightBackgroundSprite.UpdateAnimation(elapsedSeconds);
+            primaryTargetSprite.UpdateAnimation(elapsedSeconds);
+            secondaryTargetSprite.UpdateAnimation(elapsedSeconds);
+            
+            // draw the highlighted-player sprite, if any
+            if (highlightedCombatant != null)
+            {
+                highlightBackgroundSprite.Draw(spriteBatch,
+                    highlightedCombatant.Position,
+                    1f - (highlightedCombatant.Position.Y - 1) / viewport.Height);
+                highlightForegroundSprite.Draw(spriteBatch,
+                    highlightedCombatant.Position,
+                    1f - (highlightedCombatant.Position.Y + 1) / viewport.Height);
+            }
+
+            // draw the primary target sprite and name, if any
+            if (primaryTargetedCombatant != null)
+            {
+                primaryTargetSprite.Draw(spriteBatch,
+                    primaryTargetedCombatant.Position,
+                    1f - (primaryTargetedCombatant.Position.Y - 1) / viewport.Height);
+                if (primaryTargetedCombatant.Character is Monster)
+                {
+                    Fonts.DrawCenteredText(spriteBatch, Fonts.DamageFont,
+#if DEBUG
+                    primaryTargetedCombatant.Character.Name + "\n" +
+                    primaryTargetedCombatant.Statistics.HealthPoints + "/" +
+                    primaryTargetedCombatant.Character.CharacterStatistics.HealthPoints,
+#else
+                        primaryTargetedCombatant.Character.Name,
+#endif
+                        primaryTargetedCombatant.Position + new Vector2(0f, 42f),
+                        Color.White);
+                }
+            }
+
+            // draw the secondary target sprites on live enemies, if any
+            foreach (Combatant combatant in secondaryTargetedCombatants)
+            {
+                if (combatant.IsDeadOrDying)
+                {
+                    continue;
+                }
+                secondaryTargetSprite.Draw(spriteBatch,
+                    combatant.Position,
+                    1f - (combatant.Position.Y - 1) / viewport.Height);
+                if (combatant.Character is Monster)
+                {
+                    Fonts.DrawCenteredText(spriteBatch, Fonts.DamageFont,
+#if DEBUG
+                        combatant.Character.Name + "\n" +
+                        combatant.Statistics.HealthPoints + "/" +
+                        combatant.Character.CharacterStatistics.HealthPoints,
+#else
+                        combatant.Character.Name,
+#endif
+                        combatant.Position + new Vector2(0f, 42f), Color.White);
+                }
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Varieties of delays that are interspersed throughout the combat flow.
+        /// </summary>
+        private enum DelayType
+        {
+            /// <summary>
+            /// No delay at this time.
+            /// </summary>
+            NoDelay,
+
+            /// <summary>
+            /// Delay at the start of combat.
+            /// </summary>
+            StartCombat,
+
+            /// <summary>
+            /// Delay when one side turn's ends before the other side begins.
+            /// </summary>
+            EndRound,
+
+            /// <summary>
+            /// Delay at the end of a character's turn before the next one begins.
+            /// </summary>
+            EndCharacterTurn,
+
+            /// <summary>
+            /// Delay before a flee is attempted.
+            /// </summary>
+            FleeAttempt,
+
+            /// <summary>
+            /// Delay when the party has fled from combat before combat ends.
+            /// </summary>
+            FleeSuccessful,
+        }
+
+        /// <summary>
+        /// The current delay, if any (otherwise NoDelay).
+        /// </summary>
+        private DelayType delayType = DelayType.NoDelay;
+
+
+        /// <summary>
+        /// Returns true if the combat engine is delaying for any reason.
+        /// </summary>
+        public static bool IsDelaying
+        {
+            get 
+            { 
+                return (singleton == null ? false : 
+                    singleton.delayType != DelayType.NoDelay); 
+            }
+        }
+
+
+        /// <summary>
+        /// The duration for all kinds of delays, in milliseconds.
+        /// </summary>
+        private const int totalDelay = 1000;
+
+
+        /// <summary>
+        /// The duration of the delay so far.
+        /// </summary>
+        private int currentDelay = 0;
+
+
+        /// <summary>
+        /// Update any delays in the combat system.
+        /// </summary>
+        /// <remarks>
+        /// This function may cause combat to end, setting the singleton to null.
+        /// </remarks>
+        private void UpdateDelay(int elapsedMilliseconds)
+        {
+            if (delayType == DelayType.NoDelay)
+            {
+                return;
+            }
+
+            // increment the delay
+            currentDelay += elapsedMilliseconds;
+
+            // if the delay is ongoing, then we're done
+            if (currentDelay < totalDelay)
+            {
+                return;
+            }
+            currentDelay = 0;
+
+            // the delay has ended, so the operation implied by the DelayType happens
+            switch (delayType)
+            {
+                case DelayType.StartCombat:
+                    // determine who goes first and start combat
+                    int whoseTurn = Session.Random.Next(2);
+                    if (whoseTurn == 0)
+                    {
+                        BeginPlayersTurn();
+                    }
+                    else
+                    {
+                        BeginMonstersTurn();
+                    }
+                    delayType = DelayType.NoDelay;
+                    break;
+
+                case DelayType.EndCharacterTurn:
+                    if (IsPlayersTurn)
+                    {
+                        // check to see if the players' turn is complete
+                        if (IsPlayersTurnComplete)
+                        {
+                            delayType = DelayType.EndRound;
+                            break;
+                        }
+                        // find the next player
+                        int highlightedIndex = players.FindIndex(
+                            delegate(CombatantPlayer player)
+                            {
+                                return (player == 
+                                    highlightedCombatant as CombatantPlayer);
+                            });
+                        int nextIndex = (highlightedIndex + 1) % players.Count;
+                        while (players[nextIndex].IsDeadOrDying ||
+                            players[nextIndex].IsTurnTaken)
+                        {
+                            nextIndex = (nextIndex + 1) % players.Count;
+                        }
+                        BeginPlayerTurn(players[nextIndex]);
+                    }
+                    else
+                    {
+                        // check to see if the monsters' turn is complete
+                        if (IsMonstersTurnComplete)
+                        {
+                            delayType = DelayType.EndRound;
+                            break;
+                        }
+                        // find the next monster
+                        BeginMonsterTurn(null);
+                    }
+                    delayType = DelayType.NoDelay;
+                    break;
+
+                case DelayType.EndRound:
+                    // check for turn completion
+                    if (IsPlayersTurn && IsPlayersTurnComplete)
+                    {
+                        BeginMonstersTurn();
+                    }
+                    else if (!IsPlayersTurn && IsMonstersTurnComplete)
+                    {
+                        BeginPlayersTurn();
+                    }
+                    delayType = DelayType.NoDelay;
+                    break;
+
+                case DelayType.FleeAttempt:
+                    if (fleeThreshold <= 0)
+                    {
+                        delayType = DelayType.EndCharacterTurn;
+                        Session.Hud.ActionText = "This Fight Cannot Be Escaped...";
+                        if (highlightedCombatant != null)
+                        {
+                            highlightedCombatant.IsTurnTaken = true;
+                        }
+                    }
+                    else if (CalculateFleeAttempt())
+                    {
+                        delayType = DelayType.FleeSuccessful;
+                        Session.Hud.ActionText = "Your Party Has Fled!";
+                    }
+                    else
+                    {
+                        delayType = DelayType.EndCharacterTurn;
+                        Session.Hud.ActionText = "Your Party Failed to Escape!";
+                        if (highlightedCombatant != null)
+                        {
+                            highlightedCombatant.IsTurnTaken = true;
+                        }
+                    }
+                    break;
+
+                case DelayType.FleeSuccessful:
+                    EndCombat(CombatEndingState.Fled);
+                    delayType = DelayType.NoDelay;
+                    break;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Generates a list of CombatantPlayer objects from the party members.
+        /// </summary>
+        private static List<CombatantPlayer> GenerateCombatantsFromParty()
+        {
+            List<CombatantPlayer> generatedPlayers = new List<CombatantPlayer>();
+
+            foreach (Player player in Session.Party.Players)
+            {
+                if (generatedPlayers.Count <= PlayerPositions.Length)
+                {
+                    generatedPlayers.Add(new CombatantPlayer(player));
+                }
+            }
+
+            return generatedPlayers;
+        }
+
+        /// <summary>
+        /// Start a new combat from the given FixedCombat object.
+        /// </summary>
+        public static void StartNewCombat(MapEntry<FixedCombat> fixedCombatEntry)
+        {
+            // check the parameter
+            if (fixedCombatEntry == null)
+            {
+                throw new ArgumentNullException("fixedCombatEntry");
+            }
+            FixedCombat fixedCombat = fixedCombatEntry.Content;
+            if (fixedCombat == null)
+            {
+                throw new ArgumentException("fixedCombatEntry has no content.");
+            }
+
+            // generate the monster combatant list
+            List<CombatantMonster> generatedMonsters = new List<CombatantMonster>();
+            foreach (ContentEntry<Monster> entry in fixedCombat.Entries)
+            {
+                for (int i = 0; i < entry.Count; i++)
+                {
+                    generatedMonsters.Add(
+                        new CombatantMonster(entry.Content));
+                }
+            }
+
+            // randomize the list of monsters
+            List<CombatantMonster> randomizedMonsters = new List<CombatantMonster>();
+            while ((generatedMonsters.Count > 0) && 
+                (randomizedMonsters.Count <= MonsterPositions.Length))
+            {
+                int index = Session.Random.Next(generatedMonsters.Count);
+                randomizedMonsters.Add(generatedMonsters[index]);
+                generatedMonsters.RemoveAt(index);
+            }
+
+            // start the combat
+            StartNewCombat(GenerateCombatantsFromParty(), randomizedMonsters, 0);
+            singleton.fixedCombatEntry = fixedCombatEntry;
+        }
+
+
+        /// <summary>
+        /// Start a new combat from the given RandomCombat object.
+        /// </summary>
+        public static void StartNewCombat(RandomCombat randomCombat)
+        {
+            // check the parameter
+            if (randomCombat == null)
+            {
+                throw new ArgumentNullException("randomCombat");
+            }
+
+            // determine how many monsters will be in the combat
+            int monsterCount = 
+                randomCombat.MonsterCountRange.GenerateValue(Session.Random);
+
+            // determine the total probability
+            int totalWeight = 0;
+            foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries)
+            {
+                totalWeight += entry.Weight;
+            }
+
+            // generate each monster
+            List<CombatantMonster> generatedMonsters = new List<CombatantMonster>();
+            for (int i = 0; i < monsterCount; i++)
+            {
+                int monsterChoice = Session.Random.Next(totalWeight);
+                foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries)
+                {
+                    if (monsterChoice < entry.Weight)
+                    {
+                        generatedMonsters.Add(
+                            new CombatantMonster(entry.Content));
+                        break;
+                    }
+                    else
+                    {
+                        monsterChoice -= entry.Weight;
+                    }
+                }
+            }
+
+            // randomize the list of monsters
+            List<CombatantMonster> randomizedMonsters = new List<CombatantMonster>();
+            while ((generatedMonsters.Count > 0) && 
+                (randomizedMonsters.Count <= MonsterPositions.Length))
+            {
+                int index = Session.Random.Next(generatedMonsters.Count);
+                randomizedMonsters.Add(generatedMonsters[index]);
+                generatedMonsters.RemoveAt(index);
+            }
+
+            // start the combat
+            StartNewCombat(GenerateCombatantsFromParty(), randomizedMonsters, 
+                randomCombat.FleeProbability);
+        }
+
+
+        /// <summary>
+        /// Start a new combat between the party and a group of monsters.
+        /// </summary>
+        /// <param name="players">The player combatants.</param>
+        /// <param name="monsters">The monster combatants.</param>
+        /// <param name="fleeThreshold">The odds of success when fleeing.</param>
+        private static void StartNewCombat(List<CombatantPlayer> players,
+            List<CombatantMonster> monsters, int fleeThreshold)
+        {
+            // check if we are already in combat
+            if (singleton != null)
+            {
+                throw new InvalidOperationException(
+                    "There can only be one combat at a time.");
+            }
+
+            // create the new CombatEngine object
+            singleton = new CombatEngine(players, monsters, fleeThreshold);
+        }
+
+        
+
+        /// <summary>
+        /// Construct a new CombatEngine object.
+        /// </summary>
+        /// <param name="players">The player combatants.</param>
+        /// <param name="monsters">The monster combatants.</param>
+        /// <param name="fleeThreshold">The odds of success when fleeing.</param>
+        private CombatEngine(List<CombatantPlayer> players,
+            List<CombatantMonster> monsters, int fleeThreshold)
+        {
+            // check the parameters
+            if ((players == null) || (players.Count <= 0) || 
+                (players.Count > PlayerPositions.Length))
+            {
+                throw new ArgumentException("players");
+            }
+            if ((monsters == null) || (monsters.Count <= 0) || 
+                (monsters.Count > MonsterPositions.Length))
+            {
+                throw new ArgumentException("monsters");
+            }
+
+            // assign the parameters
+            this.players = players;
+            this.monsters = monsters;
+            this.fleeThreshold = fleeThreshold;
+
+            // assign positions
+            for (int i = 0; i < players.Count; i++)
+            {
+                if (i >= PlayerPositions.Length)
+                {
+                    break;
+                }
+                players[i].Position =
+                    players[i].OriginalPosition =
+                    PlayerPositions[i];
+            }
+            for (int i = 0; i < monsters.Count; i++)
+            {
+                if (i >= MonsterPositions.Length)
+                {
+                    break;
+                }
+                monsters[i].Position =
+                    monsters[i].OriginalPosition =
+                    MonsterPositions[i];
+            }
+
+            // sort the monsters by the y coordinates, descending
+            monsters.Sort(delegate(CombatantMonster monster1, CombatantMonster monster2)
+            {
+                return monster2.OriginalPosition.Y.CompareTo(
+                    monster1.OriginalPosition.Y);
+            });
+
+            // create the selection sprites
+            CreateSelectionSprites();
+
+            // create the combat effect sprites
+            CreateCombatEffectSprites();
+
+            // start the first combat turn after a delay
+            delayType = DelayType.StartCombat;
+
+            // start the combat music
+            AudioManager.PushMusic(TileEngine.Map.CombatMusicCueName);
+        }
+
+
+
+
+
+
+        public static void AttemptFlee()
+        {
+            CheckSingleton();
+
+            if (!IsPlayersTurn)
+            {
+                throw new InvalidOperationException("Only the players may flee.");
+            }
+
+
+            singleton.delayType = DelayType.FleeAttempt;
+            Session.Hud.ActionText = "Attempting to Escape...";
+        }
+
+
+        /// <summary>
+        /// The odds of being able to flee this combat, from 0 to 100.
+        /// </summary>
+        private int fleeThreshold = 0;
+
+
+        /// <summary>
+        /// Calculate an attempted escape from the combat.
+        /// </summary>
+        /// <returns>If true, the escape succeeds.</returns>
+        private bool CalculateFleeAttempt()
+        {
+            return (Session.Random.Next(100) < fleeThreshold);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// End the combat
+        /// </summary>
+        /// <param name="combatEndState"></param>
+        private void EndCombat(CombatEndingState combatEndingState)
+        {
+            // go back to the non-combat music
+            AudioManager.PopMusic();
+
+            switch (combatEndingState)
+            {
+                case CombatEndingState.Victory:
+                    int experienceReward = 0;
+                    int goldReward = 0;
+                    List<Gear> gearRewards = new List<Gear>();
+                    List<string> gearRewardNames = new List<string>();
+                    // calculate the rewards from the monsters
+                    foreach (CombatantMonster combatantMonster in monsters)
+                    {
+                        Monster monster = combatantMonster.Monster;
+                        Session.Party.AddMonsterKill(monster);
+                        experienceReward +=
+                            monster.CalculateExperienceReward(Session.Random);
+                        goldReward += monster.CalculateGoldReward(Session.Random);
+                        gearRewardNames.AddRange(
+                            monster.CalculateGearDrop(Session.Random));
+                    }
+                    foreach (string gearRewardName in gearRewardNames)
+                    {
+                        gearRewards.Add(Session.ScreenManager.Game.Content.Load<Gear>(
+                            Path.Combine(@"Gear", gearRewardName)));
+                    }
+                    // add the reward screen
+                    Session.ScreenManager.AddScreen(new RewardsScreen(
+                        RewardsScreen.RewardScreenMode.Combat, experienceReward,
+                        goldReward, gearRewards));
+                    // remove the fixed combat entry, if this wasn't a random fight
+                    if (FixedCombatEntry != null)
+                    {
+                        Session.RemoveFixedCombat(FixedCombatEntry);
+                    }
+                    break;
+
+                case CombatEndingState.Loss: // game over
+                    ScreenManager screenManager = Session.ScreenManager;
+                    // end the session
+                    Session.EndSession();
+                    // add the game-over screen
+                    screenManager.AddScreen(new GameOverScreen());
+                    break;
+
+                case CombatEndingState.Fled:
+                    break;
+            }
+
+            // clear the singleton
+            singleton = null;
+        }
+
+
+        /// <summary>
+        /// Ensure that there is no combat happening right now.
+        /// </summary>
+        public static void ClearCombat()
+        {
+            // clear the singleton
+            if (singleton != null)
+            {
+                singleton = null;
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Update the combat engine for this frame.
+        /// </summary>
+        public static void Update(GameTime gameTime)
+        {
+            // if there is no active combat, then there's nothing to update
+            // -- this will be called every frame, so there should be no exception for 
+            //    calling this method outside of combat
+            if (singleton == null)
+            {
+                return;
+            }
+
+            // update the singleton
+            singleton.UpdateCombatEngine(gameTime);
+        }
+
+
+        /// <summary>
+        /// Update the combat engine for this frame.
+        /// </summary>
+        private void UpdateCombatEngine(GameTime gameTime)
+        {
+            // check for the end of combat
+            if (ArePlayersDefeated)
+            {
+                EndCombat(CombatEndingState.Loss);
+                return;
+            }
+            else if (AreMonstersDefeated)
+            {
+                EndCombat(CombatEndingState.Victory);
+                return;
+            }
+
+            // update the target selections
+            if ((highlightedCombatant != null) &&
+                (highlightedCombatant.CombatAction != null))
+            {
+                SetTargets(highlightedCombatant.CombatAction.Target,
+                    highlightedCombatant.CombatAction.AdjacentTargets);
+            }
+
+            // update the delay
+            UpdateDelay(gameTime.ElapsedGameTime.Milliseconds);
+            // UpdateDelay might cause combat to end due to a successful escape,
+            // which will set the singleton to null.
+            if (singleton == null)
+            {
+                return;
+            }
+
+            // update the players
+            foreach (CombatantPlayer player in players)
+            {
+                player.Update(gameTime);
+            }
+
+            // update the monsters
+            foreach (CombatantMonster monster in monsters)
+            {
+                monster.Update(gameTime);
+            }
+
+            // check for completion of the highlighted combatant
+            if ((delayType == DelayType.NoDelay) &&
+                (highlightedCombatant != null) && highlightedCombatant.IsTurnTaken)
+            {
+                delayType = DelayType.EndCharacterTurn;
+            }
+
+            // handle any player input
+            HandleInput();
+        }
+
+
+        /// <summary>
+        /// Handle player input that affects the combat engine.
+        /// </summary>
+        private void HandleInput()
+        {
+            // only accept input during the players' turn
+            // -- exit game, etc. is handled by GameplayScreen
+            if (!IsPlayersTurn || IsPlayersTurnComplete || 
+                (highlightedCombatant == null))
+            {
+                return;
+            }
+
+#if DEBUG
+            // cheat key
+            if (InputManager.IsGamePadRightShoulderTriggered() ||
+                InputManager.IsKeyTriggered(Keys.W))
+            {
+                EndCombat(CombatEndingState.Victory);
+                return;
+            }
+#endif
+            // handle input while choosing an action
+            if (highlightedCombatant.CombatAction != null)
+            {
+                // skip if its turn is over or the action is already going
+                if (highlightedCombatant.IsTurnTaken || 
+                    (highlightedCombatant.CombatAction.Stage != 
+                     CombatAction.CombatActionStage.NotStarted))
+                {
+                    return;
+                }
+
+                // back out of the action
+                if (InputManager.IsActionTriggered(InputManager.Action.Back))
+                {
+                    highlightedCombatant.CombatAction = null;
+                    SetTargets(null, 0);
+                    return;
+                }
+
+                // start the action
+                if (InputManager.IsActionTriggered(InputManager.Action.Ok))
+                {
+                    highlightedCombatant.CombatAction.Start();
+                    return;
+                }
+
+                // go to the next target
+                if (InputManager.IsActionTriggered(InputManager.Action.TargetUp))
+                {
+                    // cycle through monsters or party members
+                    if (highlightedCombatant.CombatAction.IsOffensive)
+                    {
+                        // find the index of the current target
+                        int newIndex = monsters.FindIndex(
+                            delegate(CombatantMonster monster)
+                            {
+                                return (primaryTargetedCombatant == monster);
+                            });
+                        // find the next living target
+                        do
+                        {
+                            newIndex = (newIndex + 1) % monsters.Count;
+                        }
+                        while (monsters[newIndex].IsDeadOrDying);
+                        // set the new target
+                        highlightedCombatant.CombatAction.Target = monsters[newIndex];
+                    }
+                    else
+                    {
+                        // find the index of the current target
+                        int newIndex = players.FindIndex(
+                            delegate(CombatantPlayer player)
+                            {
+                                return (primaryTargetedCombatant == player);
+                            });
+                        // find the next active, living target
+                        do
+                        {
+                            newIndex = (newIndex + 1) % players.Count;
+                        }
+                        while (players[newIndex].IsDeadOrDying);
+                        // set the new target
+                        highlightedCombatant.CombatAction.Target = players[newIndex];
+                    }
+                    return;
+                }
+                // go to the previous target
+                else if (InputManager.IsActionTriggered(InputManager.Action.TargetDown))
+                {
+                    // cycle through monsters or party members
+                    if (highlightedCombatant.CombatAction.IsOffensive)
+                    {
+                        // find the index of the current target
+                        int newIndex = monsters.FindIndex(
+                            delegate(CombatantMonster monster)
+                            {
+                                return (primaryTargetedCombatant == monster);
+                            });
+                        // find the previous active, living target
+                        do
+                        {
+                            newIndex--;
+                            while (newIndex < 0)
+                            {
+                                newIndex += monsters.Count;
+                            }
+                        }
+                        while (monsters[newIndex].IsDeadOrDying);
+                        // set the new target
+                        highlightedCombatant.CombatAction.Target = monsters[newIndex];
+                    }
+                    else
+                    {
+                        // find the index of the current target
+                        int newIndex = players.FindIndex(
+                            delegate(CombatantPlayer player)
+                            {
+                                return (primaryTargetedCombatant == player);
+                            });
+                        // find the previous living target
+                        do
+                        {
+                            newIndex--;
+                            while (newIndex < 0)
+                            {
+                                newIndex += players.Count;
+                            }
+                        }
+                        while (players[newIndex].IsDeadOrDying);
+                        // set the new target
+                        highlightedCombatant.CombatAction.Target = players[newIndex];
+                    }
+                    return;
+                }
+            }
+            else // choosing which character will act
+            {
+                // move to the previous living character
+                if (InputManager.IsActionTriggered(
+                    InputManager.Action.ActiveCharacterLeft))
+                {
+                    int newHighlightedPlayer = highlightedPlayer;
+                    do
+                    {
+                        newHighlightedPlayer--;
+                        while (newHighlightedPlayer < 0)
+                        {
+                            newHighlightedPlayer += players.Count;
+                        }
+                    }
+                    while (players[newHighlightedPlayer].IsDeadOrDying ||
+                            players[newHighlightedPlayer].IsTurnTaken);
+                    if (newHighlightedPlayer != highlightedPlayer)
+                    {
+                        highlightedPlayer = newHighlightedPlayer;
+                        BeginPlayerTurn(players[highlightedPlayer]);
+                    }
+                    return;
+                }
+                // move to the next living character
+                else if (InputManager.IsActionTriggered(
+                    InputManager.Action.ActiveCharacterRight))
+                {
+                    int newHighlightedPlayer = highlightedPlayer;
+                    do
+                    {
+                        newHighlightedPlayer = 
+                            (newHighlightedPlayer + 1) % players.Count;
+                    }
+                    while (players[newHighlightedPlayer].IsDeadOrDying ||
+                            players[newHighlightedPlayer].IsTurnTaken);
+                    if (newHighlightedPlayer != highlightedPlayer)
+                    {
+                        highlightedPlayer = newHighlightedPlayer;
+                        BeginPlayerTurn(players[highlightedPlayer]);
+                    }
+                    return;
+                }
+                Session.Hud.UpdateActionsMenu();
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw the combat for this frame.
+        /// </summary>
+        public static void Draw(GameTime gameTime)
+        {
+            // if there is no active combat, then there's nothing to draw
+            // -- this will be called every frame, so there should be no exception for 
+            //    calling this method outside of combat
+            if (singleton == null)
+            {
+                return;
+            }
+
+            // update the singleton
+            singleton.DrawCombatEngine(gameTime);
+        }
+
+
+        /// <summary>
+        /// Draw the combat for this frame.
+        /// </summary>
+        private void DrawCombatEngine(GameTime gameTime)
+        {
+            // draw the players
+            foreach (CombatantPlayer player in players)
+            {
+                player.Draw(gameTime);
+            }
+
+            // draw the monsters
+            foreach (CombatantMonster monster in monsters)
+            {
+                monster.Draw(gameTime);
+            }
+
+            // draw the selection animations
+            DrawSelectionSprites(gameTime);
+
+            // draw the combat effects
+            DrawCombatEffects(gameTime);
+        }
+
+
+    }
+}

+ 305 - 325
RolePlayingGame/Combat/Combatant.cs → RolePlayingGame/Core/Combat/Combatant.cs

@@ -1,325 +1,305 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// Combatant.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// Base class for all combatants.
-    /// </summary>
-    abstract class Combatant
-    {
-        /// <summary>
-        /// The character encapsulated by this combatant.
-        /// </summary>
-        public abstract FightingCharacter Character
-        {
-            get;
-        }
-
-
-        #region State Data
-
-
-        /// <summary>
-        /// The current state of this combatant.
-        /// </summary>
-        public abstract Character.CharacterState State
-        {
-            get;
-            set;
-        }
-
-
-        /// <summary>
-        /// Returns true if the character is dead or dying.
-        /// </summary>
-        public bool IsDeadOrDying
-        {
-            get
-            {
-                return ((State == RolePlayingGameData.Character.CharacterState.Dying) ||
-                    (State == RolePlayingGameData.Character.CharacterState.Dead));
-            }
-        }
-
-
-        /// <summary>
-        /// If true, the combatant has taken their turn this round.
-        /// </summary>
-        private bool isTurnTaken;
-
-        /// <summary>
-        /// If true, the combatant has taken their turn this round.
-        /// </summary>
-        public bool IsTurnTaken
-        {
-            get { return isTurnTaken; }
-            set { isTurnTaken = value; }
-        }
-
-
-        #endregion
-
-
-        #region Graphics Data
-
-
-        /// <summary>
-        /// Accessor for the combat sprite for this combatant.
-        /// </summary>
-        public abstract AnimatingSprite CombatSprite
-        {
-            get;
-        }
-
-
-        /// <summary>
-        /// The current position on screen for this combatant.
-        /// </summary>
-        private Vector2 position;
-
-        /// <summary>
-        /// The current position on screen for this combatant.
-        /// </summary>
-        public Vector2 Position
-        {
-            get { return position; }
-            set { position = value; }
-        }
-
-
-        /// <summary>
-        /// The original position on screen for this combatant.
-        /// </summary>
-        private Vector2 originalPosition;
-
-        /// <summary>
-        /// The original position on screen for this combatant.
-        /// </summary>
-        public Vector2 OriginalPosition
-        {
-            get { return originalPosition; }
-            set { originalPosition = value; }
-        }
-
-
-        #endregion
-
-
-        #region Current Statistics
-
-
-        /// <summary>
-        /// The current statistics of this combatant.
-        /// </summary>
-        public abstract StatisticsValue Statistics
-        {
-            get;
-        }
-        
-
-        /// <summary>
-        /// Heals the combatant's health by the given amount.
-        /// </summary>
-        public void HealHealth(int healthHealingAmount, int duration)
-        {
-            Heal(new StatisticsValue(healthHealingAmount, 0, 0, 0, 0, 0), duration);
-        }
-
-
-        /// <summary>
-        /// Heal the combatant by the given amount.
-        /// </summary>
-        public virtual void Heal(StatisticsValue healingStatistics, int duration)
-        {
-            CombatEngine.AddNewHealingEffects(OriginalPosition, healingStatistics);
-        }
-
-
-        /// <summary>
-        /// Damages the combatant's health by the given amount.
-        /// </summary>
-        public void DamageHealth(int healthDamageAmount, int duration)
-        {
-            Damage(new StatisticsValue(healthDamageAmount, 0, 0, 0, 0, 0), duration);
-        }
-
-
-        /// <summary>
-        /// Damages the combatant by the given amount.
-        /// </summary>
-        public virtual void Damage(StatisticsValue damageStatistics, int duration)
-        {
-            State = RolePlayingGameData.Character.CharacterState.Hit;
-            CombatEngine.AddNewDamageEffects(OriginalPosition, damageStatistics);
-        }
-
-
-        /// <summary>
-        /// Pay the cost for the given spell.
-        /// </summary>
-        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
-        public virtual bool PayCostForSpell(Spell spell) { return false; }
-
-
-        #endregion
-
-
-        #region Combat Action
-
-
-        /// <summary>
-        /// The current combat action for this combatant.
-        /// </summary>
-        private CombatAction combatAction;
-
-        /// <summary>
-        /// The current combat action for this combatant.
-        /// </summary>
-        public CombatAction CombatAction
-        {
-            get { return combatAction; }
-            set { combatAction = value; }
-        }
-
-
-        #endregion
-
-
-        #region Combat Effects
-
-
-        /// <summary>
-        /// Statistics stack of the combat effects that are applied to this combatant.
-        /// </summary>
-        private StatisticsValueStack combatEffects = new StatisticsValueStack();
-
-        /// <summary>
-        /// Statistics stack of the combat effects that are applied to this combatant.
-        /// </summary>
-        public StatisticsValueStack CombatEffects
-        {
-            get { return combatEffects; }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Constructs a new Combatant object.
-        /// </summary>
-        protected Combatant() { }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Update the combatant for this frame.
-        /// </summary>
-        public virtual void Update(GameTime gameTime)
-        {
-            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
-
-            // update the combat action
-            if (combatAction != null)
-            {
-                // update the combat action
-                combatAction.Update(gameTime);
-                // remove the combat action if it is done and set the turn-taken flag
-                if (combatAction.Stage == CombatAction.CombatActionStage.Complete)
-                {
-                    combatAction = null;
-                    isTurnTaken = true;
-                }
-            }
-
-
-            // update the combat sprite animation
-            CombatSprite.UpdateAnimation(elapsedSeconds);
-
-            // check for death
-            if (!IsDeadOrDying && (Statistics.HealthPoints <= 0))
-            {
-                AudioManager.PlayCue("Death");
-                State = RolePlayingGameData.Character.CharacterState.Dying;
-            }
-            // check for waking up
-            else if (IsDeadOrDying && (Statistics.HealthPoints > 0))
-            {
-                State = RolePlayingGameData.Character.CharacterState.Idle;
-            }
-            else if (CombatSprite.IsPlaybackComplete)
-            {
-                if (State == RolePlayingGameData.Character.CharacterState.Hit)
-                {
-                    State = RolePlayingGameData.Character.CharacterState.Idle;
-                }
-                else if (State == RolePlayingGameData.Character.CharacterState.Dying)
-                {
-                    State = RolePlayingGameData.Character.CharacterState.Dead;
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Advance the combatant state for one combat round.
-        /// </summary>
-        public virtual void AdvanceRound()
-        {
-            // advance the combat effects stack
-            combatEffects.Advance();
-        }
-
-
-        #endregion
-
-
-        #region Drawing
-
-
-        /// <summary>
-        /// Draw the combatant for this frame.
-        /// </summary>
-        public virtual void Draw(GameTime gameTime)
-        {
-            CombatSprite.Draw(Session.ScreenManager.SpriteBatch,
-                Position, 1f - Position.Y / 720f);
-
-            Session.ScreenManager.SpriteBatch.Draw(Character.ShadowTexture, Position, 
-                null, Color.White, 0f, new Vector2(Character.ShadowTexture.Width / 2, 
-                Character.ShadowTexture.Height / 2), 1f, SpriteEffects.None, 1f);
-
-            // draw the combat action
-            if (combatAction != null)
-            {
-                // update the combat action
-                combatAction.Draw(gameTime, Session.ScreenManager.SpriteBatch);
-            }
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// Combatant.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// Base class for all combatants.
+    /// </summary>
+    abstract class Combatant
+    {
+        /// <summary>
+        /// The character encapsulated by this combatant.
+        /// </summary>
+        public abstract FightingCharacter Character
+        {
+            get;
+        }
+
+
+
+
+        /// <summary>
+        /// The current state of this combatant.
+        /// </summary>
+        public abstract Character.CharacterState State
+        {
+            get;
+            set;
+        }
+
+
+        /// <summary>
+        /// Returns true if the character is dead or dying.
+        /// </summary>
+        public bool IsDeadOrDying
+        {
+            get
+            {
+                return ((State == RolePlayingGameData.Character.CharacterState.Dying) ||
+                    (State == RolePlayingGameData.Character.CharacterState.Dead));
+            }
+        }
+
+
+        /// <summary>
+        /// If true, the combatant has taken their turn this round.
+        /// </summary>
+        private bool isTurnTaken;
+
+        /// <summary>
+        /// If true, the combatant has taken their turn this round.
+        /// </summary>
+        public bool IsTurnTaken
+        {
+            get { return isTurnTaken; }
+            set { isTurnTaken = value; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Accessor for the combat sprite for this combatant.
+        /// </summary>
+        public abstract AnimatingSprite CombatSprite
+        {
+            get;
+        }
+
+
+        /// <summary>
+        /// The current position on screen for this combatant.
+        /// </summary>
+        private Vector2 position;
+
+        /// <summary>
+        /// The current position on screen for this combatant.
+        /// </summary>
+        public Vector2 Position
+        {
+            get { return position; }
+            set { position = value; }
+        }
+
+
+        /// <summary>
+        /// The original position on screen for this combatant.
+        /// </summary>
+        private Vector2 originalPosition;
+
+        /// <summary>
+        /// The original position on screen for this combatant.
+        /// </summary>
+        public Vector2 OriginalPosition
+        {
+            get { return originalPosition; }
+            set { originalPosition = value; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The current statistics of this combatant.
+        /// </summary>
+        public abstract StatisticsValue Statistics
+        {
+            get;
+        }
+        
+
+        /// <summary>
+        /// Heals the combatant's health by the given amount.
+        /// </summary>
+        public void HealHealth(int healthHealingAmount, int duration)
+        {
+            Heal(new StatisticsValue(healthHealingAmount, 0, 0, 0, 0, 0), duration);
+        }
+
+
+        /// <summary>
+        /// Heal the combatant by the given amount.
+        /// </summary>
+        public virtual void Heal(StatisticsValue healingStatistics, int duration)
+        {
+            CombatEngine.AddNewHealingEffects(OriginalPosition, healingStatistics);
+        }
+
+
+        /// <summary>
+        /// Damages the combatant's health by the given amount.
+        /// </summary>
+        public void DamageHealth(int healthDamageAmount, int duration)
+        {
+            Damage(new StatisticsValue(healthDamageAmount, 0, 0, 0, 0, 0), duration);
+        }
+
+
+        /// <summary>
+        /// Damages the combatant by the given amount.
+        /// </summary>
+        public virtual void Damage(StatisticsValue damageStatistics, int duration)
+        {
+            State = RolePlayingGameData.Character.CharacterState.Hit;
+            CombatEngine.AddNewDamageEffects(OriginalPosition, damageStatistics);
+        }
+
+
+        /// <summary>
+        /// Pay the cost for the given spell.
+        /// </summary>
+        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
+        public virtual bool PayCostForSpell(Spell spell) { return false; }
+
+
+
+
+
+
+        /// <summary>
+        /// The current combat action for this combatant.
+        /// </summary>
+        private CombatAction combatAction;
+
+        /// <summary>
+        /// The current combat action for this combatant.
+        /// </summary>
+        public CombatAction CombatAction
+        {
+            get { return combatAction; }
+            set { combatAction = value; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Statistics stack of the combat effects that are applied to this combatant.
+        /// </summary>
+        private StatisticsValueStack combatEffects = new StatisticsValueStack();
+
+        /// <summary>
+        /// Statistics stack of the combat effects that are applied to this combatant.
+        /// </summary>
+        public StatisticsValueStack CombatEffects
+        {
+            get { return combatEffects; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Constructs a new Combatant object.
+        /// </summary>
+        protected Combatant() { }
+
+
+
+
+
+
+        /// <summary>
+        /// Update the combatant for this frame.
+        /// </summary>
+        public virtual void Update(GameTime gameTime)
+        {
+            float elapsedSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+
+            // update the combat action
+            if (combatAction != null)
+            {
+                // update the combat action
+                combatAction.Update(gameTime);
+                // remove the combat action if it is done and set the turn-taken flag
+                if (combatAction.Stage == CombatAction.CombatActionStage.Complete)
+                {
+                    combatAction = null;
+                    isTurnTaken = true;
+                }
+            }
+
+
+            // update the combat sprite animation
+            CombatSprite.UpdateAnimation(elapsedSeconds);
+
+            // check for death
+            if (!IsDeadOrDying && (Statistics.HealthPoints <= 0))
+            {
+                AudioManager.PlayCue("Death");
+                State = RolePlayingGameData.Character.CharacterState.Dying;
+            }
+            // check for waking up
+            else if (IsDeadOrDying && (Statistics.HealthPoints > 0))
+            {
+                State = RolePlayingGameData.Character.CharacterState.Idle;
+            }
+            else if (CombatSprite.IsPlaybackComplete)
+            {
+                if (State == RolePlayingGameData.Character.CharacterState.Hit)
+                {
+                    State = RolePlayingGameData.Character.CharacterState.Idle;
+                }
+                else if (State == RolePlayingGameData.Character.CharacterState.Dying)
+                {
+                    State = RolePlayingGameData.Character.CharacterState.Dead;
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// Advance the combatant state for one combat round.
+        /// </summary>
+        public virtual void AdvanceRound()
+        {
+            // advance the combat effects stack
+            combatEffects.Advance();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Draw the combatant for this frame.
+        /// </summary>
+        public virtual void Draw(GameTime gameTime)
+        {
+            CombatSprite.Draw(Session.ScreenManager.SpriteBatch,
+                Position, 1f - Position.Y / 720f);
+
+            Session.ScreenManager.SpriteBatch.Draw(Character.ShadowTexture, Position, 
+                null, Color.White, 0f, new Vector2(Character.ShadowTexture.Width / 2, 
+                Character.ShadowTexture.Height / 2), 1f, SpriteEffects.None, 1f);
+
+            // draw the combat action
+            if (combatAction != null)
+            {
+                // update the combat action
+                combatAction.Draw(gameTime, Session.ScreenManager.SpriteBatch);
+            }
+        }
+
+
+    }
+}

+ 249 - 265
RolePlayingGame/Combat/CombatantMonster.cs → RolePlayingGame/Core/Combat/CombatantMonster.cs

@@ -1,265 +1,249 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// CombatantMonster.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using RolePlayingGameData;
-using Microsoft.Xna.Framework;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// Encapsulates all of the combat-runtime data for a particular monster combatant.
-    /// </summary>
-    /// <remarks>
-    /// There may be many of a particular Monster in combat.  This class adds the 
-    /// statistics and AI data that are particular to this particular combatant.
-    /// </remarks>
-    class CombatantMonster : Combatant
-    {
-        /// <summary>
-        /// The monster content object that this combatant uses.
-        /// </summary>
-        private Monster monster;
-
-        /// <summary>
-        /// The monster content object that this combatant uses.
-        /// </summary>
-        public Monster Monster
-        {
-            get { return monster; }
-        }
-
-        /// <summary>
-        /// The character encapsulated by this combatant.
-        /// </summary>
-        public override FightingCharacter Character
-        {
-            get { return monster as FightingCharacter; }
-        }
-        
-        
-        #region State
-
-        /// <summary>
-        /// The current state of this combatant.
-        /// </summary>
-        private Character.CharacterState state;
-
-
-        /// <summary>
-        /// The current state of this combatant.
-        /// </summary>
-        public override Character.CharacterState State
-        {
-            get { return state; }
-            set
-            {
-                if (value == state)
-                {
-                    return;
-                }
-                state = value;
-                switch (state)
-                {
-                    case RolePlayingGameData.Character.CharacterState.Idle:
-                        CombatSprite.PlayAnimation("Idle");
-                        break;
-
-                    case RolePlayingGameData.Character.CharacterState.Hit:
-                        CombatSprite.PlayAnimation("Hit");
-                        break;
-
-                    case RolePlayingGameData.Character.CharacterState.Dying:
-                        statistics.HealthPoints = 0;
-                        CombatSprite.PlayAnimation("Die");
-                        break;
-                }
-            }
-        }
-
-
-        #endregion
-
-
-        #region Graphics Data
-
-
-        /// <summary>
-        /// The combat sprite for this combatant, copied from the monster.
-        /// </summary>
-        private AnimatingSprite combatSprite;
-
-        /// <summary>
-        /// Accessor for the combat sprite for this combatant.
-        /// </summary>
-        public override AnimatingSprite CombatSprite
-        {
-            get { return combatSprite; }
-        }
-
-
-        #endregion
-
-
-        #region Current Statistics
-
-
-        /// <summary>
-        /// The statistics for this particular combatant.
-        /// </summary>
-        private StatisticsValue statistics = new StatisticsValue();
-
-        /// <summary>
-        /// The current statistics of this combatant.
-        /// </summary>
-        public override StatisticsValue Statistics
-        {
-            get { return statistics + CombatEffects.TotalStatistics; }
-        }
-
-
-        /// <summary>
-        /// Heals the combatant by the given amount.
-        /// </summary>
-        public override void Heal(StatisticsValue healingStatistics, int duration)
-        {
-            if (duration > 0)
-            {
-                CombatEffects.AddStatistics(healingStatistics, duration);
-            }
-            else
-            {
-                statistics += healingStatistics;
-                statistics.ApplyMaximum(monster.CharacterStatistics);
-            }
-            base.Heal(healingStatistics, duration);
-        }
-
-
-        /// <summary>
-        /// Damages the combatant by the given amount.
-        /// </summary>
-        public override void Damage(StatisticsValue damageStatistics, int duration)
-        {
-            if (duration > 0)
-            {
-                CombatEffects.AddStatistics(new StatisticsValue() - damageStatistics, 
-                    duration);
-            }
-            else
-            {
-                statistics -= damageStatistics;
-                statistics.ApplyMaximum(monster.CharacterStatistics);
-            }
-            base.Damage(damageStatistics, duration);
-        }
-
-        
-        /// <summary>
-        /// Pay the cost for the given spell.
-        /// </summary>
-        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
-        public override bool PayCostForSpell(Spell spell)
-        {
-            // check the parameter.
-            if (spell == null)
-            {
-                throw new ArgumentNullException("spell");
-            }
-
-            // check the requirements
-            if (Statistics.MagicPoints < spell.MagicPointCost)
-            {
-                return false;
-            }
-
-            // reduce the player's magic points by the spell's cost
-            statistics.MagicPoints -= spell.MagicPointCost;
-
-            return true;
-        }
-
-
-        #endregion
-
-
-        #region Artificial Intelligence
-
-
-        /// <summary>
-        /// The artificial intelligence data for this particular combatant.
-        /// </summary>
-        private ArtificialIntelligence artificialIntelligence;
-
-        /// <summary>
-        /// The artificial intelligence data for this particular combatant.
-        /// </summary>
-        public ArtificialIntelligence ArtificialIntelligence
-        {
-            get { return artificialIntelligence; }
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Create a new CombatMonster object containing the given monster.
-        /// </summary>
-        /// <param name="monster"></param>
-        public CombatantMonster(Monster monster) : base()
-        {
-            // check the parameter
-            if (monster == null)
-            {
-                throw new ArgumentNullException("monster");
-            }
-
-            // assign the parameters
-            this.monster = monster;
-            this.statistics += monster.CharacterStatistics;
-            this.combatSprite = monster.CombatSprite.Clone() as AnimatingSprite;
-            this.State = RolePlayingGameData.Character.CharacterState.Idle;
-            this.CombatSprite.PlayAnimation("Idle");
-
-            // create the AI data
-            this.artificialIntelligence = new ArtificialIntelligence(this);
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Update the monster for this frame.
-        /// </summary>
-        public override void Update(GameTime gameTime)
-        {
-            // start any waiting action immediately
-            if ((CombatAction != null) &&
-                (CombatAction.Stage == CombatAction.CombatActionStage.NotStarted))
-            {
-                CombatAction.Start();
-            }
-
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// CombatantMonster.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using RolePlayingGameData;
+using Microsoft.Xna.Framework;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// Encapsulates all of the combat-runtime data for a particular monster combatant.
+    /// </summary>
+    /// <remarks>
+    /// There may be many of a particular Monster in combat.  This class adds the 
+    /// statistics and AI data that are particular to this particular combatant.
+    /// </remarks>
+    class CombatantMonster : Combatant
+    {
+        /// <summary>
+        /// The monster content object that this combatant uses.
+        /// </summary>
+        private Monster monster;
+
+        /// <summary>
+        /// The monster content object that this combatant uses.
+        /// </summary>
+        public Monster Monster
+        {
+            get { return monster; }
+        }
+
+        /// <summary>
+        /// The character encapsulated by this combatant.
+        /// </summary>
+        public override FightingCharacter Character
+        {
+            get { return monster as FightingCharacter; }
+        }
+        
+        
+
+        /// <summary>
+        /// The current state of this combatant.
+        /// </summary>
+        private Character.CharacterState state;
+
+
+        /// <summary>
+        /// The current state of this combatant.
+        /// </summary>
+        public override Character.CharacterState State
+        {
+            get { return state; }
+            set
+            {
+                if (value == state)
+                {
+                    return;
+                }
+                state = value;
+                switch (state)
+                {
+                    case RolePlayingGameData.Character.CharacterState.Idle:
+                        CombatSprite.PlayAnimation("Idle");
+                        break;
+
+                    case RolePlayingGameData.Character.CharacterState.Hit:
+                        CombatSprite.PlayAnimation("Hit");
+                        break;
+
+                    case RolePlayingGameData.Character.CharacterState.Dying:
+                        statistics.HealthPoints = 0;
+                        CombatSprite.PlayAnimation("Die");
+                        break;
+                }
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The combat sprite for this combatant, copied from the monster.
+        /// </summary>
+        private AnimatingSprite combatSprite;
+
+        /// <summary>
+        /// Accessor for the combat sprite for this combatant.
+        /// </summary>
+        public override AnimatingSprite CombatSprite
+        {
+            get { return combatSprite; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The statistics for this particular combatant.
+        /// </summary>
+        private StatisticsValue statistics = new StatisticsValue();
+
+        /// <summary>
+        /// The current statistics of this combatant.
+        /// </summary>
+        public override StatisticsValue Statistics
+        {
+            get { return statistics + CombatEffects.TotalStatistics; }
+        }
+
+
+        /// <summary>
+        /// Heals the combatant by the given amount.
+        /// </summary>
+        public override void Heal(StatisticsValue healingStatistics, int duration)
+        {
+            if (duration > 0)
+            {
+                CombatEffects.AddStatistics(healingStatistics, duration);
+            }
+            else
+            {
+                statistics += healingStatistics;
+                statistics.ApplyMaximum(monster.CharacterStatistics);
+            }
+            base.Heal(healingStatistics, duration);
+        }
+
+
+        /// <summary>
+        /// Damages the combatant by the given amount.
+        /// </summary>
+        public override void Damage(StatisticsValue damageStatistics, int duration)
+        {
+            if (duration > 0)
+            {
+                CombatEffects.AddStatistics(new StatisticsValue() - damageStatistics, 
+                    duration);
+            }
+            else
+            {
+                statistics -= damageStatistics;
+                statistics.ApplyMaximum(monster.CharacterStatistics);
+            }
+            base.Damage(damageStatistics, duration);
+        }
+
+        
+        /// <summary>
+        /// Pay the cost for the given spell.
+        /// </summary>
+        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
+        public override bool PayCostForSpell(Spell spell)
+        {
+            // check the parameter.
+            if (spell == null)
+            {
+                throw new ArgumentNullException("spell");
+            }
+
+            // check the requirements
+            if (Statistics.MagicPoints < spell.MagicPointCost)
+            {
+                return false;
+            }
+
+            // reduce the player's magic points by the spell's cost
+            statistics.MagicPoints -= spell.MagicPointCost;
+
+            return true;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The artificial intelligence data for this particular combatant.
+        /// </summary>
+        private ArtificialIntelligence artificialIntelligence;
+
+        /// <summary>
+        /// The artificial intelligence data for this particular combatant.
+        /// </summary>
+        public ArtificialIntelligence ArtificialIntelligence
+        {
+            get { return artificialIntelligence; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Create a new CombatMonster object containing the given monster.
+        /// </summary>
+        /// <param name="monster"></param>
+        public CombatantMonster(Monster monster) : base()
+        {
+            // check the parameter
+            if (monster == null)
+            {
+                throw new ArgumentNullException("monster");
+            }
+
+            // assign the parameters
+            this.monster = monster;
+            this.statistics += monster.CharacterStatistics;
+            this.combatSprite = monster.CombatSprite.Clone() as AnimatingSprite;
+            this.State = RolePlayingGameData.Character.CharacterState.Idle;
+            this.CombatSprite.PlayAnimation("Idle");
+
+            // create the AI data
+            this.artificialIntelligence = new ArtificialIntelligence(this);
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Update the monster for this frame.
+        /// </summary>
+        public override void Update(GameTime gameTime)
+        {
+            // start any waiting action immediately
+            if ((CombatAction != null) &&
+                (CombatAction.Stage == CombatAction.CombatActionStage.NotStarted))
+            {
+                CombatAction.Start();
+            }
+
+            base.Update(gameTime);
+        }
+
+
+    }
+}

+ 217 - 231
RolePlayingGame/Combat/CombatantPlayer.cs → RolePlayingGame/Core/Combat/CombatantPlayer.cs

@@ -1,231 +1,217 @@
-#region File Description
-//-----------------------------------------------------------------------------
-// CombatantPlayer.cs
-//
-// Microsoft XNA Community Game Platform
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//-----------------------------------------------------------------------------
-#endregion
-
-#region Using Statements
-using System;
-using Microsoft.Xna.Framework;
-using RolePlayingGameData;
-#endregion
-
-namespace RolePlaying
-{
-    /// <summary>
-    /// Encapsulates all of the combat-runtime data for a particular player combatant.
-    /// </summary>
-    class CombatantPlayer : Combatant
-    {
-        /// <summary>
-        /// The Player object encapsulated by this object.
-        /// </summary>
-        private Player player;
-
-        /// <summary>
-        /// The Player object encapsulated by this object.
-        /// </summary>
-        public Player Player
-        {
-            get { return player; }
-        }
-        
-        /// <summary>
-        /// The character encapsulated by this combatant.
-        /// </summary>
-        public override FightingCharacter Character
-        {
-            get { return player as FightingCharacter; }
-        }
-
-
-        #region State Data
-
-
-        /// <summary>
-        /// The current state of this combatant.
-        /// </summary>
-        public override Character.CharacterState State
-        {
-            get { return player.State; }
-            set
-            {
-                if (value == player.State)
-                {
-                    return;
-                }
-                player.State = value;
-                switch (player.State)
-                {
-                    case RolePlayingGameData.Character.CharacterState.Idle:
-                        CombatSprite.PlayAnimation("Idle");
-                        break;
-
-                    case RolePlayingGameData.Character.CharacterState.Hit:
-                        CombatSprite.PlayAnimation("Hit");
-                        break;
-
-                    case RolePlayingGameData.Character.CharacterState.Dying:
-                        player.StatisticsModifiers.HealthPoints = 
-                            -1 * player.CharacterStatistics.HealthPoints;
-                        CombatSprite.PlayAnimation("Die");
-                        break;
-                }
-            }
-        }
-
-
-        #endregion
-
-
-        #region Graphics Data
-
-
-        /// <summary>
-        /// Accessor for the combat sprite for this combatant.
-        /// </summary>
-        public override AnimatingSprite CombatSprite
-        {
-            get { return player.CombatSprite; }
-        }
-
-
-        #endregion
-
-
-        #region Current Statistics
-
-
-        /// <summary>
-        /// The current statistics of this combatant.
-        /// </summary>
-        public override StatisticsValue Statistics
-        {
-            get { return player.CurrentStatistics + CombatEffects.TotalStatistics; }
-        }
-
-
-        /// <summary>
-        /// Heals the combatant by the given amount.
-        /// </summary>
-        public override void Heal(StatisticsValue healingStatistics, int duration)
-        {
-            if (duration > 0)
-            {
-                CombatEffects.AddStatistics(healingStatistics, duration);
-            }
-            else
-            {
-                player.StatisticsModifiers += healingStatistics;
-                player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
-            }
-            base.Heal(healingStatistics, duration);
-        }
-
-
-        /// <summary>
-        /// Damages the combatant by the given amount.
-        /// </summary>
-        public override void Damage(StatisticsValue damageStatistics, int duration)
-        {
-            if (duration > 0)
-            {
-                CombatEffects.AddStatistics(new StatisticsValue() - damageStatistics,
-                    duration);
-            }
-            else
-            {
-                player.StatisticsModifiers -= damageStatistics;
-                player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
-            }
-            base.Damage(damageStatistics, duration);
-        }
-
-
-        /// <summary>
-        /// Pay the cost for the given spell.
-        /// </summary>
-        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
-        public override bool PayCostForSpell(Spell spell)
-        {
-            // check the parameter.
-            if (spell == null)
-            {
-                throw new ArgumentNullException("spell");
-            }
-
-            // check the requirements
-            if (Statistics.MagicPoints < spell.MagicPointCost)
-            {
-                return false;
-            }
-
-            // reduce the player's magic points by the spell's cost
-            player.StatisticsModifiers.MagicPoints -= spell.MagicPointCost;
-
-            return true;
-        }
-
-
-        #endregion
-
-
-        #region Initialization
-
-
-        /// <summary>
-        /// Construct a new CombatantPlayer object containing the given player.
-        /// </summary>
-        public CombatantPlayer(Player player) : base()
-        {
-            // check the parameter
-            if (player == null)
-            {
-                throw new ArgumentNullException("player");
-            }
-
-            // assign the parameters
-            this.player = player;
-
-            // if the player starts dead, make sure the sprite is already "dead"
-            if (IsDeadOrDying)
-            {
-                if (Statistics.HealthPoints > 0)
-                {
-                    State = RolePlayingGameData.Character.CharacterState.Idle;
-                }
-                else
-                {
-                    CombatSprite.PlayAnimation("Die");
-                    CombatSprite.AdvanceToEnd();
-                }
-            }
-            else
-            {
-                State = RolePlayingGameData.Character.CharacterState.Idle;
-                CombatSprite.PlayAnimation("Idle");
-            }
-        }
-
-
-        #endregion
-
-
-        #region Updating
-
-
-        /// <summary>
-        /// Update the player for this frame.
-        /// </summary>
-        public override void Update(GameTime gameTime)
-        {
-            base.Update(gameTime);
-        }
-
-
-        #endregion
-    }
-}
+//-----------------------------------------------------------------------------
+// CombatantPlayer.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+
+using System;
+using Microsoft.Xna.Framework;
+using RolePlayingGameData;
+
+namespace RolePlaying
+{
+    /// <summary>
+    /// Encapsulates all of the combat-runtime data for a particular player combatant.
+    /// </summary>
+    class CombatantPlayer : Combatant
+    {
+        /// <summary>
+        /// The Player object encapsulated by this object.
+        /// </summary>
+        private Player player;
+
+        /// <summary>
+        /// The Player object encapsulated by this object.
+        /// </summary>
+        public Player Player
+        {
+            get { return player; }
+        }
+        
+        /// <summary>
+        /// The character encapsulated by this combatant.
+        /// </summary>
+        public override FightingCharacter Character
+        {
+            get { return player as FightingCharacter; }
+        }
+
+
+
+
+        /// <summary>
+        /// The current state of this combatant.
+        /// </summary>
+        public override Character.CharacterState State
+        {
+            get { return player.State; }
+            set
+            {
+                if (value == player.State)
+                {
+                    return;
+                }
+                player.State = value;
+                switch (player.State)
+                {
+                    case RolePlayingGameData.Character.CharacterState.Idle:
+                        CombatSprite.PlayAnimation("Idle");
+                        break;
+
+                    case RolePlayingGameData.Character.CharacterState.Hit:
+                        CombatSprite.PlayAnimation("Hit");
+                        break;
+
+                    case RolePlayingGameData.Character.CharacterState.Dying:
+                        player.StatisticsModifiers.HealthPoints = 
+                            -1 * player.CharacterStatistics.HealthPoints;
+                        CombatSprite.PlayAnimation("Die");
+                        break;
+                }
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Accessor for the combat sprite for this combatant.
+        /// </summary>
+        public override AnimatingSprite CombatSprite
+        {
+            get { return player.CombatSprite; }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// The current statistics of this combatant.
+        /// </summary>
+        public override StatisticsValue Statistics
+        {
+            get { return player.CurrentStatistics + CombatEffects.TotalStatistics; }
+        }
+
+
+        /// <summary>
+        /// Heals the combatant by the given amount.
+        /// </summary>
+        public override void Heal(StatisticsValue healingStatistics, int duration)
+        {
+            if (duration > 0)
+            {
+                CombatEffects.AddStatistics(healingStatistics, duration);
+            }
+            else
+            {
+                player.StatisticsModifiers += healingStatistics;
+                player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
+            }
+            base.Heal(healingStatistics, duration);
+        }
+
+
+        /// <summary>
+        /// Damages the combatant by the given amount.
+        /// </summary>
+        public override void Damage(StatisticsValue damageStatistics, int duration)
+        {
+            if (duration > 0)
+            {
+                CombatEffects.AddStatistics(new StatisticsValue() - damageStatistics,
+                    duration);
+            }
+            else
+            {
+                player.StatisticsModifiers -= damageStatistics;
+                player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
+            }
+            base.Damage(damageStatistics, duration);
+        }
+
+
+        /// <summary>
+        /// Pay the cost for the given spell.
+        /// </summary>
+        /// <returns>True if the cost could be paid (and therefore was paid).</returns>
+        public override bool PayCostForSpell(Spell spell)
+        {
+            // check the parameter.
+            if (spell == null)
+            {
+                throw new ArgumentNullException("spell");
+            }
+
+            // check the requirements
+            if (Statistics.MagicPoints < spell.MagicPointCost)
+            {
+                return false;
+            }
+
+            // reduce the player's magic points by the spell's cost
+            player.StatisticsModifiers.MagicPoints -= spell.MagicPointCost;
+
+            return true;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Construct a new CombatantPlayer object containing the given player.
+        /// </summary>
+        public CombatantPlayer(Player player) : base()
+        {
+            // check the parameter
+            if (player == null)
+            {
+                throw new ArgumentNullException("player");
+            }
+
+            // assign the parameters
+            this.player = player;
+
+            // if the player starts dead, make sure the sprite is already "dead"
+            if (IsDeadOrDying)
+            {
+                if (Statistics.HealthPoints > 0)
+                {
+                    State = RolePlayingGameData.Character.CharacterState.Idle;
+                }
+                else
+                {
+                    CombatSprite.PlayAnimation("Die");
+                    CombatSprite.AdvanceToEnd();
+                }
+            }
+            else
+            {
+                State = RolePlayingGameData.Character.CharacterState.Idle;
+                CombatSprite.PlayAnimation("Idle");
+            }
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// Update the player for this frame.
+        /// </summary>
+        public override void Update(GameTime gameTime)
+        {
+            base.Update(gameTime);
+        }
+
+
+    }
+}

+ 0 - 0
RolePlayingGame/Content/Audio/RPGAudio.xgs → RolePlayingGame/Core/Content/Audio/RPGAudio.xgs


+ 2752 - 2752
RolePlayingGame/Content/Audio/RpgAudio.xap → RolePlayingGame/Core/Content/Audio/RpgAudio.xap

@@ -1,2752 +1,2752 @@
-Signature = XACT3;
-Version = 18;
-Content Version = 46;
-Release = February 2010;
-
-Options
-{
-    Verbose Report = 0;
-    Generate C/C++ Headers = 1;
-}
-
-Global Settings
-{
-    Xbox File = Xbox\RPGAudio.xgs;
-    Windows File = Win\RPGAudio.xgs;
-    Header File = RPGAudio.h;
-    Exclude Category Names = 0;
-    Exclude Variable Names = 0;
-    Last Modified Low = 0;
-    Last Modified High = 0;
-
-    Category
-    {
-        Name = Global;
-        Public = 1;
-        Background Music = 0;
-        Volume = 0;
-
-        Category Entry
-        {
-        }
-
-        Instance Limit
-        {
-            Max Instances = 255;
-            Behavior = 0;
-
-            Crossfade
-            {
-                Fade In = 0;
-                Fade Out = 0;
-                Crossfade Type = 0;
-            }
-        }
-    }
-
-    Category
-    {
-        Name = Default;
-        Public = 1;
-        Background Music = 0;
-        Volume = 0;
-
-        Category Entry
-        {
-            Name = Global;
-        }
-
-        Instance Limit
-        {
-            Max Instances = 255;
-            Behavior = 0;
-
-            Crossfade
-            {
-                Fade In = 0;
-                Fade Out = 0;
-                Crossfade Type = 0;
-            }
-        }
-    }
-
-    Category
-    {
-        Name = Music;
-        Public = 1;
-        Background Music = 1;
-        Volume = -500;
-
-        Category Entry
-        {
-            Name = Global;
-        }
-
-        Instance Limit
-        {
-            Max Instances = 255;
-            Behavior = 0;
-
-            Crossfade
-            {
-                Fade In = 0;
-                Fade Out = 0;
-                Crossfade Type = 0;
-            }
-        }
-    }
-
-    Variable
-    {
-        Name = OrientationAngle;
-        Public = 1;
-        Global = 0;
-        Internal = 0;
-        External = 0;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 0;
-        Time = 0;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = -180.000000;
-        Max = 180.000000;
-    }
-
-    Variable
-    {
-        Name = DopplerPitchScalar;
-        Public = 1;
-        Global = 0;
-        Internal = 0;
-        External = 0;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 0;
-        Time = 0;
-        Value = 1.000000;
-        Initial Value = 1.000000;
-        Min = 0.000000;
-        Max = 4.000000;
-    }
-
-    Variable
-    {
-        Name = SpeedOfSound;
-        Public = 1;
-        Global = 1;
-        Internal = 0;
-        External = 0;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 0;
-        Time = 0;
-        Value = 343.500000;
-        Initial Value = 343.500000;
-        Min = 0.000000;
-        Max = 1000000.000000;
-    }
-
-    Variable
-    {
-        Name = ReleaseTime;
-        Public = 1;
-        Global = 0;
-        Internal = 1;
-        External = 1;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 1;
-        Time = 1;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = 0.000000;
-        Max = 15000.000000;
-    }
-
-    Variable
-    {
-        Name = AttackTime;
-        Public = 1;
-        Global = 0;
-        Internal = 1;
-        External = 1;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 1;
-        Time = 1;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = 0.000000;
-        Max = 15000.000000;
-    }
-
-    Variable
-    {
-        Name = NumCueInstances;
-        Public = 1;
-        Global = 0;
-        Internal = 1;
-        External = 1;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 1;
-        Time = 0;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = 0.000000;
-        Max = 1024.000000;
-    }
-
-    Variable
-    {
-        Name = Distance;
-        Public = 1;
-        Global = 0;
-        Internal = 0;
-        External = 0;
-        Monitored = 1;
-        Reserved = 1;
-        Read Only = 0;
-        Time = 0;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = 0.000000;
-        Max = 1000000.000000;
-    }
-
-    Variable
-    {
-        Name = RpgCueVolume;
-        Public = 1;
-        Global = 0;
-        Internal = 0;
-        External = 0;
-        Monitored = 1;
-        Reserved = 0;
-        Read Only = 0;
-        Time = 0;
-        Value = 0.000000;
-        Initial Value = 0.000000;
-        Min = 0.000000;
-        Max = 100.000000;
-    }
-
-    Compression Preset
-    {
-        Name = NormalCompression;
-        Xbox Format Tag = 357;
-        Target Sample Rate = 48000;
-        XMA Quality = 80;
-        Find Best Quality = 0;
-        High Freq Cut = 0;
-        Loop = 0;
-        PC Format Tag = 2;
-        Samples Per Block = 128;
-    }
-}
-
-Wave Bank
-{
-    Name = Wave Bank;
-    Xbox File = Xbox\Wave Bank.xwb;
-    Windows File = Win\Wave Bank.xwb;
-    Xbox Bank Path Edited = 1;
-    Windows Bank Path Edited = 1;
-    Seek Tables = 1;
-    Compression Preset Name = NormalCompression;
-    Xbox Bank Last Modified Low = 0;
-    Xbox Bank Last Modified High = 0;
-    PC Bank Last Modified Low = 0;
-    PC Bank Last Modified High = 0;
-    Header Last Modified Low = 0;
-    Header Last Modified High = 0;
-    Bank Last Revised Low = 2728908422;
-    Bank Last Revised High = 29919018;
-
-    Wave
-    {
-        Name = BattleTheme;
-        File = Waves\BattleTheme.wav;
-        Build Settings Last Modified Low = 2705158422;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 3906408;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2511704064;
-            Last Modified High = 29878966;
-        }
-    }
-
-    Wave
-    {
-        Name = DungeonTheme;
-        File = Waves\DungeonTheme.wav;
-        Build Settings Last Modified Low = 2705158422;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 5080268;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 298138624;
-            Last Modified High = 29877481;
-        }
-    }
-
-    Wave
-    {
-        Name = ForestTheme;
-        File = Waves\ForestTheme.wav;
-        Build Settings Last Modified Low = 2705158422;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 4515788;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 728204032;
-            Last Modified High = 29877483;
-        }
-    }
-
-    Wave
-    {
-        Name = MainTheme;
-        File = Waves\MainTheme.wav;
-        Build Settings Last Modified Low = 2705158422;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 7130220;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1071866880;
-            Last Modified High = 29877595;
-        }
-    }
-
-    Wave
-    {
-        Name = Continue;
-        File = Waves\Continue.wav;
-        Build Settings Last Modified Low = 2705158422;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 4608;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2781769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = Death;
-        File = Waves\Death.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 38462;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2521769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = FireballCreate;
-        File = Waves\FireballCreate.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 43824;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2086671360;
-            Last Modified High = 29878965;
-        }
-    }
-
-    Wave
-    {
-        Name = FireballHit;
-        File = Waves\FireballHit.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 88200;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1922586368;
-            Last Modified High = 29877617;
-        }
-    }
-
-    Wave
-    {
-        Name = HealCreate;
-        File = Waves\HealCreate.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 88200;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2001769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = HealImpact;
-        File = Waves\HealImpact.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 87712;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1741769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = HealPotion;
-        File = Waves\HealPotion.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 46158;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1441769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = LevelUp;
-        File = Waves\LevelUp.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 673476;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2816736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = LoseTheme;
-        File = Waves\LoseTheme.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 1117572;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 3929038080;
-            Last Modified High = 29874145;
-        }
-    }
-
-    Wave
-    {
-        Name = MenuMove;
-        File = Waves\MenuMove.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 9042;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2202497280;
-            Last Modified High = 29873945;
-        }
-    }
-
-    Wave
-    {
-        Name = Money;
-        File = Waves\Money.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 81628;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1201769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = QuestComplete;
-        File = Waves\QuestComplete.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 623644;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 116736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = SpellBlock;
-        File = Waves\SpellBlock.wav;
-        Build Settings Last Modified Low = 2705314672;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 23674;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 481769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = SpellCreate;
-        File = Waves\SpellCreate.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 88200;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1786460834;
-            Last Modified High = 29878794;
-        }
-    }
-
-    Wave
-    {
-        Name = StaffBlock;
-        File = Waves\StaffBlock.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 9838;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 81769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = StaffHit;
-        File = Waves\StaffHit.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 45132;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 301769472;
-            Last Modified High = 29878968;
-        }
-    }
-
-    Wave
-    {
-        Name = StaffSwing;
-        File = Waves\StaffSwing.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 23246;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 4156736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = SwordSwing;
-        File = Waves\SwordSwing.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 66150;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 3436736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = WinTheme;
-        File = Waves\WinTheme.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 817804;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 396736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = VillageTheme;
-        File = Waves\VillageTheme.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 2;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 6773708;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 1076736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = SwordHit;
-        File = Waves\SwordHit.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 42300;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 3836736768;
-            Last Modified High = 29878967;
-        }
-    }
-
-    Wave
-    {
-        Name = FireballTravel;
-        File = Waves\FireballTravel.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 44100;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 44100;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 2714736491;
-            Last Modified High = 29879793;
-        }
-    }
-
-    Wave
-    {
-        Name = SwordBlock;
-        File = Waves\SwordBlock.wav;
-        Build Settings Last Modified Low = 2705470922;
-        Build Settings Last Modified High = 29919018;
-
-        Cache
-        {
-            Format Tag = 0;
-            Channels = 1;
-            Sampling Rate = 22050;
-            Bits Per Sample = 1;
-            Play Region Offset = 44;
-            Play Region Length = 17012;
-            Loop Region Offset = 0;
-            Loop Region Length = 0;
-            File Type = 1;
-            Last Modified Low = 4036736768;
-            Last Modified High = 29878967;
-        }
-    }
-}
-
-Sound Bank
-{
-    Name = Sound Bank;
-    Xbox File = Xbox\Sound Bank.xsb;
-    Windows File = Win\Sound Bank.xsb;
-    Xbox Bank Path Edited = 1;
-    Windows Bank Path Edited = 1;
-    Header Last Modified High = 0;
-    Header Last Modified Low = 0;
-
-    Sound
-    {
-        Name = BattleTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = BattleTheme;
-                    Entry Index = 0;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = DungeonTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = DungeonTheme;
-                    Entry Index = 1;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = ForestTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = ForestTheme;
-                    Entry Index = 2;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = MainTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = MainTheme;
-                    Entry Index = 3;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = Continue;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = Continue;
-                    Entry Index = 4;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = Death;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = Death;
-                    Entry Index = 5;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = FireballCreate;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = FireballCreate;
-                    Entry Index = 6;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = FireballHit;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = FireballHit;
-                    Entry Index = 7;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = HealCreate;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = HealCreate;
-                    Entry Index = 8;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = HealImpact;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = HealImpact;
-                    Entry Index = 9;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = HealPotion;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = HealPotion;
-                    Entry Index = 10;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = LevelUp;
-        Volume = -750;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = LevelUp;
-                    Entry Index = 11;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = LoseTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = LoseTheme;
-                    Entry Index = 12;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = MenuMove;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = MenuMove;
-                    Entry Index = 13;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = Money;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = Money;
-                    Entry Index = 14;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = QuestComplete;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = QuestComplete;
-                    Entry Index = 15;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = SpellBlock;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = SpellBlock;
-                    Entry Index = 16;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = SpellCreate;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = SpellCreate;
-                    Entry Index = 17;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = StaffBlock;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = StaffBlock;
-                    Entry Index = 18;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = StaffHit;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = StaffHit;
-                    Entry Index = 19;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = StaffSwing;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = StaffSwing;
-                    Entry Index = 20;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = SwordSwing;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = SwordSwing;
-                    Entry Index = 21;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = WinTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = WinTheme;
-                    Entry Index = 22;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = VillageTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = VillageTheme;
-                    Entry Index = 23;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = BeachTheme;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Music;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Loop Count = 255;
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = MainTheme;
-                    Entry Index = 3;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = SwordHit;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = FireballTravel;
-                    Entry Index = 25;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Sound
-    {
-        Name = SwordBlock;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-        }
-    }
-
-    Sound
-    {
-        Name = FireballTravel;
-        Volume = -1200;
-        Pitch = 0;
-        Priority = 0;
-
-        Category Entry
-        {
-            Name = Default;
-        }
-
-        Track
-        {
-            Volume = 0;
-            Use Filter = 0;
-
-            Play Wave Event
-            {
-                Break Loop = 0;
-                Use Speaker Position = 0;
-                Use Center Speaker = 1;
-                New Speaker Position On Loop = 1;
-                Speaker Position Angle = 0.000000;
-                Speaker Position Arc = 0.000000;
-
-                Event Header
-                {
-                    Timestamp = 0;
-                    Relative = 0;
-                    Random Recurrence = 0;
-                    Random Offset = 0;
-                }
-
-                Wave Entry
-                {
-                    Bank Name = Wave Bank;
-                    Bank Index = 0;
-                    Entry Name = SwordBlock;
-                    Entry Index = 26;
-                    Weight = 255;
-                    Weight Min = 0;
-                }
-            }
-        }
-    }
-
-    Cue
-    {
-        Name = BattleTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = BattleTheme;
-            Index = 0;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = DungeonTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = DungeonTheme;
-            Index = 1;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = ForestTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = ForestTheme;
-            Index = 2;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = MainTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = MainTheme;
-            Index = 3;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = Continue;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = Continue;
-            Index = 4;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = Death;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = Death;
-            Index = 5;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = FireballCreate;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = FireballCreate;
-            Index = 6;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = FireballHit;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = FireballHit;
-            Index = 7;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = HealCreate;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = HealCreate;
-            Index = 8;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = HealImpact;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = HealImpact;
-            Index = 9;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = HealPotion;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = HealPotion;
-            Index = 10;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = LevelUp;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = LevelUp;
-            Index = 11;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = LoseTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = LoseTheme;
-            Index = 12;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = MenuMove;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = MenuMove;
-            Index = 13;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = Money;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = Money;
-            Index = 14;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = QuestComplete;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = QuestComplete;
-            Index = 15;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = SpellBlock;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = SpellBlock;
-            Index = 16;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = SpellCreate;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = SpellCreate;
-            Index = 17;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = StaffBlock;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = StaffBlock;
-            Index = 18;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = StaffHit;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = StaffHit;
-            Index = 19;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = StaffSwing;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = StaffSwing;
-            Index = 20;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = SwordSwing;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = SwordSwing;
-            Index = 21;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = WinTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = WinTheme;
-            Index = 22;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = VillageTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = VillageTheme;
-            Index = 23;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = BeachTheme;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = BeachTheme;
-            Index = 24;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = SwordHit;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = SwordHit;
-            Index = 25;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = SwordBlock;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = SwordBlock;
-            Index = 26;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-
-    Cue
-    {
-        Name = FireballTravel;
-
-        Variation
-        {
-            Variation Type = 3;
-            Variation Table Type = 1;
-            New Variation on Loop = 0;
-        }
-
-        Sound Entry
-        {
-            Name = FireballTravel;
-            Index = 27;
-            Weight Min = 0;
-            Weight Max = 255;
-        }
-    }
-}
+Signature = XACT3;
+Version = 18;
+Content Version = 46;
+Release = February 2010;
+
+Options
+{
+    Verbose Report = 0;
+    Generate C/C++ Headers = 1;
+}
+
+Global Settings
+{
+    Xbox File = Xbox\RPGAudio.xgs;
+    Windows File = Win\RPGAudio.xgs;
+    Header File = RPGAudio.h;
+    Exclude Category Names = 0;
+    Exclude Variable Names = 0;
+    Last Modified Low = 0;
+    Last Modified High = 0;
+
+    Category
+    {
+        Name = Global;
+        Public = 1;
+        Background Music = 0;
+        Volume = 0;
+
+        Category Entry
+        {
+        }
+
+        Instance Limit
+        {
+            Max Instances = 255;
+            Behavior = 0;
+
+            Crossfade
+            {
+                Fade In = 0;
+                Fade Out = 0;
+                Crossfade Type = 0;
+            }
+        }
+    }
+
+    Category
+    {
+        Name = Default;
+        Public = 1;
+        Background Music = 0;
+        Volume = 0;
+
+        Category Entry
+        {
+            Name = Global;
+        }
+
+        Instance Limit
+        {
+            Max Instances = 255;
+            Behavior = 0;
+
+            Crossfade
+            {
+                Fade In = 0;
+                Fade Out = 0;
+                Crossfade Type = 0;
+            }
+        }
+    }
+
+    Category
+    {
+        Name = Music;
+        Public = 1;
+        Background Music = 1;
+        Volume = -500;
+
+        Category Entry
+        {
+            Name = Global;
+        }
+
+        Instance Limit
+        {
+            Max Instances = 255;
+            Behavior = 0;
+
+            Crossfade
+            {
+                Fade In = 0;
+                Fade Out = 0;
+                Crossfade Type = 0;
+            }
+        }
+    }
+
+    Variable
+    {
+        Name = OrientationAngle;
+        Public = 1;
+        Global = 0;
+        Internal = 0;
+        External = 0;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 0;
+        Time = 0;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = -180.000000;
+        Max = 180.000000;
+    }
+
+    Variable
+    {
+        Name = DopplerPitchScalar;
+        Public = 1;
+        Global = 0;
+        Internal = 0;
+        External = 0;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 0;
+        Time = 0;
+        Value = 1.000000;
+        Initial Value = 1.000000;
+        Min = 0.000000;
+        Max = 4.000000;
+    }
+
+    Variable
+    {
+        Name = SpeedOfSound;
+        Public = 1;
+        Global = 1;
+        Internal = 0;
+        External = 0;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 0;
+        Time = 0;
+        Value = 343.500000;
+        Initial Value = 343.500000;
+        Min = 0.000000;
+        Max = 1000000.000000;
+    }
+
+    Variable
+    {
+        Name = ReleaseTime;
+        Public = 1;
+        Global = 0;
+        Internal = 1;
+        External = 1;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 1;
+        Time = 1;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = 0.000000;
+        Max = 15000.000000;
+    }
+
+    Variable
+    {
+        Name = AttackTime;
+        Public = 1;
+        Global = 0;
+        Internal = 1;
+        External = 1;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 1;
+        Time = 1;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = 0.000000;
+        Max = 15000.000000;
+    }
+
+    Variable
+    {
+        Name = NumCueInstances;
+        Public = 1;
+        Global = 0;
+        Internal = 1;
+        External = 1;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 1;
+        Time = 0;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = 0.000000;
+        Max = 1024.000000;
+    }
+
+    Variable
+    {
+        Name = Distance;
+        Public = 1;
+        Global = 0;
+        Internal = 0;
+        External = 0;
+        Monitored = 1;
+        Reserved = 1;
+        Read Only = 0;
+        Time = 0;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = 0.000000;
+        Max = 1000000.000000;
+    }
+
+    Variable
+    {
+        Name = RpgCueVolume;
+        Public = 1;
+        Global = 0;
+        Internal = 0;
+        External = 0;
+        Monitored = 1;
+        Reserved = 0;
+        Read Only = 0;
+        Time = 0;
+        Value = 0.000000;
+        Initial Value = 0.000000;
+        Min = 0.000000;
+        Max = 100.000000;
+    }
+
+    Compression Preset
+    {
+        Name = NormalCompression;
+        Xbox Format Tag = 357;
+        Target Sample Rate = 48000;
+        XMA Quality = 80;
+        Find Best Quality = 0;
+        High Freq Cut = 0;
+        Loop = 0;
+        PC Format Tag = 2;
+        Samples Per Block = 128;
+    }
+}
+
+Wave Bank
+{
+    Name = Wave Bank;
+    Xbox File = Xbox\Wave Bank.xwb;
+    Windows File = Win\Wave Bank.xwb;
+    Xbox Bank Path Edited = 1;
+    Windows Bank Path Edited = 1;
+    Seek Tables = 1;
+    Compression Preset Name = NormalCompression;
+    Xbox Bank Last Modified Low = 0;
+    Xbox Bank Last Modified High = 0;
+    PC Bank Last Modified Low = 0;
+    PC Bank Last Modified High = 0;
+    Header Last Modified Low = 0;
+    Header Last Modified High = 0;
+    Bank Last Revised Low = 2728908422;
+    Bank Last Revised High = 29919018;
+
+    Wave
+    {
+        Name = BattleTheme;
+        File = Waves\BattleTheme.wav;
+        Build Settings Last Modified Low = 2705158422;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 3906408;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2511704064;
+            Last Modified High = 29878966;
+        }
+    }
+
+    Wave
+    {
+        Name = DungeonTheme;
+        File = Waves\DungeonTheme.wav;
+        Build Settings Last Modified Low = 2705158422;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 5080268;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 298138624;
+            Last Modified High = 29877481;
+        }
+    }
+
+    Wave
+    {
+        Name = ForestTheme;
+        File = Waves\ForestTheme.wav;
+        Build Settings Last Modified Low = 2705158422;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 4515788;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 728204032;
+            Last Modified High = 29877483;
+        }
+    }
+
+    Wave
+    {
+        Name = MainTheme;
+        File = Waves\MainTheme.wav;
+        Build Settings Last Modified Low = 2705158422;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 7130220;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1071866880;
+            Last Modified High = 29877595;
+        }
+    }
+
+    Wave
+    {
+        Name = Continue;
+        File = Waves\Continue.wav;
+        Build Settings Last Modified Low = 2705158422;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 4608;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2781769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = Death;
+        File = Waves\Death.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 38462;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2521769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = FireballCreate;
+        File = Waves\FireballCreate.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 43824;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2086671360;
+            Last Modified High = 29878965;
+        }
+    }
+
+    Wave
+    {
+        Name = FireballHit;
+        File = Waves\FireballHit.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 88200;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1922586368;
+            Last Modified High = 29877617;
+        }
+    }
+
+    Wave
+    {
+        Name = HealCreate;
+        File = Waves\HealCreate.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 88200;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2001769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = HealImpact;
+        File = Waves\HealImpact.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 87712;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1741769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = HealPotion;
+        File = Waves\HealPotion.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 46158;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1441769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = LevelUp;
+        File = Waves\LevelUp.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 673476;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2816736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = LoseTheme;
+        File = Waves\LoseTheme.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 1117572;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 3929038080;
+            Last Modified High = 29874145;
+        }
+    }
+
+    Wave
+    {
+        Name = MenuMove;
+        File = Waves\MenuMove.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 9042;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2202497280;
+            Last Modified High = 29873945;
+        }
+    }
+
+    Wave
+    {
+        Name = Money;
+        File = Waves\Money.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 81628;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1201769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = QuestComplete;
+        File = Waves\QuestComplete.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 623644;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 116736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = SpellBlock;
+        File = Waves\SpellBlock.wav;
+        Build Settings Last Modified Low = 2705314672;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 23674;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 481769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = SpellCreate;
+        File = Waves\SpellCreate.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 88200;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1786460834;
+            Last Modified High = 29878794;
+        }
+    }
+
+    Wave
+    {
+        Name = StaffBlock;
+        File = Waves\StaffBlock.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 9838;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 81769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = StaffHit;
+        File = Waves\StaffHit.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 45132;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 301769472;
+            Last Modified High = 29878968;
+        }
+    }
+
+    Wave
+    {
+        Name = StaffSwing;
+        File = Waves\StaffSwing.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 23246;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 4156736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = SwordSwing;
+        File = Waves\SwordSwing.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 66150;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 3436736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = WinTheme;
+        File = Waves\WinTheme.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 817804;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 396736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = VillageTheme;
+        File = Waves\VillageTheme.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 2;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 6773708;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 1076736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = SwordHit;
+        File = Waves\SwordHit.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 42300;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 3836736768;
+            Last Modified High = 29878967;
+        }
+    }
+
+    Wave
+    {
+        Name = FireballTravel;
+        File = Waves\FireballTravel.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 44100;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 44100;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 2714736491;
+            Last Modified High = 29879793;
+        }
+    }
+
+    Wave
+    {
+        Name = SwordBlock;
+        File = Waves\SwordBlock.wav;
+        Build Settings Last Modified Low = 2705470922;
+        Build Settings Last Modified High = 29919018;
+
+        Cache
+        {
+            Format Tag = 0;
+            Channels = 1;
+            Sampling Rate = 22050;
+            Bits Per Sample = 1;
+            Play Region Offset = 44;
+            Play Region Length = 17012;
+            Loop Region Offset = 0;
+            Loop Region Length = 0;
+            File Type = 1;
+            Last Modified Low = 4036736768;
+            Last Modified High = 29878967;
+        }
+    }
+}
+
+Sound Bank
+{
+    Name = Sound Bank;
+    Xbox File = Xbox\Sound Bank.xsb;
+    Windows File = Win\Sound Bank.xsb;
+    Xbox Bank Path Edited = 1;
+    Windows Bank Path Edited = 1;
+    Header Last Modified High = 0;
+    Header Last Modified Low = 0;
+
+    Sound
+    {
+        Name = BattleTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = BattleTheme;
+                    Entry Index = 0;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = DungeonTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = DungeonTheme;
+                    Entry Index = 1;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = ForestTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = ForestTheme;
+                    Entry Index = 2;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = MainTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = MainTheme;
+                    Entry Index = 3;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = Continue;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = Continue;
+                    Entry Index = 4;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = Death;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = Death;
+                    Entry Index = 5;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = FireballCreate;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = FireballCreate;
+                    Entry Index = 6;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = FireballHit;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = FireballHit;
+                    Entry Index = 7;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = HealCreate;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = HealCreate;
+                    Entry Index = 8;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = HealImpact;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = HealImpact;
+                    Entry Index = 9;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = HealPotion;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = HealPotion;
+                    Entry Index = 10;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = LevelUp;
+        Volume = -750;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = LevelUp;
+                    Entry Index = 11;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = LoseTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = LoseTheme;
+                    Entry Index = 12;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = MenuMove;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = MenuMove;
+                    Entry Index = 13;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = Money;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = Money;
+                    Entry Index = 14;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = QuestComplete;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = QuestComplete;
+                    Entry Index = 15;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = SpellBlock;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = SpellBlock;
+                    Entry Index = 16;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = SpellCreate;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = SpellCreate;
+                    Entry Index = 17;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = StaffBlock;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = StaffBlock;
+                    Entry Index = 18;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = StaffHit;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = StaffHit;
+                    Entry Index = 19;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = StaffSwing;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = StaffSwing;
+                    Entry Index = 20;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = SwordSwing;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = SwordSwing;
+                    Entry Index = 21;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = WinTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = WinTheme;
+                    Entry Index = 22;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = VillageTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = VillageTheme;
+                    Entry Index = 23;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = BeachTheme;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Music;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Loop Count = 255;
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = MainTheme;
+                    Entry Index = 3;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = SwordHit;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = FireballTravel;
+                    Entry Index = 25;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Sound
+    {
+        Name = SwordBlock;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+        }
+    }
+
+    Sound
+    {
+        Name = FireballTravel;
+        Volume = -1200;
+        Pitch = 0;
+        Priority = 0;
+
+        Category Entry
+        {
+            Name = Default;
+        }
+
+        Track
+        {
+            Volume = 0;
+            Use Filter = 0;
+
+            Play Wave Event
+            {
+                Break Loop = 0;
+                Use Speaker Position = 0;
+                Use Center Speaker = 1;
+                New Speaker Position On Loop = 1;
+                Speaker Position Angle = 0.000000;
+                Speaker Position Arc = 0.000000;
+
+                Event Header
+                {
+                    Timestamp = 0;
+                    Relative = 0;
+                    Random Recurrence = 0;
+                    Random Offset = 0;
+                }
+
+                Wave Entry
+                {
+                    Bank Name = Wave Bank;
+                    Bank Index = 0;
+                    Entry Name = SwordBlock;
+                    Entry Index = 26;
+                    Weight = 255;
+                    Weight Min = 0;
+                }
+            }
+        }
+    }
+
+    Cue
+    {
+        Name = BattleTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = BattleTheme;
+            Index = 0;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = DungeonTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = DungeonTheme;
+            Index = 1;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = ForestTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = ForestTheme;
+            Index = 2;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = MainTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = MainTheme;
+            Index = 3;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = Continue;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = Continue;
+            Index = 4;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = Death;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = Death;
+            Index = 5;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = FireballCreate;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = FireballCreate;
+            Index = 6;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = FireballHit;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = FireballHit;
+            Index = 7;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = HealCreate;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = HealCreate;
+            Index = 8;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = HealImpact;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = HealImpact;
+            Index = 9;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = HealPotion;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = HealPotion;
+            Index = 10;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = LevelUp;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = LevelUp;
+            Index = 11;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = LoseTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = LoseTheme;
+            Index = 12;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = MenuMove;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = MenuMove;
+            Index = 13;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = Money;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = Money;
+            Index = 14;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = QuestComplete;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = QuestComplete;
+            Index = 15;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = SpellBlock;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = SpellBlock;
+            Index = 16;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = SpellCreate;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = SpellCreate;
+            Index = 17;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = StaffBlock;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = StaffBlock;
+            Index = 18;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = StaffHit;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = StaffHit;
+            Index = 19;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = StaffSwing;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = StaffSwing;
+            Index = 20;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = SwordSwing;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = SwordSwing;
+            Index = 21;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = WinTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = WinTheme;
+            Index = 22;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = VillageTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = VillageTheme;
+            Index = 23;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = BeachTheme;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = BeachTheme;
+            Index = 24;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = SwordHit;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = SwordHit;
+            Index = 25;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = SwordBlock;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = SwordBlock;
+            Index = 26;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+
+    Cue
+    {
+        Name = FireballTravel;
+
+        Variation
+        {
+            Variation Type = 3;
+            Variation Table Type = 1;
+            New Variation on Loop = 0;
+        }
+
+        Sound Entry
+        {
+            Name = FireballTravel;
+            Index = 27;
+            Weight Min = 0;
+            Weight Max = 255;
+        }
+    }
+}

+ 0 - 0
RolePlayingGame/Content/Audio/Sound Bank.xsb → RolePlayingGame/Core/Content/Audio/Sound Bank.xsb


+ 0 - 0
RolePlayingGame/Content/Audio/Wave Bank.xwb → RolePlayingGame/Core/Content/Audio/Wave Bank.xwb


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/BattleTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/BattleTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/Continue.wav → RolePlayingGame/Core/Content/Audio/Waves/Continue.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/Death.wav → RolePlayingGame/Core/Content/Audio/Waves/Death.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/DungeonTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/DungeonTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/FireballCreate.wav → RolePlayingGame/Core/Content/Audio/Waves/FireballCreate.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/FireballHit.wav → RolePlayingGame/Core/Content/Audio/Waves/FireballHit.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/FireballTravel.wav → RolePlayingGame/Core/Content/Audio/Waves/FireballTravel.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/ForestTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/ForestTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/HealCreate.wav → RolePlayingGame/Core/Content/Audio/Waves/HealCreate.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/HealImpact.wav → RolePlayingGame/Core/Content/Audio/Waves/HealImpact.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/HealPotion.wav → RolePlayingGame/Core/Content/Audio/Waves/HealPotion.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/LevelUp.wav → RolePlayingGame/Core/Content/Audio/Waves/LevelUp.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/LoseTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/LoseTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/MainTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/MainTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/MenuMove.wav → RolePlayingGame/Core/Content/Audio/Waves/MenuMove.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/Money.wav → RolePlayingGame/Core/Content/Audio/Waves/Money.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/QuestComplete.wav → RolePlayingGame/Core/Content/Audio/Waves/QuestComplete.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/SpellBlock.wav → RolePlayingGame/Core/Content/Audio/Waves/SpellBlock.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/SpellCreate.wav → RolePlayingGame/Core/Content/Audio/Waves/SpellCreate.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/StaffBlock.wav → RolePlayingGame/Core/Content/Audio/Waves/StaffBlock.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/StaffHit.wav → RolePlayingGame/Core/Content/Audio/Waves/StaffHit.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/StaffSwing.wav → RolePlayingGame/Core/Content/Audio/Waves/StaffSwing.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/SwordBlock.wav → RolePlayingGame/Core/Content/Audio/Waves/SwordBlock.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/SwordHit.wav → RolePlayingGame/Core/Content/Audio/Waves/SwordHit.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/SwordSwing.wav → RolePlayingGame/Core/Content/Audio/Waves/SwordSwing.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/VillageTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/VillageTheme.wav


+ 0 - 0
RolePlayingGame/Content/Audio/Waves/WinTheme.wav → RolePlayingGame/Core/Content/Audio/Waves/WinTheme.wav


+ 96 - 96
RolePlayingGame/Content/CharacterClasses/Barbarian.xml → RolePlayingGame/Core/Content/CharacterClasses/Barbarian.xml

@@ -1,96 +1,96 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Barbarian</Name>
-      <InitialStatistics>
-          <HealthPoints>50</HealthPoints>
-          <MagicPoints>0</MagicPoints>
-          <PhysicalOffense>15</PhysicalOffense>
-          <PhysicalDefense>5</PhysicalDefense>
-          <MagicalOffense>0</MagicalOffense>
-          <MagicalDefense>1</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>15</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>0</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>0</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>4</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>0</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>0</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>1</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>2</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>750</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>800</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>20</BaseExperienceValue>
-      <BaseGoldValue>10</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Barbarian</Name>
+      <InitialStatistics>
+          <HealthPoints>50</HealthPoints>
+          <MagicPoints>0</MagicPoints>
+          <PhysicalOffense>15</PhysicalOffense>
+          <PhysicalDefense>5</PhysicalDefense>
+          <MagicalOffense>0</MagicalOffense>
+          <MagicalDefense>1</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>15</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>0</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>0</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>4</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>0</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>0</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>1</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>2</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>750</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>800</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>20</BaseExperienceValue>
+      <BaseGoldValue>10</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/Barbarian.xnb → RolePlayingGame/Core/Content/CharacterClasses/Barbarian.xnb


+ 112 - 112
RolePlayingGame/Content/CharacterClasses/Mystic.xml → RolePlayingGame/Core/Content/CharacterClasses/Mystic.xml

@@ -1,112 +1,112 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Mystic</Name>
-      <InitialStatistics>
-          <HealthPoints>30</HealthPoints>
-          <MagicPoints>35</MagicPoints>
-          <PhysicalOffense>15</PhysicalOffense>
-          <PhysicalDefense>15</PhysicalDefense>
-          <MagicalOffense>15</MagicalOffense>
-          <MagicalDefense>15</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>10</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>10</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>2</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>2</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>Heal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>30</BaseExperienceValue>
-      <BaseGoldValue>50</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Mystic</Name>
+      <InitialStatistics>
+          <HealthPoints>30</HealthPoints>
+          <MagicPoints>35</MagicPoints>
+          <PhysicalOffense>15</PhysicalOffense>
+          <PhysicalDefense>15</PhysicalDefense>
+          <MagicalOffense>15</MagicalOffense>
+          <MagicalDefense>15</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>10</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>10</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>2</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>2</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>Heal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>30</BaseExperienceValue>
+      <BaseGoldValue>50</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/Mystic.xnb → RolePlayingGame/Core/Content/CharacterClasses/Mystic.xnb


+ 122 - 122
RolePlayingGame/Content/CharacterClasses/Paladin.xml → RolePlayingGame/Core/Content/CharacterClasses/Paladin.xml

@@ -1,122 +1,122 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Paladin</Name>
-      <InitialStatistics>
-          <HealthPoints>30</HealthPoints>
-          <MagicPoints>10</MagicPoints>
-          <PhysicalOffense>7</PhysicalOffense>
-          <PhysicalDefense>7</PhysicalDefense>
-          <MagicalOffense>7</MagicalOffense>
-          <MagicalDefense>7</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>7</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>7</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>2</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>2</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>1</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MinorHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MassMinorHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>Heal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MassHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MassHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>750</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>800</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MassHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>SuperHeal</Item>
-              </SpellContentNames>
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>20</BaseExperienceValue>
-      <BaseGoldValue>10</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Paladin</Name>
+      <InitialStatistics>
+          <HealthPoints>30</HealthPoints>
+          <MagicPoints>10</MagicPoints>
+          <PhysicalOffense>7</PhysicalOffense>
+          <PhysicalDefense>7</PhysicalDefense>
+          <MagicalOffense>7</MagicalOffense>
+          <MagicalDefense>7</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>7</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>7</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>2</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>2</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>1</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MinorHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MassMinorHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>Heal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MassHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MassHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>750</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>800</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MassHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>SuperHeal</Item>
+              </SpellContentNames>
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>20</BaseExperienceValue>
+      <BaseGoldValue>10</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/Paladin.xnb → RolePlayingGame/Core/Content/CharacterClasses/Paladin.xnb


+ 114 - 114
RolePlayingGame/Content/CharacterClasses/RedMage.xml → RolePlayingGame/Core/Content/CharacterClasses/RedMage.xml

@@ -1,114 +1,114 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Red Mage</Name>
-      <InitialStatistics>
-          <HealthPoints>20</HealthPoints>
-          <MagicPoints>25</MagicPoints>
-          <PhysicalOffense>5</PhysicalOffense>
-          <PhysicalDefense>3</PhysicalDefense>
-          <MagicalOffense>15</MagicalOffense>
-          <MagicalDefense>5</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>5</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>13</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>1</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBomb</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBomb</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>750</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>800</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBomb</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>20</BaseExperienceValue>
-      <BaseGoldValue>10</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Red Mage</Name>
+      <InitialStatistics>
+          <HealthPoints>20</HealthPoints>
+          <MagicPoints>25</MagicPoints>
+          <PhysicalOffense>5</PhysicalOffense>
+          <PhysicalDefense>3</PhysicalDefense>
+          <MagicalOffense>15</MagicalOffense>
+          <MagicalDefense>5</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>5</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>13</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>1</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>2</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBomb</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBomb</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>750</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>800</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBomb</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>20</BaseExperienceValue>
+      <BaseGoldValue>10</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/RedMage.xnb → RolePlayingGame/Core/Content/CharacterClasses/RedMage.xnb


+ 96 - 96
RolePlayingGame/Content/CharacterClasses/Warrior.xml → RolePlayingGame/Core/Content/CharacterClasses/Warrior.xml

@@ -1,96 +1,96 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Warrior</Name>
-      <InitialStatistics>
-          <HealthPoints>35</HealthPoints>
-          <MagicPoints>0</MagicPoints>
-          <PhysicalOffense>10</PhysicalOffense>
-          <PhysicalDefense>10</PhysicalDefense>
-          <MagicalOffense>5</MagicalOffense>
-          <MagicalDefense>5</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>10</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>0</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>0</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>3</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>3</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>1</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>1</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>750</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>800</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames />
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>20</BaseExperienceValue>
-      <BaseGoldValue>10</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Warrior</Name>
+      <InitialStatistics>
+          <HealthPoints>35</HealthPoints>
+          <MagicPoints>0</MagicPoints>
+          <PhysicalOffense>10</PhysicalOffense>
+          <PhysicalDefense>10</PhysicalDefense>
+          <MagicalOffense>5</MagicalOffense>
+          <MagicalDefense>5</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>10</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>0</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>0</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>3</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>3</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>1</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>1</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>750</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>800</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames />
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>20</BaseExperienceValue>
+      <BaseGoldValue>10</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/Warrior.xnb → RolePlayingGame/Core/Content/CharacterClasses/Warrior.xnb


+ 128 - 128
RolePlayingGame/Content/CharacterClasses/Wizard.xml → RolePlayingGame/Core/Content/CharacterClasses/Wizard.xml

@@ -1,128 +1,128 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.CharacterClass">
-      <Name>Wizard</Name>
-      <InitialStatistics>
-          <HealthPoints>20</HealthPoints>
-          <MagicPoints>20</MagicPoints>
-          <PhysicalOffense>5</PhysicalOffense>
-          <PhysicalDefense>5</PhysicalDefense>
-          <MagicalOffense>10</MagicalOffense>
-          <MagicalDefense>10</MagicalDefense>          
-      </InitialStatistics>
-      <LevelingStatistics>
-          <HealthPointsIncrease>5</HealthPointsIncrease>
-          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
-          <MagicPointsIncrease>10</MagicPointsIncrease>
-          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
-          <PhysicalOffenseIncrease>1</PhysicalOffenseIncrease>
-          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
-          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
-          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
-          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
-          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
-          <MagicalDefenseIncrease>3</MagicalDefenseIncrease>
-          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
-      </LevelingStatistics>
-      <LevelEntries>
-          <Item>
-              <ExperiencePoints>100</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>150</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MinorHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>200</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>250</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>300</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MinorHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>350</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBolt</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>400</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>450</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>Heal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>500</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>550</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>600</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>Heal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>650</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>700</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>MassHeal</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>750</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>800</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>IceBlast</Item>
-              </SpellContentNames>
-          </Item>
-          <Item>
-              <ExperiencePoints>0</ExperiencePoints>
-              <SpellContentNames>
-                  <Item>FireBomb</Item>
-              </SpellContentNames>
-          </Item>
-      </LevelEntries>
-      <BaseExperienceValue>20</BaseExperienceValue>
-      <BaseGoldValue>10</BaseGoldValue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.CharacterClass">
+      <Name>Wizard</Name>
+      <InitialStatistics>
+          <HealthPoints>20</HealthPoints>
+          <MagicPoints>20</MagicPoints>
+          <PhysicalOffense>5</PhysicalOffense>
+          <PhysicalDefense>5</PhysicalDefense>
+          <MagicalOffense>10</MagicalOffense>
+          <MagicalDefense>10</MagicalDefense>          
+      </InitialStatistics>
+      <LevelingStatistics>
+          <HealthPointsIncrease>5</HealthPointsIncrease>
+          <LevelsPerHealthPointsIncrease>1</LevelsPerHealthPointsIncrease>
+          <MagicPointsIncrease>10</MagicPointsIncrease>
+          <LevelsPerMagicPointsIncrease>1</LevelsPerMagicPointsIncrease>
+          <PhysicalOffenseIncrease>1</PhysicalOffenseIncrease>
+          <LevelsPerPhysicalOffenseIncrease>1</LevelsPerPhysicalOffenseIncrease>
+          <PhysicalDefenseIncrease>1</PhysicalDefenseIncrease>
+          <LevelsPerPhysicalDefenseIncrease>1</LevelsPerPhysicalDefenseIncrease>
+          <MagicalOffenseIncrease>2</MagicalOffenseIncrease>
+          <LevelsPerMagicalOffenseIncrease>1</LevelsPerMagicalOffenseIncrease>
+          <MagicalDefenseIncrease>3</MagicalDefenseIncrease>
+          <LevelsPerMagicalDefenseIncrease>1</LevelsPerMagicalDefenseIncrease>
+      </LevelingStatistics>
+      <LevelEntries>
+          <Item>
+              <ExperiencePoints>100</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>150</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MinorHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>200</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>250</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>300</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MinorHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>350</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBolt</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>400</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>450</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>Heal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>500</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>550</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>600</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>Heal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>650</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>700</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>MassHeal</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>750</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>800</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>IceBlast</Item>
+              </SpellContentNames>
+          </Item>
+          <Item>
+              <ExperiencePoints>0</ExperiencePoints>
+              <SpellContentNames>
+                  <Item>FireBomb</Item>
+              </SpellContentNames>
+          </Item>
+      </LevelEntries>
+      <BaseExperienceValue>20</BaseExperienceValue>
+      <BaseGoldValue>10</BaseGoldValue>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/CharacterClasses/Wizard.xnb → RolePlayingGame/Core/Content/CharacterClasses/Wizard.xnb


+ 58 - 58
RolePlayingGame/Content/Characters/Monsters/BanditGuard.xml → RolePlayingGame/Core/Content/Characters/Monsters/BanditGuard.xml

@@ -1,58 +1,58 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Bandit Guard</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior3IdleLeft</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>5</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\Claymore</Item>
-          <Item>Armor\LeatherArmor</Item>
-          <Item>Armor\HideShield</Item>
-          <Item>Armor\LeatherBoots</Item>
-          <Item>Armor\HideHelmet</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-          <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Warrior3AttackLeft</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>155 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\HealingPotion</GearName>
-              <DropPercentage>60</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>60</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideShield</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherBoots</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Bandit Guard</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior3IdleLeft</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>5</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\Claymore</Item>
+          <Item>Armor\LeatherArmor</Item>
+          <Item>Armor\HideShield</Item>
+          <Item>Armor\LeatherBoots</Item>
+          <Item>Armor\HideHelmet</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+          <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Warrior3AttackLeft</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>155 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\HealingPotion</GearName>
+              <DropPercentage>60</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>60</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideShield</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherBoots</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BanditGuard.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BanditGuard.xnb


+ 62 - 62
RolePlayingGame/Content/Characters/Monsters/BanditLeader.xml → RolePlayingGame/Core/Content/Characters/Monsters/BanditLeader.xml

@@ -1,62 +1,62 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Bandit Leader</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior1IdleRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>6</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\ClaymorePlus</Item>
-          <Item>Armor\LeatherArmor</Item>
-          <Item>Armor\LeatherShield</Item>
-          <Item>Armor\LeatherBoots</Item>
-          <Item>Armor\LeatherHelmet</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-          <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>5</Count>
-          </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Warrior1AttackLeft</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>155 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\HealingPotion</GearName>
-              <DropPercentage>60</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\ClaymorePlus</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherShield</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherBoots</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Bandit Leader</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior1IdleRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>6</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\ClaymorePlus</Item>
+          <Item>Armor\LeatherArmor</Item>
+          <Item>Armor\LeatherShield</Item>
+          <Item>Armor\LeatherBoots</Item>
+          <Item>Armor\LeatherHelmet</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+          <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>5</Count>
+          </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Warrior1AttackLeft</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>155 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\HealingPotion</GearName>
+              <DropPercentage>60</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\ClaymorePlus</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherShield</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherBoots</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BanditLeader.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BanditLeader.xnb


+ 57 - 57
RolePlayingGame/Content/Characters/Monsters/BanditMage.xml → RolePlayingGame/Core/Content/Characters/Monsters/BanditMage.xml

@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Bandit Mage</Name>
-      <MapSprite>
-          <TextureName>Characters\Wizard2IdleLeft</TextureName>
-          <FrameDimensions>128 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>64 150</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Wizard</CharacterClassContentName>
-      <CharacterLevel>5</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\MysticalStaff</Item>
-          <Item>Armor\MagicRobe</Item>
-          <Item>Armor\MageBoots</Item>
-          <Item>Armor\MageHood</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-          <Item>
-			  <ContentName>Items\MagicPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Wizard2AttackLeft</TextureName>
-          <FrameDimensions>256 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>135 155</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MagicPotion</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\MysticalStaff</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MagicRobe</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MageBoots</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MageHood</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Bandit Mage</Name>
+      <MapSprite>
+          <TextureName>Characters\Wizard2IdleLeft</TextureName>
+          <FrameDimensions>128 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>64 150</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Wizard</CharacterClassContentName>
+      <CharacterLevel>5</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\MysticalStaff</Item>
+          <Item>Armor\MagicRobe</Item>
+          <Item>Armor\MageBoots</Item>
+          <Item>Armor\MageHood</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+          <Item>
+			  <ContentName>Items\MagicPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Wizard2AttackLeft</TextureName>
+          <FrameDimensions>256 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>135 155</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MagicPotion</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\MysticalStaff</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MagicRobe</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MageBoots</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MageHood</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BanditMage.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BanditMage.xnb


+ 62 - 62
RolePlayingGame/Content/Characters/Monsters/BanditMaster.xml → RolePlayingGame/Core/Content/Characters/Monsters/BanditMaster.xml

@@ -1,62 +1,62 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Bandit Master</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior1IdleRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>7</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\Longsword</Item>
-          <Item>Armor\BronzeArmor</Item>
-          <Item>Armor\LeatherShield</Item>
-          <Item>Armor\LeatherBoots</Item>
-          <Item>Armor\LeatherHelmet</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-	  </Inventory>
-	  <CombatSprite>
-          <TextureName>Characters\Warrior1AttackLeft</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>155 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\HealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MajorHealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherShield</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\BronzeArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherBoots</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Bandit Master</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior1IdleRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>7</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\Longsword</Item>
+          <Item>Armor\BronzeArmor</Item>
+          <Item>Armor\LeatherShield</Item>
+          <Item>Armor\LeatherBoots</Item>
+          <Item>Armor\LeatherHelmet</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+	  </Inventory>
+	  <CombatSprite>
+          <TextureName>Characters\Warrior1AttackLeft</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>155 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\HealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MajorHealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherShield</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\BronzeArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherBoots</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BanditMaster.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BanditMaster.xnb


+ 54 - 54
RolePlayingGame/Content/Characters/Monsters/BanditMinor.xml → RolePlayingGame/Core/Content/Characters/Monsters/BanditMinor.xml

@@ -1,54 +1,54 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Bandit Minor</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior2IdleLeft</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>4</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\Claymore</Item>
-          <Item>Armor\HideArmor</Item>
-          <Item>Armor\HideShield</Item>
-          <Item>Armor\HideBoots</Item>
-          <Item>Armor\HideHelmet</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-	  </Inventory>
-	  <CombatSprite>
-          <TextureName>Characters\Warrior2AttackLeft</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>155 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>60</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideShield</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideBoots</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Bandit Minor</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior2IdleLeft</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>4</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\Claymore</Item>
+          <Item>Armor\HideArmor</Item>
+          <Item>Armor\HideShield</Item>
+          <Item>Armor\HideBoots</Item>
+          <Item>Armor\HideHelmet</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+	  </Inventory>
+	  <CombatSprite>
+          <TextureName>Characters\Warrior2AttackLeft</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>155 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>60</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideShield</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideBoots</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BanditMinor.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BanditMinor.xnb


+ 65 - 65
RolePlayingGame/Content/Characters/Monsters/BruteMage.xml → RolePlayingGame/Core/Content/Characters/Monsters/BruteMage.xml

@@ -1,65 +1,65 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Brute Mage</Name>
-      <MapSprite>
-          <TextureName>Characters\Boss3IdleLeft</TextureName>
-          <FrameDimensions>174 216</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>87 156</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Wizard</CharacterClassContentName>
-      <CharacterLevel>8</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\MysticalStaff</Item>
-          <Item>Armor\MagicRobe</Item>
-          <Item>Armor\MagicMageBoots</Item>
-          <Item>Armor\MagicMageHood</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MajorMagicPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Boss2AttackLeft</TextureName>
-          <FrameDimensions>288 288</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>150 240</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Walk</Name>
-                  <StartingFrame>25</StartingFrame>
-                  <EndingFrame>30</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MagicPotion</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\MysticalStaff</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MagicRobe</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MagicMageBoots</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MagicMageHood</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Brute Mage</Name>
+      <MapSprite>
+          <TextureName>Characters\Boss3IdleLeft</TextureName>
+          <FrameDimensions>174 216</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>87 156</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Wizard</CharacterClassContentName>
+      <CharacterLevel>8</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\MysticalStaff</Item>
+          <Item>Armor\MagicRobe</Item>
+          <Item>Armor\MagicMageBoots</Item>
+          <Item>Armor\MagicMageHood</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MajorMagicPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Boss2AttackLeft</TextureName>
+          <FrameDimensions>288 288</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>150 240</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Walk</Name>
+                  <StartingFrame>25</StartingFrame>
+                  <EndingFrame>30</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MagicPotion</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\MysticalStaff</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MagicRobe</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MagicMageBoots</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MagicMageHood</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BruteMage.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BruteMage.xnb


+ 52 - 52
RolePlayingGame/Content/Characters/Monsters/BruteMaster.xml → RolePlayingGame/Core/Content/Characters/Monsters/BruteMaster.xml

@@ -1,52 +1,52 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Brute Master</Name>
-      <MapSprite>
-          <TextureName>Characters\Boss1IdleLeft</TextureName>
-          <FrameDimensions>174 216</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>87 156</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>8</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\PersianBlade</Item>
-          <Item>Armor\IronArmor</Item>
-          <Item>Armor\SteelHelmet</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MajorHealingPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Boss1AttackLeft</TextureName>
-          <FrameDimensions>288 288</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>150 240</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Walk</Name>
-                  <StartingFrame>25</StartingFrame>
-                  <EndingFrame>30</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>20</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MajorHealingPotion</GearName>
-              <DropPercentage>50</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\SteelHelmet</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Brute Master</Name>
+      <MapSprite>
+          <TextureName>Characters\Boss1IdleLeft</TextureName>
+          <FrameDimensions>174 216</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>87 156</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>8</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\PersianBlade</Item>
+          <Item>Armor\IronArmor</Item>
+          <Item>Armor\SteelHelmet</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MajorHealingPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Boss1AttackLeft</TextureName>
+          <FrameDimensions>288 288</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>150 240</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Walk</Name>
+                  <StartingFrame>25</StartingFrame>
+                  <EndingFrame>30</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>20</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MajorHealingPotion</GearName>
+              <DropPercentage>50</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\SteelHelmet</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/BruteMaster.xnb → RolePlayingGame/Core/Content/Characters/Monsters/BruteMaster.xnb


+ 57 - 57
RolePlayingGame/Content/Characters/Monsters/CrimsonHood.xml → RolePlayingGame/Core/Content/Characters/Monsters/CrimsonHood.xml

@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Crimson Hood</Name>
-      <MapSprite>
-          <TextureName>Characters\Wizard2IdleLeft</TextureName>
-          <FrameDimensions>128 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>64 150</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>RedMage</CharacterClassContentName>
-      <CharacterLevel>9</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\SageStaff</Item>
-          <Item>Armor\SageRobe</Item>
-          <Item>Armor\MageBoots</Item>
-          <Item>Armor\MageHood</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MajorHealingPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-	  </Inventory>
-	  <CombatSprite>
-          <TextureName>Characters\Wizard3AttackLeft</TextureName>
-          <FrameDimensions>256 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>135 155</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MajorMagicPotion</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\SageStaff</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\SageRobe</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MageBoots</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\MageHood</GearName>
-              <DropPercentage>5</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Crimson Hood</Name>
+      <MapSprite>
+          <TextureName>Characters\Wizard2IdleLeft</TextureName>
+          <FrameDimensions>128 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>64 150</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>RedMage</CharacterClassContentName>
+      <CharacterLevel>9</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\SageStaff</Item>
+          <Item>Armor\SageRobe</Item>
+          <Item>Armor\MageBoots</Item>
+          <Item>Armor\MageHood</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MajorHealingPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+	  </Inventory>
+	  <CombatSprite>
+          <TextureName>Characters\Wizard3AttackLeft</TextureName>
+          <FrameDimensions>256 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>135 155</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MajorMagicPotion</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\SageStaff</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\SageRobe</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MageBoots</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\MageHood</GearName>
+              <DropPercentage>5</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/CrimsonHood.xnb → RolePlayingGame/Core/Content/Characters/Monsters/CrimsonHood.xnb


+ 33 - 33
RolePlayingGame/Content/Characters/Monsters/GoblinGrunt.xml → RolePlayingGame/Core/Content/Characters/Monsters/GoblinGrunt.xml

@@ -1,33 +1,33 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Goblin Grunt</Name>
-      <MapSprite>
-          <TextureName>Characters\GoblinIdleLeft</TextureName>
-          <FrameDimensions>126 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>63 128</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>2</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\ShortSword</Item>
-      </InitialEquipmentContentNames>
-      <Inventory />
-      <CombatSprite>
-          <TextureName>Characters\GoblinAttackLeft</TextureName>
-          <FrameDimensions>224 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>120 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>0</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>60</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Goblin Grunt</Name>
+      <MapSprite>
+          <TextureName>Characters\GoblinIdleLeft</TextureName>
+          <FrameDimensions>126 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>63 128</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>2</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\ShortSword</Item>
+      </InitialEquipmentContentNames>
+      <Inventory />
+      <CombatSprite>
+          <TextureName>Characters\GoblinAttackLeft</TextureName>
+          <FrameDimensions>224 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>120 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>0</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>60</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/GoblinGrunt.xnb → RolePlayingGame/Core/Content/Characters/Monsters/GoblinGrunt.xnb


+ 47 - 47
RolePlayingGame/Content/Characters/Monsters/GoblinMage.xml → RolePlayingGame/Core/Content/Characters/Monsters/GoblinMage.xml

@@ -1,47 +1,47 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Goblin Mage</Name>
-      <MapSprite>
-          <TextureName>Characters\Goblin1IdleLeft</TextureName>
-          <FrameDimensions>126 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>63 128</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>RedMage</CharacterClassContentName>
-      <CharacterLevel>2</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\WornStaff</Item>
-          <Item>Armor\WornRobe</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorMagicPotion</ContentName>
-			  <Count>2</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Goblin1AttackLeft</TextureName>
-          <FrameDimensions>224 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>120 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MinorMagicPotion</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\WornStaff</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\WornRobe</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Goblin Mage</Name>
+      <MapSprite>
+          <TextureName>Characters\Goblin1IdleLeft</TextureName>
+          <FrameDimensions>126 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>63 128</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>RedMage</CharacterClassContentName>
+      <CharacterLevel>2</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\WornStaff</Item>
+          <Item>Armor\WornRobe</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorMagicPotion</ContentName>
+			  <Count>2</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Goblin1AttackLeft</TextureName>
+          <FrameDimensions>224 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>120 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MinorMagicPotion</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\WornStaff</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\WornRobe</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/GoblinMage.xnb → RolePlayingGame/Core/Content/Characters/Monsters/GoblinMage.xnb


+ 42 - 42
RolePlayingGame/Content/Characters/Monsters/OrcBrute.xml → RolePlayingGame/Core/Content/Characters/Monsters/OrcBrute.xml

@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Orc Brute</Name>
-      <MapSprite>
-          <TextureName>Characters\Orc1IdleLeft</TextureName>
-          <FrameDimensions>208 240</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>104 185</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Barbarian</CharacterClassContentName>
-      <CharacterLevel>5</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\GiantClub</Item>
-          <Item>Armor\HideArmor</Item>
-      </InitialEquipmentContentNames>
-      <Inventory />
-      <CombatSprite>
-          <TextureName>Characters\Orc1AttackLeft</TextureName>
-          <FrameDimensions>320 212</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>170 160</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Idle</Name>
-                  <StartingFrame>37</StartingFrame>
-                  <EndingFrame>42</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>10</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Weapons\GiantClub</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Orc Brute</Name>
+      <MapSprite>
+          <TextureName>Characters\Orc1IdleLeft</TextureName>
+          <FrameDimensions>208 240</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>104 185</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Barbarian</CharacterClassContentName>
+      <CharacterLevel>5</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\GiantClub</Item>
+          <Item>Armor\HideArmor</Item>
+      </InitialEquipmentContentNames>
+      <Inventory />
+      <CombatSprite>
+          <TextureName>Characters\Orc1AttackLeft</TextureName>
+          <FrameDimensions>320 212</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>170 160</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Idle</Name>
+                  <StartingFrame>37</StartingFrame>
+                  <EndingFrame>42</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>10</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Weapons\GiantClub</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/OrcBrute.xnb → RolePlayingGame/Core/Content/Characters/Monsters/OrcBrute.xnb


+ 59 - 59
RolePlayingGame/Content/Characters/Monsters/OrcCaptain.xml → RolePlayingGame/Core/Content/Characters/Monsters/OrcCaptain.xml

@@ -1,59 +1,59 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Orc Captain</Name>
-      <MapSprite>
-          <TextureName>Characters\Orc3IdleLeft</TextureName>
-          <FrameDimensions>208 240</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>104 185</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Barbarian</CharacterClassContentName>
-      <CharacterLevel>4</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\SpikedClub</Item>
-          <Item>Armor\LeatherArmor</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\HealingPotion</ContentName>
-			  <Count>2</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Orc3AttackLeft</TextureName>
-          <FrameDimensions>320 212</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>170 160</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Idle</Name>
-                  <StartingFrame>37</StartingFrame>
-                  <EndingFrame>42</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>20</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\HealingPotion</GearName>
-              <DropPercentage>50</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MajorHealingPotion</GearName>
-              <DropPercentage>30</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\SpikedClub</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\LeatherArmor</GearName>
-              <DropPercentage>40</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Orc Captain</Name>
+      <MapSprite>
+          <TextureName>Characters\Orc3IdleLeft</TextureName>
+          <FrameDimensions>208 240</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>104 185</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Barbarian</CharacterClassContentName>
+      <CharacterLevel>4</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\SpikedClub</Item>
+          <Item>Armor\LeatherArmor</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\HealingPotion</ContentName>
+			  <Count>2</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Orc3AttackLeft</TextureName>
+          <FrameDimensions>320 212</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>170 160</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Idle</Name>
+                  <StartingFrame>37</StartingFrame>
+                  <EndingFrame>42</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>20</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\HealingPotion</GearName>
+              <DropPercentage>50</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MajorHealingPotion</GearName>
+              <DropPercentage>30</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\SpikedClub</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\LeatherArmor</GearName>
+              <DropPercentage>40</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/OrcCaptain.xnb → RolePlayingGame/Core/Content/Characters/Monsters/OrcCaptain.xnb


+ 50 - 50
RolePlayingGame/Content/Characters/Monsters/OrcGrunt.xml → RolePlayingGame/Core/Content/Characters/Monsters/OrcGrunt.xml

@@ -1,50 +1,50 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Orc Grunt</Name>
-      <MapSprite>
-          <TextureName>Characters\OrcIdleLeft</TextureName>
-          <FrameDimensions>208 240</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>104 185</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Barbarian</CharacterClassContentName>
-      <CharacterLevel>2</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\Club</Item>
-          <Item>Armor\HideArmor</Item>
-      </InitialEquipmentContentNames>
-      <Inventory />
-      <CombatSprite>
-          <TextureName>Characters\OrcAttackLeft</TextureName>
-          <FrameDimensions>320 212</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>170 160</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Idle</Name>
-                  <StartingFrame>37</StartingFrame>
-                  <EndingFrame>42</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>20</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>50</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\Club</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Orc Grunt</Name>
+      <MapSprite>
+          <TextureName>Characters\OrcIdleLeft</TextureName>
+          <FrameDimensions>208 240</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>104 185</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Barbarian</CharacterClassContentName>
+      <CharacterLevel>2</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\Club</Item>
+          <Item>Armor\HideArmor</Item>
+      </InitialEquipmentContentNames>
+      <Inventory />
+      <CombatSprite>
+          <TextureName>Characters\OrcAttackLeft</TextureName>
+          <FrameDimensions>320 212</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>170 160</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Idle</Name>
+                  <StartingFrame>37</StartingFrame>
+                  <EndingFrame>42</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>20</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>50</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\Club</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/OrcGrunt.xnb → RolePlayingGame/Core/Content/Characters/Monsters/OrcGrunt.xnb


+ 55 - 55
RolePlayingGame/Content/Characters/Monsters/OrcSoldier.xml → RolePlayingGame/Core/Content/Characters/Monsters/OrcSoldier.xml

@@ -1,55 +1,55 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Orc Soldier</Name>
-      <MapSprite>
-          <TextureName>Characters\Orc2IdleLeft</TextureName>
-          <FrameDimensions>208 240</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>104 185</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Barbarian</CharacterClassContentName>
-      <CharacterLevel>3</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\SpikedClub</Item>
-          <Item>Armor\HideArmor</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>3</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Orc2AttackLeft</TextureName>
-          <FrameDimensions>320 212</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>170 160</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Idle</Name>
-                  <StartingFrame>37</StartingFrame>
-                  <EndingFrame>42</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>20</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Items\HealingPotion</GearName>
-              <DropPercentage>50</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Weapons\SpikedClub</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\HideArmor</GearName>
-              <DropPercentage>10</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Orc Soldier</Name>
+      <MapSprite>
+          <TextureName>Characters\Orc2IdleLeft</TextureName>
+          <FrameDimensions>208 240</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>104 185</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Barbarian</CharacterClassContentName>
+      <CharacterLevel>3</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\SpikedClub</Item>
+          <Item>Armor\HideArmor</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>3</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Orc2AttackLeft</TextureName>
+          <FrameDimensions>320 212</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>170 160</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Idle</Name>
+                  <StartingFrame>37</StartingFrame>
+                  <EndingFrame>42</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>20</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Items\HealingPotion</GearName>
+              <DropPercentage>50</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Weapons\SpikedClub</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\HideArmor</GearName>
+              <DropPercentage>10</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/OrcSoldier.xnb → RolePlayingGame/Core/Content/Characters/Monsters/OrcSoldier.xnb


+ 41 - 41
RolePlayingGame/Content/Characters/Monsters/SirShire.xml → RolePlayingGame/Core/Content/Characters/Monsters/SirShire.xml

@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Sir Shire</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior3IdleLeft</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>1</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\ShortSword</Item>
-      </InitialEquipmentContentNames>
-      <Inventory />
-      <CombatSprite>
-          <TextureName>Characters\Warrior3AttackLeft</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>155 140</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Weapons\ShortSwordPlus</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MinorHealingPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Sir Shire</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior3IdleLeft</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>1</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\ShortSword</Item>
+      </InitialEquipmentContentNames>
+      <Inventory />
+      <CombatSprite>
+          <TextureName>Characters\Warrior3AttackLeft</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>155 140</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Weapons\ShortSwordPlus</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MinorHealingPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/SirShire.xnb → RolePlayingGame/Core/Content/Characters/Monsters/SirShire.xnb


+ 74 - 74
RolePlayingGame/Content/Characters/Monsters/Tamar.xml → RolePlayingGame/Core/Content/Characters/Monsters/Tamar.xml

@@ -1,74 +1,74 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Monster">
-      <Name>Tamar</Name>
-      <MapSprite>
-          <TextureName>Characters\Boss3IdleLeft</TextureName>
-          <FrameDimensions>174 216</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>87 156</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <CharacterClassContentName>Mystic</CharacterClassContentName>
-      <CharacterLevel>13</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\TamarBlade</Item>
-          <Item>Armor\TamarArmor</Item>
-          <Item>Armor\TamarHelmet</Item>
-          <Item>Armor\TamarShield</Item>
-          <Item>Armor\TamarBoots</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MajorMagicPotion</ContentName>
-			  <Count>5</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\MajorHealingPotion</ContentName>
-			  <Count>3</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Boss3AttackLeft</TextureName>
-          <FrameDimensions>288 288</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>150 245</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Walk</Name>
-                  <StartingFrame>25</StartingFrame>
-                  <EndingFrame>30</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <DefendPercentage>30</DefendPercentage>
-      <GearDrops>
-          <Item>
-              <GearName>Weapons\TamarBlade</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\TamarArmor</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\TamarHelmet</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\TamarShield</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Armor\TamarBoots</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-          <Item>
-              <GearName>Items\MajorMagicPotion</GearName>
-              <DropPercentage>100</DropPercentage>
-          </Item>
-      </GearDrops>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Monster">
+      <Name>Tamar</Name>
+      <MapSprite>
+          <TextureName>Characters\Boss3IdleLeft</TextureName>
+          <FrameDimensions>174 216</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>87 156</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <CharacterClassContentName>Mystic</CharacterClassContentName>
+      <CharacterLevel>13</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\TamarBlade</Item>
+          <Item>Armor\TamarArmor</Item>
+          <Item>Armor\TamarHelmet</Item>
+          <Item>Armor\TamarShield</Item>
+          <Item>Armor\TamarBoots</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MajorMagicPotion</ContentName>
+			  <Count>5</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\MajorHealingPotion</ContentName>
+			  <Count>3</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Boss3AttackLeft</TextureName>
+          <FrameDimensions>288 288</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>150 245</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Walk</Name>
+                  <StartingFrame>25</StartingFrame>
+                  <EndingFrame>30</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <DefendPercentage>30</DefendPercentage>
+      <GearDrops>
+          <Item>
+              <GearName>Weapons\TamarBlade</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\TamarArmor</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\TamarHelmet</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\TamarShield</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Armor\TamarBoots</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+          <Item>
+              <GearName>Items\MajorMagicPotion</GearName>
+              <DropPercentage>100</DropPercentage>
+          </Item>
+      </GearDrops>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Monsters/Tamar.xnb → RolePlayingGame/Core/Content/Characters/Monsters/Tamar.xnb


+ 42 - 42
RolePlayingGame/Content/Characters/Players/Kolatt.xml → RolePlayingGame/Core/Content/Characters/Players/Kolatt.xml

@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Player">
-      <Name>Kolatt</Name>
-      <MapSprite>
-          <TextureName>Characters\Warrior1IdleRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <WalkingSprite>
-          <TextureName>Characters\Warrior1WalkRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </WalkingSprite>
-      <MapIdleAnimationInterval>180</MapIdleAnimationInterval>
-      <CharacterClassContentName>Warrior</CharacterClassContentName>
-      <CharacterLevel>2</CharacterLevel>
-	  <InitialEquipmentContentNames>
-		  <Item>Weapons\Dagger</Item>
-		  <Item>Armor\HideArmor</Item>
-	  </InitialEquipmentContentNames>
-      <Inventory />
-      <CombatSprite>
-          <TextureName>Characters\Warrior1AttackRight</TextureName>
-          <FrameDimensions>288 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>135 135</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <Gold>10</Gold>
-      <IntroductionDialogue>Kolatt here.  Warrior extraordinaire, at your service.  May I join?</IntroductionDialogue>
-      <JoinAcceptedDialogue>You won't be disappointed!</JoinAcceptedDialogue>
-      <JoinRejectedDialogue>Let me know if you change your mind.  I'll be twiddling my thumbs over here in the meantime.</JoinRejectedDialogue>
-      <ActivePortraitTextureName>Warrior1Active</ActivePortraitTextureName>
-      <InactivePortraitTextureName>Warrior1InActive</InactivePortraitTextureName>
-      <UnselectablePortraitTextureName>Warrior1Unselectable</UnselectablePortraitTextureName>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Player">
+      <Name>Kolatt</Name>
+      <MapSprite>
+          <TextureName>Characters\Warrior1IdleRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <WalkingSprite>
+          <TextureName>Characters\Warrior1WalkRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </WalkingSprite>
+      <MapIdleAnimationInterval>180</MapIdleAnimationInterval>
+      <CharacterClassContentName>Warrior</CharacterClassContentName>
+      <CharacterLevel>2</CharacterLevel>
+	  <InitialEquipmentContentNames>
+		  <Item>Weapons\Dagger</Item>
+		  <Item>Armor\HideArmor</Item>
+	  </InitialEquipmentContentNames>
+      <Inventory />
+      <CombatSprite>
+          <TextureName>Characters\Warrior1AttackRight</TextureName>
+          <FrameDimensions>288 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>135 135</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <Gold>10</Gold>
+      <IntroductionDialogue>Kolatt here.  Warrior extraordinaire, at your service.  May I join?</IntroductionDialogue>
+      <JoinAcceptedDialogue>You won't be disappointed!</JoinAcceptedDialogue>
+      <JoinRejectedDialogue>Let me know if you change your mind.  I'll be twiddling my thumbs over here in the meantime.</JoinRejectedDialogue>
+      <ActivePortraitTextureName>Warrior1Active</ActivePortraitTextureName>
+      <InactivePortraitTextureName>Warrior1InActive</InactivePortraitTextureName>
+      <UnselectablePortraitTextureName>Warrior1Unselectable</UnselectablePortraitTextureName>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Players/Kolatt.xnb → RolePlayingGame/Core/Content/Characters/Players/Kolatt.xnb


+ 48 - 48
RolePlayingGame/Content/Characters/Players/Nykkas.xml → RolePlayingGame/Core/Content/Characters/Players/Nykkas.xml

@@ -1,48 +1,48 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Player">
-      <Name>Nykkas</Name>
-      <MapSprite>
-          <TextureName>Characters\WizardIdleRight</TextureName>
-          <FrameDimensions>128 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>64 150</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <WalkingSprite>
-          <TextureName>Characters\WizardWalkRight</TextureName>
-          <FrameDimensions>128 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>64 150</SourceOffset>
-          <Animations />
-      </WalkingSprite>
-      <MapIdleAnimationInterval>190</MapIdleAnimationInterval>
-      <CharacterClassContentName>Wizard</CharacterClassContentName>
-      <CharacterLevel>3</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\WornStaff</Item>
-          <Item>Armor\HideArmor</Item>
-          <Item>Armor\HideBoots</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorMagicPotion</ContentName>
-			  <Count>3</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\WizardAttackRight</TextureName>
-          <FrameDimensions>256 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>120 155</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <Gold>20</Gold>
-      <IntroductionDialogue>I am Nykas the Wizard, and Destroyer of Orcs!  My fame is known beyond even Mercadia! I'm in need of followers at the moment. Interested in joining the stable of a world renown Hero such as myself? The pay is quite poor, but the experience would be invaluable to you.</IntroductionDialogue>
-      <JoinAcceptedDialogue>Wonderful!  You know, my boots do need a bit of polishing.  Oh, my robe could use some dry cleaning. And don't forget to...</JoinAcceptedDialogue>
-      <JoinRejectedDialogue>Fools you are!</JoinRejectedDialogue>
-      <ActivePortraitTextureName>WizardActive</ActivePortraitTextureName>
-      <InactivePortraitTextureName>WizardInActive</InactivePortraitTextureName>
-      <UnselectablePortraitTextureName>WizardUnselectable</UnselectablePortraitTextureName>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Player">
+      <Name>Nykkas</Name>
+      <MapSprite>
+          <TextureName>Characters\WizardIdleRight</TextureName>
+          <FrameDimensions>128 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>64 150</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <WalkingSprite>
+          <TextureName>Characters\WizardWalkRight</TextureName>
+          <FrameDimensions>128 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>64 150</SourceOffset>
+          <Animations />
+      </WalkingSprite>
+      <MapIdleAnimationInterval>190</MapIdleAnimationInterval>
+      <CharacterClassContentName>Wizard</CharacterClassContentName>
+      <CharacterLevel>3</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\WornStaff</Item>
+          <Item>Armor\HideArmor</Item>
+          <Item>Armor\HideBoots</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorMagicPotion</ContentName>
+			  <Count>3</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\WizardAttackRight</TextureName>
+          <FrameDimensions>256 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>120 155</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <Gold>20</Gold>
+      <IntroductionDialogue>I am Nykas the Wizard, and Destroyer of Orcs!  My fame is known beyond even Mercadia! I'm in need of followers at the moment. Interested in joining the stable of a world renown Hero such as myself? The pay is quite poor, but the experience would be invaluable to you.</IntroductionDialogue>
+      <JoinAcceptedDialogue>Wonderful!  You know, my boots do need a bit of polishing.  Oh, my robe could use some dry cleaning. And don't forget to...</JoinAcceptedDialogue>
+      <JoinRejectedDialogue>Fools you are!</JoinRejectedDialogue>
+      <ActivePortraitTextureName>WizardActive</ActivePortraitTextureName>
+      <InactivePortraitTextureName>WizardInActive</InactivePortraitTextureName>
+      <UnselectablePortraitTextureName>WizardUnselectable</UnselectablePortraitTextureName>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Players/Nykkas.xnb → RolePlayingGame/Core/Content/Characters/Players/Nykkas.xnb


+ 63 - 63
RolePlayingGame/Content/Characters/Players/Shenidd.xml → RolePlayingGame/Core/Content/Characters/Players/Shenidd.xml

@@ -1,63 +1,63 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Player">
-      <Name>Shenidd</Name>
-      <MapSprite>
-          <TextureName>Characters\BossIdleRight</TextureName>
-          <FrameDimensions>174 216</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>87 156</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <WalkingSprite>
-          <TextureName>Characters\BossWalkRight</TextureName>
-          <FrameDimensions>174 216</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>87 156</SourceOffset>
-          <Animations />
-      </WalkingSprite>
-      <MapIdleAnimationInterval>210</MapIdleAnimationInterval>
-      <CharacterClassContentName>Barbarian</CharacterClassContentName>
-      <CharacterLevel>5</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\Club</Item>
-          <Item>Armor\HideArmor</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\HealingPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\MajorHealingPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\BossAttackRight</TextureName>
-          <FrameDimensions>288 288</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>135 240</SourceOffset>
-          <Animations>
-              <Item>
-                  <Name>Walk</Name>
-                  <StartingFrame>25</StartingFrame>
-                  <EndingFrame>30</EndingFrame>
-                  <Interval>80</Interval>
-                  <IsLoop>true</IsLoop>
-              </Item>
-          </Animations>
-      </CombatSprite>
-      <Gold>100</Gold>
-      <IntroductionDialogue>Me Shenidd, the Great!  Bow before your new leader!</IntroductionDialogue>
-      <JoinAcceptedDialogue>Good!  Now, get Shenidd MEAT!</JoinAcceptedDialogue>
-      <JoinRejectedDialogue>Shenidd should kill you!  Next time, Shenidd not be so nice...</JoinRejectedDialogue>
-      <ActivePortraitTextureName>BossActive</ActivePortraitTextureName>
-      <InactivePortraitTextureName>BossInActive</InactivePortraitTextureName>
-      <UnselectablePortraitTextureName>BossUnselectable</UnselectablePortraitTextureName>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Player">
+      <Name>Shenidd</Name>
+      <MapSprite>
+          <TextureName>Characters\BossIdleRight</TextureName>
+          <FrameDimensions>174 216</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>87 156</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <WalkingSprite>
+          <TextureName>Characters\BossWalkRight</TextureName>
+          <FrameDimensions>174 216</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>87 156</SourceOffset>
+          <Animations />
+      </WalkingSprite>
+      <MapIdleAnimationInterval>210</MapIdleAnimationInterval>
+      <CharacterClassContentName>Barbarian</CharacterClassContentName>
+      <CharacterLevel>5</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\Club</Item>
+          <Item>Armor\HideArmor</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\HealingPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\MajorHealingPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\BossAttackRight</TextureName>
+          <FrameDimensions>288 288</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>135 240</SourceOffset>
+          <Animations>
+              <Item>
+                  <Name>Walk</Name>
+                  <StartingFrame>25</StartingFrame>
+                  <EndingFrame>30</EndingFrame>
+                  <Interval>80</Interval>
+                  <IsLoop>true</IsLoop>
+              </Item>
+          </Animations>
+      </CombatSprite>
+      <Gold>100</Gold>
+      <IntroductionDialogue>Me Shenidd, the Great!  Bow before your new leader!</IntroductionDialogue>
+      <JoinAcceptedDialogue>Good!  Now, get Shenidd MEAT!</JoinAcceptedDialogue>
+      <JoinRejectedDialogue>Shenidd should kill you!  Next time, Shenidd not be so nice...</JoinRejectedDialogue>
+      <ActivePortraitTextureName>BossActive</ActivePortraitTextureName>
+      <InactivePortraitTextureName>BossInActive</InactivePortraitTextureName>
+      <UnselectablePortraitTextureName>BossUnselectable</UnselectablePortraitTextureName>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Players/Shenidd.xnb → RolePlayingGame/Core/Content/Characters/Players/Shenidd.xnb


+ 53 - 53
RolePlayingGame/Content/Characters/Players/Tyjavus.xml → RolePlayingGame/Core/Content/Characters/Players/Tyjavus.xml

@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Player">
-      <Name>Tyjavus</Name>
-      <MapSprite>
-          <TextureName>Characters\Goblin2IdleRight</TextureName>
-          <FrameDimensions>126 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>63 128</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <WalkingSprite>
-          <TextureName>Characters\Goblin2WalkRight</TextureName>
-          <FrameDimensions>126 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>63 128</SourceOffset>
-          <Animations />
-      </WalkingSprite>
-      <MapIdleAnimationInterval>160</MapIdleAnimationInterval>
-      <CharacterClassContentName>RedMage</CharacterClassContentName>
-      <CharacterLevel>7</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\MagicStaff</Item>
-          <Item>Armor\MagicRobe</Item>
-          <Item>Armor\WornMageBoots</Item>
-          <Item>Armor\WornMageHood</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\HealingPotion</ContentName>
-			  <Count>2</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\MagicPotion</ContentName>
-			  <Count>2</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\Goblin2AttackRight</TextureName>
-          <FrameDimensions>224 168</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>100 140</SourceOffset>
-          <Animations />
-      </CombatSprite>
-      <Gold>500</Gold>
-      <IntroductionDialogue>Tyjavus of Calypso.  The pleasure is mine.  If you're in need of a specialist Wizard, I won't disappoint.</IntroductionDialogue>
-      <JoinAcceptedDialogue>I am grateful.</JoinAcceptedDialogue>
-      <JoinRejectedDialogue>Perhaps another time, then.</JoinRejectedDialogue>
-      <ActivePortraitTextureName>Goblin2Active</ActivePortraitTextureName>
-      <InactivePortraitTextureName>Goblin2InActive</InactivePortraitTextureName>
-      <UnselectablePortraitTextureName>Goblin2Unselectable</UnselectablePortraitTextureName>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Player">
+      <Name>Tyjavus</Name>
+      <MapSprite>
+          <TextureName>Characters\Goblin2IdleRight</TextureName>
+          <FrameDimensions>126 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>63 128</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <WalkingSprite>
+          <TextureName>Characters\Goblin2WalkRight</TextureName>
+          <FrameDimensions>126 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>63 128</SourceOffset>
+          <Animations />
+      </WalkingSprite>
+      <MapIdleAnimationInterval>160</MapIdleAnimationInterval>
+      <CharacterClassContentName>RedMage</CharacterClassContentName>
+      <CharacterLevel>7</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\MagicStaff</Item>
+          <Item>Armor\MagicRobe</Item>
+          <Item>Armor\WornMageBoots</Item>
+          <Item>Armor\WornMageHood</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\HealingPotion</ContentName>
+			  <Count>2</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\MagicPotion</ContentName>
+			  <Count>2</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\Goblin2AttackRight</TextureName>
+          <FrameDimensions>224 168</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>100 140</SourceOffset>
+          <Animations />
+      </CombatSprite>
+      <Gold>500</Gold>
+      <IntroductionDialogue>Tyjavus of Calypso.  The pleasure is mine.  If you're in need of a specialist Wizard, I won't disappoint.</IntroductionDialogue>
+      <JoinAcceptedDialogue>I am grateful.</JoinAcceptedDialogue>
+      <JoinRejectedDialogue>Perhaps another time, then.</JoinRejectedDialogue>
+      <ActivePortraitTextureName>Goblin2Active</ActivePortraitTextureName>
+      <InactivePortraitTextureName>Goblin2InActive</InactivePortraitTextureName>
+      <UnselectablePortraitTextureName>Goblin2Unselectable</UnselectablePortraitTextureName>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Players/Tyjavus.xnb → RolePlayingGame/Core/Content/Characters/Players/Tyjavus.xnb


+ 62 - 62
RolePlayingGame/Content/Characters/Players/Vashekk.xml → RolePlayingGame/Core/Content/Characters/Players/Vashekk.xml

@@ -1,62 +1,62 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.Player">
-      <Name>Vashekk</Name>
-      <MapSprite>
-          <TextureName>Characters\WarriorIdleRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <WalkingSprite>
-          <TextureName>Characters\WarriorWalkRight</TextureName>
-          <FrameDimensions>138 192</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>69 125</SourceOffset>
-          <Animations />
-      </WalkingSprite>
-      <MapIdleAnimationInterval>165</MapIdleAnimationInterval>
-      <CharacterClassContentName>Paladin</CharacterClassContentName>
-      <CharacterLevel>6</CharacterLevel>
-      <InitialEquipmentContentNames>
-          <Item>Weapons\LongSword</Item>
-          <Item>Armor\ChainMail</Item>
-          <Item>Armor\LeatherShield</Item>
-          <Item>Armor\ChainBoots</Item>
-          <Item>Armor\LeatherBoots</Item>
-      </InitialEquipmentContentNames>
-      <Inventory>
-		  <Item>
-			  <ContentName>Items\MinorHealingPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\HealingPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\MinorMagicPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-		  <Item>
-			  <ContentName>Items\MagicPotion</ContentName>
-			  <Count>1</Count>
-		  </Item>
-      </Inventory>
-      <CombatSprite>
-          <TextureName>Characters\WarriorAttackRight</TextureName>
-		  <FrameDimensions>288 192</FrameDimensions>
-		  <FramesPerRow>6</FramesPerRow>
-		  <SourceOffset>135 135</SourceOffset>
-		  <Animations />
-      </CombatSprite>
-      <Gold>10</Gold>
-      <IntroductionDialogue>I am Vashekk, Defender of the Royal Kingdom of Mercadia.  I wish to aid you in your virtuous quest to vanquish the Evil Tamar!</IntroductionDialogue>
-      <JoinAcceptedDialogue>Thank you, my brave comrade.  I shall be your shield!</JoinAcceptedDialogue>
-      <JoinRejectedDialogue>I shall remain here until you have changed your mind.</JoinRejectedDialogue>
-      <ActivePortraitTextureName>WarriorActive</ActivePortraitTextureName>
-      <InactivePortraitTextureName>WarriorInActive</InactivePortraitTextureName>
-      <UnselectablePortraitTextureName>WarriorUnselectable</UnselectablePortraitTextureName>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.Player">
+      <Name>Vashekk</Name>
+      <MapSprite>
+          <TextureName>Characters\WarriorIdleRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <WalkingSprite>
+          <TextureName>Characters\WarriorWalkRight</TextureName>
+          <FrameDimensions>138 192</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>69 125</SourceOffset>
+          <Animations />
+      </WalkingSprite>
+      <MapIdleAnimationInterval>165</MapIdleAnimationInterval>
+      <CharacterClassContentName>Paladin</CharacterClassContentName>
+      <CharacterLevel>6</CharacterLevel>
+      <InitialEquipmentContentNames>
+          <Item>Weapons\LongSword</Item>
+          <Item>Armor\ChainMail</Item>
+          <Item>Armor\LeatherShield</Item>
+          <Item>Armor\ChainBoots</Item>
+          <Item>Armor\LeatherBoots</Item>
+      </InitialEquipmentContentNames>
+      <Inventory>
+		  <Item>
+			  <ContentName>Items\MinorHealingPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\HealingPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\MinorMagicPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+		  <Item>
+			  <ContentName>Items\MagicPotion</ContentName>
+			  <Count>1</Count>
+		  </Item>
+      </Inventory>
+      <CombatSprite>
+          <TextureName>Characters\WarriorAttackRight</TextureName>
+		  <FrameDimensions>288 192</FrameDimensions>
+		  <FramesPerRow>6</FramesPerRow>
+		  <SourceOffset>135 135</SourceOffset>
+		  <Animations />
+      </CombatSprite>
+      <Gold>10</Gold>
+      <IntroductionDialogue>I am Vashekk, Defender of the Royal Kingdom of Mercadia.  I wish to aid you in your virtuous quest to vanquish the Evil Tamar!</IntroductionDialogue>
+      <JoinAcceptedDialogue>Thank you, my brave comrade.  I shall be your shield!</JoinAcceptedDialogue>
+      <JoinRejectedDialogue>I shall remain here until you have changed your mind.</JoinRejectedDialogue>
+      <ActivePortraitTextureName>WarriorActive</ActivePortraitTextureName>
+      <InactivePortraitTextureName>WarriorInActive</InactivePortraitTextureName>
+      <UnselectablePortraitTextureName>WarriorUnselectable</UnselectablePortraitTextureName>
+  </Asset>
+</XnaContent>

+ 0 - 0
RolePlayingGame/Content/Characters/Players/Vashekk.xnb → RolePlayingGame/Core/Content/Characters/Players/Vashekk.xnb


+ 15 - 15
RolePlayingGame/Content/Characters/QuestNPCs/Ayttas.xml → RolePlayingGame/Core/Content/Characters/QuestNPCs/Ayttas.xml

@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<XnaContent>
-  <Asset Type="RolePlayingGameData.QuestNpc">
-      <Name>Ayttas</Name>
-      <MapSprite>
-          <TextureName>Characters\Villager2IdleRight</TextureName>
-          <FrameDimensions>92 120</FrameDimensions>
-          <FramesPerRow>6</FramesPerRow>
-          <SourceOffset>46 89</SourceOffset>
-          <Animations />
-      </MapSprite>
-      <MapIdleAnimationInterval>150</MapIdleAnimationInterval>
-      <IntroductionDialogue>Welcome to Apple Village!  Unfortunately, we're not in the best of shape right now because of these monstrosities.  But enjoy your stay anyway!  What choice is there, after all?</IntroductionDialogue>
-  </Asset>
-</XnaContent>
+<?xml version="1.0" encoding="utf-8" ?>
+<XnaContent>
+  <Asset Type="RolePlayingGameData.QuestNpc">
+      <Name>Ayttas</Name>
+      <MapSprite>
+          <TextureName>Characters\Villager2IdleRight</TextureName>
+          <FrameDimensions>92 120</FrameDimensions>
+          <FramesPerRow>6</FramesPerRow>
+          <SourceOffset>46 89</SourceOffset>
+          <Animations />
+      </MapSprite>
+      <MapIdleAnimationInterval>150</MapIdleAnimationInterval>
+      <IntroductionDialogue>Welcome to Apple Village!  Unfortunately, we're not in the best of shape right now because of these monstrosities.  But enjoy your stay anyway!  What choice is there, after all?</IntroductionDialogue>
+  </Asset>
+</XnaContent>

Some files were not shown because too many files changed in this diff