-
-
Save ScottLilly/4a0c6ed8e55b89bbd789 to your computer and use it in GitHub Desktop.
Lesson 19.5 - Changing dropdown default values
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System.Xml; | |
namespace Engine | |
{ | |
public class Player : LivingCreature | |
{ | |
public int Gold { get; set; } | |
public int ExperiencePoints { get; set; } | |
public int Level | |
{ | |
get { return ((ExperiencePoints / 100) + 1); } | |
} | |
public Location CurrentLocation { get; set; } | |
public Weapon CurrentWeapon { get; set; } | |
public List<InventoryItem> Inventory { get; set; } | |
public List<PlayerQuest> Quests { get; set; } | |
private Player(int currentHitPoints, int maximumHitPoints, int gold, int experiencePoints) : base(currentHitPoints, maximumHitPoints) | |
{ | |
Gold = gold; | |
ExperiencePoints = experiencePoints; | |
Inventory = new List<InventoryItem>(); | |
Quests = new List<PlayerQuest>(); | |
} | |
public static Player CreateDefaultPlayer() | |
{ | |
Player player = new Player(10, 10, 20, 0); | |
player.Inventory.Add(new InventoryItem(World.ItemByID(World.ITEM_ID_RUSTY_SWORD), 1)); | |
player.CurrentLocation = World.LocationByID(World.LOCATION_ID_HOME); | |
return player; | |
} | |
public static Player CreatePlayerFromXmlString(string xmlPlayerData) | |
{ | |
try | |
{ | |
XmlDocument playerData = new XmlDocument(); | |
playerData.LoadXml(xmlPlayerData); | |
int currentHitPoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentHitPoints").InnerText); | |
int maximumHitPoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/MaximumHitPoints").InnerText); | |
int gold = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/Gold").InnerText); | |
int experiencePoints = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/ExperiencePoints").InnerText); | |
Player player = new Player(currentHitPoints, maximumHitPoints, gold, experiencePoints); | |
int currentLocationID = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentLocation").InnerText); | |
player.CurrentLocation = World.LocationByID(currentLocationID); | |
if(playerData.SelectSingleNode("/Player/Stats/CurrentWeapon") != null) | |
{ | |
int currentWeaponID = Convert.ToInt32(playerData.SelectSingleNode("/Player/Stats/CurrentWeapon").InnerText); | |
player.CurrentWeapon = (Weapon)World.ItemByID(currentWeaponID); | |
} | |
foreach(XmlNode node in playerData.SelectNodes("/Player/InventoryItems/InventoryItem")) | |
{ | |
int id = Convert.ToInt32(node.Attributes["ID"].Value); | |
int quantity = Convert.ToInt32(node.Attributes["Quantity"].Value); | |
for(int i = 0; i < quantity; i++) | |
{ | |
player.AddItemToInventory(World.ItemByID(id)); | |
} | |
} | |
foreach(XmlNode node in playerData.SelectNodes("/Player/PlayerQuests/PlayerQuest")) | |
{ | |
int id = Convert.ToInt32(node.Attributes["ID"].Value); | |
bool isCompleted = Convert.ToBoolean(node.Attributes["IsCompleted"].Value); | |
PlayerQuest playerQuest = new PlayerQuest(World.QuestByID(id)); | |
playerQuest.IsCompleted = isCompleted; | |
player.Quests.Add(playerQuest); | |
} | |
return player; | |
} | |
catch | |
{ | |
// If there was an error with the XML data, return a default player object | |
return Player.CreateDefaultPlayer(); | |
} | |
} | |
public bool HasRequiredItemToEnterThisLocation(Location location) | |
{ | |
if(location.ItemRequiredToEnter == null) | |
{ | |
// There is no required item for this location, so return "true" | |
return true; | |
} | |
// See if the player has the required item in their inventory | |
return Inventory.Exists(ii => ii.Details.ID == location.ItemRequiredToEnter.ID); | |
} | |
public bool HasThisQuest(Quest quest) | |
{ | |
return Quests.Exists(pq => pq.Details.ID == quest.ID); | |
} | |
public bool CompletedThisQuest(Quest quest) | |
{ | |
foreach(PlayerQuest playerQuest in Quests) | |
{ | |
if(playerQuest.Details.ID == quest.ID) | |
{ | |
return playerQuest.IsCompleted; | |
} | |
} | |
return false; | |
} | |
public bool HasAllQuestCompletionItems(Quest quest) | |
{ | |
// See if the player has all the items needed to complete the quest here | |
foreach(QuestCompletionItem qci in quest.QuestCompletionItems) | |
{ | |
// Check each item in the player's inventory, to see if they have it, and enough of it | |
if(!Inventory.Exists(ii => ii.Details.ID == qci.Details.ID && ii.Quantity >= qci.Quantity)) | |
{ | |
return false; | |
} | |
} | |
// If we got here, then the player must have all the required items, and enough of them, to complete the quest. | |
return true; | |
} | |
public void RemoveQuestCompletionItems(Quest quest) | |
{ | |
foreach(QuestCompletionItem qci in quest.QuestCompletionItems) | |
{ | |
InventoryItem item = Inventory.SingleOrDefault(ii => ii.Details.ID == qci.Details.ID); | |
if(item != null) | |
{ | |
// Subtract the quantity from the player's inventory that was needed to complete the quest | |
item.Quantity -= qci.Quantity; | |
} | |
} | |
} | |
public void AddItemToInventory(Item itemToAdd) | |
{ | |
InventoryItem item = Inventory.SingleOrDefault(ii => ii.Details.ID == itemToAdd.ID); | |
if(item == null) | |
{ | |
// They didn't have the item, so add it to their inventory, with a quantity of 1 | |
Inventory.Add(new InventoryItem(itemToAdd, 1)); | |
} | |
else | |
{ | |
// They have the item in their inventory, so increase the quantity by one | |
item.Quantity++; | |
} | |
} | |
public void MarkQuestCompleted(Quest quest) | |
{ | |
// Find the quest in the player's quest list | |
PlayerQuest playerQuest = Quests.SingleOrDefault(pq => pq.Details.ID == quest.ID); | |
if(playerQuest != null) | |
{ | |
playerQuest.IsCompleted = true; | |
} | |
} | |
public string ToXmlString() | |
{ | |
XmlDocument playerData = new XmlDocument(); | |
// Create the top-level XML node | |
XmlNode player = playerData.CreateElement("Player"); | |
playerData.AppendChild(player); | |
// Create the "Stats" child node to hold the other player statistics nodes | |
XmlNode stats = playerData.CreateElement("Stats"); | |
player.AppendChild(stats); | |
// Create the child nodes for the "Stats" node | |
XmlNode currentHitPoints = playerData.CreateElement("CurrentHitPoints"); | |
currentHitPoints.AppendChild(playerData.CreateTextNode(this.CurrentHitPoints.ToString())); | |
stats.AppendChild(currentHitPoints); | |
XmlNode maximumHitPoints = playerData.CreateElement("MaximumHitPoints"); | |
maximumHitPoints.AppendChild(playerData.CreateTextNode(this.MaximumHitPoints.ToString())); | |
stats.AppendChild(maximumHitPoints); | |
XmlNode gold = playerData.CreateElement("Gold"); | |
gold.AppendChild(playerData.CreateTextNode(this.Gold.ToString())); | |
stats.AppendChild(gold); | |
XmlNode experiencePoints = playerData.CreateElement("ExperiencePoints"); | |
experiencePoints.AppendChild(playerData.CreateTextNode(this.ExperiencePoints.ToString())); | |
stats.AppendChild(experiencePoints); | |
XmlNode currentLocation = playerData.CreateElement("CurrentLocation"); | |
currentLocation.AppendChild(playerData.CreateTextNode(this.CurrentLocation.ID.ToString())); | |
stats.AppendChild(currentLocation); | |
if(CurrentWeapon != null) | |
{ | |
XmlNode currentWeapon = playerData.CreateElement("CurrentWeapon"); | |
currentWeapon.AppendChild(playerData.CreateTextNode(this.CurrentWeapon.ID.ToString())); | |
stats.AppendChild(currentWeapon); | |
} | |
// Create the "InventoryItems" child node to hold each InventoryItem node | |
XmlNode inventoryItems = playerData.CreateElement("InventoryItems"); | |
player.AppendChild(inventoryItems); | |
// Create an "InventoryItem" node for each item in the player's inventory | |
foreach(InventoryItem item in this.Inventory) | |
{ | |
XmlNode inventoryItem = playerData.CreateElement("InventoryItem"); | |
XmlAttribute idAttribute = playerData.CreateAttribute("ID"); | |
idAttribute.Value = item.Details.ID.ToString(); | |
inventoryItem.Attributes.Append(idAttribute); | |
XmlAttribute quantityAttribute = playerData.CreateAttribute("Quantity"); | |
quantityAttribute.Value = item.Quantity.ToString(); | |
inventoryItem.Attributes.Append(quantityAttribute); | |
inventoryItems.AppendChild(inventoryItem); | |
} | |
// Create the "PlayerQuests" child node to hold each PlayerQuest node | |
XmlNode playerQuests = playerData.CreateElement("PlayerQuests"); | |
player.AppendChild(playerQuests); | |
// Create a "PlayerQuest" node for each quest the player has acquired | |
foreach(PlayerQuest quest in this.Quests) | |
{ | |
XmlNode playerQuest = playerData.CreateElement("PlayerQuest"); | |
XmlAttribute idAttribute = playerData.CreateAttribute("ID"); | |
idAttribute.Value = quest.Details.ID.ToString(); | |
playerQuest.Attributes.Append(idAttribute); | |
XmlAttribute isCompletedAttribute = playerData.CreateAttribute("IsCompleted"); | |
isCompletedAttribute.Value = quest.IsCompleted.ToString(); | |
playerQuest.Attributes.Append(isCompletedAttribute); | |
playerQuests.AppendChild(playerQuest); | |
} | |
return playerData.InnerXml; // The XML document, as a string, so we can save the data to disk | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.ComponentModel; | |
using System.Data; | |
using System.Drawing; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System.Windows.Forms; | |
using System.IO; | |
using Engine; | |
namespace SuperAdventure | |
{ | |
public partial class SuperAdventure : Form | |
{ | |
private const string PLAYER_DATA_FILE_NAME = "PlayerData.xml"; | |
private Player _player; | |
private Monster _currentMonster; | |
public SuperAdventure() | |
{ | |
InitializeComponent(); | |
if(File.Exists(PLAYER_DATA_FILE_NAME)) | |
{ | |
_player = Player.CreatePlayerFromXmlString(File.ReadAllText(PLAYER_DATA_FILE_NAME)); | |
} | |
else | |
{ | |
_player = Player.CreateDefaultPlayer(); | |
} | |
MoveTo(_player.CurrentLocation); | |
UpdatePlayerStats(); | |
} | |
private void btnNorth_Click(object sender, EventArgs e) | |
{ | |
MoveTo(_player.CurrentLocation.LocationToNorth); | |
} | |
private void btnEast_Click(object sender, EventArgs e) | |
{ | |
MoveTo(_player.CurrentLocation.LocationToEast); | |
} | |
private void btnSouth_Click(object sender, EventArgs e) | |
{ | |
MoveTo(_player.CurrentLocation.LocationToSouth); | |
} | |
private void btnWest_Click(object sender, EventArgs e) | |
{ | |
MoveTo(_player.CurrentLocation.LocationToWest); | |
} | |
private void MoveTo(Location newLocation) | |
{ | |
//Does the location have any required items | |
if(!_player.HasRequiredItemToEnterThisLocation(newLocation)) | |
{ | |
rtbMessages.Text += "You must have a " + newLocation.ItemRequiredToEnter.Name + " to enter this location." + Environment.NewLine; | |
return; | |
} | |
// Update the player's current location | |
_player.CurrentLocation = newLocation; | |
// Show/hide available movement buttons | |
btnNorth.Visible = (newLocation.LocationToNorth != null); | |
btnEast.Visible = (newLocation.LocationToEast != null); | |
btnSouth.Visible = (newLocation.LocationToSouth != null); | |
btnWest.Visible = (newLocation.LocationToWest != null); | |
// Display current location name and description | |
rtbLocation.Text = newLocation.Name + Environment.NewLine; | |
rtbLocation.Text += newLocation.Description + Environment.NewLine; | |
// Completely heal the player | |
_player.CurrentHitPoints = _player.MaximumHitPoints; | |
// Update Hit Points in UI | |
lblHitPoints.Text = _player.CurrentHitPoints.ToString(); | |
// Does the location have a quest? | |
if(newLocation.QuestAvailableHere != null) | |
{ | |
// See if the player already has the quest, and if they've completed it | |
bool playerAlreadyHasQuest = _player.HasThisQuest(newLocation.QuestAvailableHere); | |
bool playerAlreadyCompletedQuest = _player.CompletedThisQuest(newLocation.QuestAvailableHere); | |
// See if the player already has the quest | |
if(playerAlreadyHasQuest) | |
{ | |
// If the player has not completed the quest yet | |
if(!playerAlreadyCompletedQuest) | |
{ | |
// See if the player has all the items needed to complete the quest | |
bool playerHasAllItemsToCompleteQuest = _player.HasAllQuestCompletionItems(newLocation.QuestAvailableHere); | |
// The player has all items required to complete the quest | |
if(playerHasAllItemsToCompleteQuest) | |
{ | |
// Display message | |
rtbMessages.Text += Environment.NewLine; | |
rtbMessages.Text += "You complete the '" + newLocation.QuestAvailableHere.Name + "' quest." + Environment.NewLine; | |
// Remove quest items from inventory | |
_player.RemoveQuestCompletionItems(newLocation.QuestAvailableHere); | |
// Give quest rewards | |
rtbMessages.Text += "You receive: " + Environment.NewLine; | |
rtbMessages.Text += newLocation.QuestAvailableHere.RewardExperiencePoints.ToString() + " experience points" + Environment.NewLine; | |
rtbMessages.Text += newLocation.QuestAvailableHere.RewardGold.ToString() + " gold" + Environment.NewLine; | |
rtbMessages.Text += newLocation.QuestAvailableHere.RewardItem.Name + Environment.NewLine; | |
rtbMessages.Text += Environment.NewLine; | |
_player.ExperiencePoints += newLocation.QuestAvailableHere.RewardExperiencePoints; | |
_player.Gold += newLocation.QuestAvailableHere.RewardGold; | |
// Add the reward item to the player's inventory | |
_player.AddItemToInventory(newLocation.QuestAvailableHere.RewardItem); | |
// Mark the quest as completed | |
_player.MarkQuestCompleted(newLocation.QuestAvailableHere); | |
} | |
} | |
} | |
else | |
{ | |
// The player does not already have the quest | |
// Display the messages | |
rtbMessages.Text += "You receive the " + newLocation.QuestAvailableHere.Name + " quest." + Environment.NewLine; | |
rtbMessages.Text += newLocation.QuestAvailableHere.Description + Environment.NewLine; | |
rtbMessages.Text += "To complete it, return with:" + Environment.NewLine; | |
foreach(QuestCompletionItem qci in newLocation.QuestAvailableHere.QuestCompletionItems) | |
{ | |
if(qci.Quantity == 1) | |
{ | |
rtbMessages.Text += qci.Quantity.ToString() + " " + qci.Details.Name + Environment.NewLine; | |
} | |
else | |
{ | |
rtbMessages.Text += qci.Quantity.ToString() + " " + qci.Details.NamePlural + Environment.NewLine; | |
} | |
} | |
rtbMessages.Text += Environment.NewLine; | |
// Add the quest to the player's quest list | |
_player.Quests.Add(new PlayerQuest(newLocation.QuestAvailableHere)); | |
} | |
} | |
// Does the location have a monster? | |
if(newLocation.MonsterLivingHere != null) | |
{ | |
rtbMessages.Text += "You see a " + newLocation.MonsterLivingHere.Name + Environment.NewLine; | |
// Make a new monster, using the values from the standard monster in the World.Monster list | |
Monster standardMonster = World.MonsterByID(newLocation.MonsterLivingHere.ID); | |
_currentMonster = new Monster(standardMonster.ID, standardMonster.Name, standardMonster.MaximumDamage, | |
standardMonster.RewardExperiencePoints, standardMonster.RewardGold, standardMonster.CurrentHitPoints, standardMonster.MaximumHitPoints); | |
foreach(LootItem lootItem in standardMonster.LootTable) | |
{ | |
_currentMonster.LootTable.Add(lootItem); | |
} | |
cboWeapons.Visible = true; | |
cboPotions.Visible = true; | |
btnUseWeapon.Visible = true; | |
btnUsePotion.Visible = true; | |
} | |
else | |
{ | |
_currentMonster = null; | |
cboWeapons.Visible = false; | |
cboPotions.Visible = false; | |
btnUseWeapon.Visible = false; | |
btnUsePotion.Visible = false; | |
} | |
// Refresh player's stats | |
UpdatePlayerStats(); | |
// Refresh player's inventory list | |
UpdateInventoryListInUI(); | |
// Refresh player's quest list | |
UpdateQuestListInUI(); | |
// Refresh player's weapons combobox | |
UpdateWeaponListInUI(); | |
// Refresh player's potions combobox | |
UpdatePotionListInUI(); | |
ScrollToBottomOfMessages(); | |
} | |
private void UpdatePlayerStats() | |
{ | |
// Refresh player information and inventory controls | |
lblHitPoints.Text = _player.CurrentHitPoints.ToString(); | |
lblGold.Text = _player.Gold.ToString(); | |
lblExperience.Text = _player.ExperiencePoints.ToString(); | |
lblLevel.Text = _player.Level.ToString(); | |
} | |
private void UpdateInventoryListInUI() | |
{ | |
dgvInventory.RowHeadersVisible = false; | |
dgvInventory.ColumnCount = 2; | |
dgvInventory.Columns[0].Name = "Name"; | |
dgvInventory.Columns[0].Width = 197; | |
dgvInventory.Columns[1].Name = "Quantity"; | |
dgvInventory.Rows.Clear(); | |
foreach(InventoryItem inventoryItem in _player.Inventory) | |
{ | |
if(inventoryItem.Quantity > 0) | |
{ | |
dgvInventory.Rows.Add(new[] { inventoryItem.Details.Name, inventoryItem.Quantity.ToString() }); | |
} | |
} | |
} | |
private void UpdateQuestListInUI() | |
{ | |
dgvQuests.RowHeadersVisible = false; | |
dgvQuests.ColumnCount = 2; | |
dgvQuests.Columns[0].Name = "Name"; | |
dgvQuests.Columns[0].Width = 197; | |
dgvQuests.Columns[1].Name = "Done?"; | |
dgvQuests.Rows.Clear(); | |
foreach(PlayerQuest playerQuest in _player.Quests) | |
{ | |
dgvQuests.Rows.Add(new[] { playerQuest.Details.Name, playerQuest.IsCompleted.ToString() }); | |
} | |
} | |
private void UpdateWeaponListInUI() | |
{ | |
List<Weapon> weapons = new List<Weapon>(); | |
foreach(InventoryItem inventoryItem in _player.Inventory) | |
{ | |
if(inventoryItem.Details is Weapon) | |
{ | |
if(inventoryItem.Quantity > 0) | |
{ | |
weapons.Add((Weapon)inventoryItem.Details); | |
} | |
} | |
} | |
if(weapons.Count == 0) | |
{ | |
// The player doesn't have any weapons, so hide the weapon combobox and "Use" button | |
cboWeapons.Visible = false; | |
btnUseWeapon.Visible = false; | |
} | |
else | |
{ | |
cboWeapons.SelectedIndexChanged -= cboWeapons_SelectedIndexChanged; | |
cboWeapons.DataSource = weapons; | |
cboWeapons.SelectedIndexChanged += cboWeapons_SelectedIndexChanged; | |
cboWeapons.DisplayMember = "Name"; | |
cboWeapons.ValueMember = "ID"; | |
if(_player.CurrentWeapon != null) | |
{ | |
cboWeapons.SelectedItem = _player.CurrentWeapon; | |
} | |
else | |
{ | |
cboWeapons.SelectedIndex = 0; | |
} | |
} | |
} | |
private void UpdatePotionListInUI() | |
{ | |
List<HealingPotion> healingPotions = new List<HealingPotion>(); | |
foreach(InventoryItem inventoryItem in _player.Inventory) | |
{ | |
if(inventoryItem.Details is HealingPotion) | |
{ | |
if(inventoryItem.Quantity > 0) | |
{ | |
healingPotions.Add((HealingPotion)inventoryItem.Details); | |
} | |
} | |
} | |
if(healingPotions.Count == 0) | |
{ | |
// The player doesn't have any potions, so hide the potion combobox and "Use" button | |
cboPotions.Visible = false; | |
btnUsePotion.Visible = false; | |
} | |
else | |
{ | |
cboPotions.DataSource = healingPotions; | |
cboPotions.DisplayMember = "Name"; | |
cboPotions.ValueMember = "ID"; | |
cboPotions.SelectedIndex = 0; | |
} | |
} | |
private void btnUseWeapon_Click(object sender, EventArgs e) | |
{ | |
// Get the currently selected weapon from the cboWeapons ComboBox | |
Weapon currentWeapon = (Weapon)cboWeapons.SelectedItem; | |
// Determine the amount of damage to do to the monster | |
int damageToMonster = RandomNumberGenerator.NumberBetween(currentWeapon.MinimumDamage, currentWeapon.MaximumDamage); | |
// Apply the damage to the monster's CurrentHitPoints | |
_currentMonster.CurrentHitPoints -= damageToMonster; | |
// Display message | |
rtbMessages.Text += "You hit the " + _currentMonster.Name + " for " + damageToMonster.ToString() + " points." + Environment.NewLine; | |
// Check if the monster is dead | |
if(_currentMonster.CurrentHitPoints <= 0) | |
{ | |
// Monster is dead | |
rtbMessages.Text += Environment.NewLine; | |
rtbMessages.Text += "You defeated the " + _currentMonster.Name + Environment.NewLine; | |
// Give player experience points for killing the monster | |
_player.ExperiencePoints += _currentMonster.RewardExperiencePoints; | |
rtbMessages.Text += "You receive " + _currentMonster.RewardExperiencePoints.ToString() + " experience points" + Environment.NewLine; | |
// Give player gold for killing the monster | |
_player.Gold += _currentMonster.RewardGold; | |
rtbMessages.Text += "You receive " + _currentMonster.RewardGold.ToString() + " gold" + Environment.NewLine; | |
// Get random loot items from the monster | |
List<InventoryItem> lootedItems = new List<InventoryItem>(); | |
// Add items to the lootedItems list, comparing a random number to the drop percentage | |
foreach(LootItem lootItem in _currentMonster.LootTable) | |
{ | |
if(RandomNumberGenerator.NumberBetween(1, 100) <= lootItem.DropPercentage) | |
{ | |
lootedItems.Add(new InventoryItem(lootItem.Details, 1)); | |
} | |
} | |
// If no items were randomly selected, then add the default loot item(s). | |
if(lootedItems.Count == 0) | |
{ | |
foreach(LootItem lootItem in _currentMonster.LootTable) | |
{ | |
if(lootItem.IsDefaultItem) | |
{ | |
lootedItems.Add(new InventoryItem(lootItem.Details, 1)); | |
} | |
} | |
} | |
// Add the looted items to the player's inventory | |
foreach(InventoryItem inventoryItem in lootedItems) | |
{ | |
_player.AddItemToInventory(inventoryItem.Details); | |
if(inventoryItem.Quantity == 1) | |
{ | |
rtbMessages.Text += "You loot " + inventoryItem.Quantity.ToString() + " " + inventoryItem.Details.Name +Environment.NewLine; | |
} | |
else | |
{ | |
rtbMessages.Text += "You loot " + inventoryItem.Quantity.ToString() + " " + inventoryItem.Details.NamePlural + Environment.NewLine; | |
} | |
} | |
UpdatePlayerStats(); | |
UpdateInventoryListInUI(); | |
UpdateWeaponListInUI(); | |
UpdatePotionListInUI(); | |
// Add a blank line to the messages box, just for appearance. | |
rtbMessages.Text += Environment.NewLine; | |
// Move player to current location (to heal player and create a new monster to fight) | |
MoveTo(_player.CurrentLocation); | |
} | |
else | |
{ | |
// Monster is still alive | |
// Determine the amount of damage the monster does to the player | |
int damageToPlayer = RandomNumberGenerator.NumberBetween(0, _currentMonster.MaximumDamage); | |
// Display message | |
rtbMessages.Text += "The " + _currentMonster.Name + " did " + damageToPlayer.ToString() + " points of damage." + Environment.NewLine; | |
// Subtract damage from player | |
_player.CurrentHitPoints -= damageToPlayer; | |
// Refresh player data in UI | |
lblHitPoints.Text = _player.CurrentHitPoints.ToString(); | |
if(_player.CurrentHitPoints <= 0) | |
{ | |
// Display message | |
rtbMessages.Text += "The " + _currentMonster.Name + " killed you." + Environment.NewLine; | |
// Move player to "Home" | |
MoveTo(World.LocationByID(World.LOCATION_ID_HOME)); | |
} | |
} | |
ScrollToBottomOfMessages(); | |
} | |
private void btnUsePotion_Click(object sender, EventArgs e) | |
{ | |
// Get the currently selected potion from the combobox | |
HealingPotion potion = (HealingPotion)cboPotions.SelectedItem; | |
// Add healing amount to the player's current hit points | |
_player.CurrentHitPoints = (_player.CurrentHitPoints + potion.AmountToHeal); | |
// CurrentHitPoints cannot exceed player's MaximumHitPoints | |
if(_player.CurrentHitPoints > _player.MaximumHitPoints) | |
{ | |
_player.CurrentHitPoints = _player.MaximumHitPoints; | |
} | |
// Remove the potion from the player's inventory | |
foreach(InventoryItem ii in _player.Inventory) | |
{ | |
if(ii.Details.ID == potion.ID) | |
{ | |
ii.Quantity--; | |
break; | |
} | |
} | |
// Display message | |
rtbMessages.Text += "You drink a " + potion.Name + Environment.NewLine; | |
// Monster gets their turn to attack | |
// Determine the amount of damage the monster does to the player | |
int damageToPlayer = RandomNumberGenerator.NumberBetween(0, _currentMonster.MaximumDamage); | |
// Display message | |
rtbMessages.Text += "The " + _currentMonster.Name + " did " + damageToPlayer.ToString() + " points of damage." + Environment.NewLine; | |
// Subtract damage from player | |
_player.CurrentHitPoints -= damageToPlayer; | |
if(_player.CurrentHitPoints <= 0) | |
{ | |
// Display message | |
rtbMessages.Text += "The " + _currentMonster.Name + " killed you." + Environment.NewLine; | |
// Move player to "Home" | |
MoveTo(World.LocationByID(World.LOCATION_ID_HOME)); | |
} | |
// Refresh player data in UI | |
lblHitPoints.Text = _player.CurrentHitPoints.ToString(); | |
UpdateInventoryListInUI(); | |
UpdatePotionListInUI(); | |
ScrollToBottomOfMessages(); | |
} | |
private void ScrollToBottomOfMessages() | |
{ | |
rtbMessages.SelectionStart = rtbMessages.Text.Length; | |
rtbMessages.ScrollToCaret(); | |
} | |
private void SuperAdventure_FormClosing(object sender, FormClosingEventArgs e) | |
{ | |
File.WriteAllText(PLAYER_DATA_FILE_NAME, _player.ToXmlString()); | |
} | |
private void cboWeapons_SelectedIndexChanged(object sender, EventArgs e) | |
{ | |
_player.CurrentWeapon = (Weapon)cboWeapons.SelectedItem; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment