private void EquipWeapon(IEquippableItem itemToEquip) { EquippedUtility?.ItemPrefab.SetActive(false); EquippedWeapon?.ItemPrefab.SetActive(false); EquippedWeapon = itemToEquip; EquippedWeapon.ItemPrefab.SetActive(true); }
public void CalculateCombatStats() { //Get defaults from class armourClass = ArmourClass(); damageBase = DamageBase(); damageModifier = DamageModifier(); hitModifier = HitModifier(); speed = BaseSpeed(); //Check equipped items - unlikely to be implemented foreach (Item item in Inventory.Items) { if (!item.IsEquipped) { continue; } IEquippableItem equipItem = item as IEquippableItem; //Error if non-equippable item is equipped if (equipItem == null) { LogFile.Log.LogEntry("Item " + item.SingleItemDescription + " is non-equippable but is equipped!"); //Just skip continue; } armourClass += equipItem.ArmourClassModifier(); damageModifier += equipItem.DamageModifier(); hitModifier += equipItem.HitModifier(); if (equipItem.DamageBase() > damageBase) { damageBase = equipItem.DamageBase(); } } //Check effects ApplyEffects(); }
/// <summary> /// Stun grenade - goes through walls /// Should sync with above method /// </summary> /// <param name="item"></param> /// <param name="target"></param> /// <returns></returns> public static Point ThrowItemGrenadeLikeStun(IEquippableItem item, Point target, double size, int damage) { Item itemAsItem = item as Item; LogFile.Log.LogEntryDebug("Throwing " + itemAsItem.SingleItemDescription, LogDebugLevel.Medium); Player player = Game.Dungeon.Player; //Find target List<Point> targetSquares = Game.Dungeon.CalculateTrajectory(target); Monster monster = Game.Dungeon.FirstMonsterInTrajectory(targetSquares); //Find where it landed //Destination will be the last square in trajectory Point destination; if (targetSquares.Count > 0) destination = targetSquares[targetSquares.Count - 1]; else //Threw it on themselves! destination = player.LocationMap; //Stopped by a monster if (monster != null) { destination = monster.LocationMap; } //Make throwing sound AT target location Game.Dungeon.AddSoundEffect(item.ThrowSoundMagnitude(), Game.Dungeon.Player.LocationLevel, destination); //Work out grenade splash and damage List<Point> grenadeAffects = Game.Dungeon.GetPointsForGrenadeTemplate(destination, Game.Dungeon.Player.LocationLevel, size); //Draw attack Screen.Instance.DrawAreaAttackAnimation(grenadeAffects, ColorPresets.DodgerBlue); //Attack all monsters in the area foreach (Point sq in grenadeAffects) { SquareContents squareContents = Game.Dungeon.MapSquareContents(player.LocationLevel, sq); Monster m = squareContents.monster; //Hit the monster if it's there if (m != null) { string combatResultsMsg = "PvM (" + m.Representation + ") Grenade: Stun: " + damage; LogFile.Log.LogEntryDebug(combatResultsMsg, LogDebugLevel.Medium); //Apply damage player.ApplyStunDamageToMonster(m, damage); } } //Doesn't affect the player return(destination); }
/// <summary> /// Simpler version of equip item, doesn't care about slots /// </summary> /// <param name="equipItem"></param> internal bool EquipItemNoSlots(IEquippableItem equipItem) { Item item = equipItem as Item; if (item == null) { //Should never happen LogFile.Log.LogEntry("Problem with item equip"); Game.MessageQueue.AddMessage("You can't equip this item (bug)"); return false; } //Play help movie if (Game.Dungeon.Player.PlayItemMovies && ItemHelpMovieSeen == false) { //Screen.Instance.PlayMovie("helpitems", true); ItemHelpMovieSeen = true; } //Set the item as found item.IsFound = true; //If we have room in our equipped slots, equip and add the item to the inventory if (CurrentEquippedItems < MaximumEquippedItems) { //Add the item to our inventory item.IsEquipped = true; Inventory.AddItem(item); CurrentEquippedItems++; //Let the item do its equip action //This can happen multiple times in PrincessRL since items can be dropped //Probably just play a video equipItem.Equip(this); //Update the player's combat stats which may have been affected CalculateCombatStats(); //Update the inventory listing since equipping an item changes its stackability //No longer necessary since no equippable items get displayed in inventory //Inventory.RefreshInventoryListing(); //Message the user LogFile.Log.LogEntryDebug("Item equipped: " + item.SingleItemDescription, LogDebugLevel.Medium); //Game.MessageQueue.AddMessage(item.SingleItemDescription + " found."); return true; } else if (LocationLevel == 0) { //If not, and we're in town, don't pick it up Game.MessageQueue.AddMessage("You can't carry any more items. Press 'd' to drop your current items."); LogFile.Log.LogEntryDebug("Max number of items reached", LogDebugLevel.Medium); return false; } else { //If not, and we're not in town, set it as inInventory so it won't be drawn. It'll get returned to town on when go back item.InInventory = true; //Play the video equipItem.Equip(this); Game.MessageQueue.AddMessage("You place the " + item.SingleItemDescription + " in your backpack."); LogFile.Log.LogEntryDebug("Max number of items reached. Item returns to town.", LogDebugLevel.Medium); return true; } }
/// <summary> /// Generic throw method for most normal items /// </summary> /// <param name="item"></param> /// <param name="target"></param> /// <returns></returns> public Point ThrowItemGeneric(IEquippableItem item, Point target, int damageOrStunTurns, bool stunDamage) { Item itemAsItem = item as Item; LogFile.Log.LogEntryDebug("Throwing " + itemAsItem.SingleItemDescription, LogDebugLevel.Medium); //Find target List<Point> targetSquares = Game.Dungeon.CalculateTrajectory(target); Monster monster = Game.Dungeon.FirstMonsterInTrajectory(targetSquares); //Find where it landed //Destination will be the last square in trajectory Point destination; if (targetSquares.Count > 0) destination = targetSquares[targetSquares.Count - 1]; else //Threw it on themselves! destination = LocationMap; //Stopped by a monster if (monster != null) { destination = monster.LocationMap; } //Make throwing sound AT target location Game.Dungeon.AddSoundEffect(item.ThrowSoundMagnitude(), LocationLevel, destination); //Draw throw Screen.Instance.DrawAreaAttackAnimation(targetSquares, ColorPresets.Gray); if (stunDamage) { if (monster != null && damageOrStunTurns > 0) { ApplyStunDamageToMonster(monster, damageOrStunTurns); } } else { if (monster != null && damageOrStunTurns > 0) { AttackMonsterThrown(monster, damageOrStunTurns); } } return destination; }
/// <summary> /// Stun grenade - goes through walls /// Should sync with above method /// </summary> /// <param name="item"></param> /// <param name="target"></param> /// <returns></returns> public static Point ThrowItemGrenadeLikeStun(IEquippableItem item, Point target, double size, int damage) { Item itemAsItem = item as Item; LogFile.Log.LogEntryDebug("Throwing " + itemAsItem.SingleItemDescription, LogDebugLevel.Medium); Player player = Game.Dungeon.Player; //Find target List <Point> targetSquares = Game.Dungeon.CalculateTrajectory(target); Monster monster = Game.Dungeon.FirstMonsterInTrajectory(targetSquares); //Find where it landed //Destination will be the last square in trajectory Point destination; if (targetSquares.Count > 0) { destination = targetSquares[targetSquares.Count - 1]; } else { //Threw it on themselves! destination = player.LocationMap; } //Stopped by a monster if (monster != null) { destination = monster.LocationMap; } //Make throwing sound AT target location Game.Dungeon.AddSoundEffect(item.ThrowSoundMagnitude(), Game.Dungeon.Player.LocationLevel, destination); //Work out grenade splash and damage List <Point> grenadeAffects = Game.Dungeon.GetPointsForGrenadeTemplate(destination, Game.Dungeon.Player.LocationLevel, size); //Draw attack Screen.Instance.DrawAreaAttackAnimation(grenadeAffects, ColorPresets.DodgerBlue); //Attack all monsters in the area foreach (Point sq in grenadeAffects) { SquareContents squareContents = Game.Dungeon.MapSquareContents(player.LocationLevel, sq); Monster m = squareContents.monster; //Hit the monster if it's there if (m != null) { string combatResultsMsg = "PvM (" + m.Representation + ") Grenade: Stun: " + damage; LogFile.Log.LogEntryDebug(combatResultsMsg, LogDebugLevel.Medium); //Apply damage player.ApplyStunDamageToMonster(m, damage); } } //Doesn't affect the player return(destination); }
/// <summary> /// Equip an item. Item is removed from the main inventory. /// Returns true if item was used successfully. /// </summary> /// <param name="selectedGroup"></param> /// <returns></returns> public bool EquipItem(InventoryListing selectedGroup) { //Select the first item in the stack int itemIndex = selectedGroup.ItemIndex[0]; Item itemToUse = Inventory.Items[itemIndex]; //Check if this item is equippable IEquippableItem equippableItem = itemToUse as IEquippableItem; if (equippableItem == null) { LogFile.Log.LogEntryDebug("Can't equip item, not equippable: " + itemToUse.SingleItemDescription, LogDebugLevel.Medium); Game.MessageQueue.AddMessage("Can't equip " + itemToUse.SingleItemDescription); return(false); } //Find all matching slots available on the player List <EquipmentSlot> itemPossibleSlots = equippableItem.EquipmentSlots; List <EquipmentSlotInfo> matchingEquipSlots = new List <EquipmentSlotInfo>(); foreach (EquipmentSlot slotType in itemPossibleSlots) { matchingEquipSlots.AddRange(this.EquipmentSlots.FindAll(x => x.slotType == slotType)); } //No suitable slots if (matchingEquipSlots.Count == 0) { LogFile.Log.LogEntryDebug("Can't equip item, no valid slots: " + itemToUse.SingleItemDescription, LogDebugLevel.Medium); Game.MessageQueue.AddMessage("Can't equip " + itemToUse.SingleItemDescription); return(false); } //Look for first empty slot EquipmentSlotInfo freeSlot = matchingEquipSlots.Find(x => x.equippedItem == null); if (freeSlot == null) { //Not slots free, unequip first slot Item oldItem = matchingEquipSlots[0].equippedItem; IEquippableItem oldItemEquippable = oldItem as IEquippableItem; //Sanity check if (oldItemEquippable == null) { LogFile.Log.LogEntry("Currently equipped item is not equippable!: " + oldItem.SingleItemDescription); return(false); } //Run unequip routine oldItemEquippable.UnEquip(this); oldItem.IsEquipped = false; //Can't do this right now, since not in inventory items appear on the floor //This slot is now free freeSlot = matchingEquipSlots[0]; } //We now have a free slot to equip in //Put new item in first relevant slot and run equipping routine matchingEquipSlots[0].equippedItem = itemToUse; equippableItem.Equip(this); itemToUse.IsEquipped = true; //Update the inventory listing since equipping an item changes its stackability Inventory.RefreshInventoryListing(); //Message the user LogFile.Log.LogEntryDebug("Item equipped: " + itemToUse.SingleItemDescription, LogDebugLevel.Low); Game.MessageQueue.AddMessage(itemToUse.SingleItemDescription + " equipped in " + StringEquivalent.EquipmentSlots[matchingEquipSlots[0].slotType]); return(true); }