Skip to content

Commit

Permalink
Merge pull request #311 from hybrasyl/develop
Browse files Browse the repository at this point in the history
Hybrasyl 0.9.1
  • Loading branch information
baughj committed Apr 24, 2022
2 parents 7dc88c7 + 395d933 commit bd00850
Show file tree
Hide file tree
Showing 41 changed files with 1,711 additions and 625 deletions.
3 changes: 3 additions & 0 deletions HybrasylTests/Fixtures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ public void ResetUserStats()
BaseAc = 100,
};
TestUser.Class = Class.Peasant;
TestUser.Inventory.Clear();
TestUser.Equipment.Clear();
TestUser.Vault.Clear();
}

public void Dispose()
Expand Down
63 changes: 62 additions & 1 deletion HybrasylTests/Items.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Hybrasyl.Xml;
using System.Collections.Generic;
using System.Linq;
using Hybrasyl.Enums;
using Xunit;

namespace HybrasylTests;
Expand All @@ -16,10 +17,70 @@ public Items(HybrasylFixture fixture)
Fixture = fixture;
}

[Fact]
public void ItemSlotRequirement()
{
Fixture.ResetUserStats();
Fixture.TestUser.Class = Class.Monk;
Fixture.TestUser.Gender = Gender.Male;
string error = string.Empty;
Assert.True(Game.World.WorldData.TryGetValueByIndex("Test Armor Require Boots", out Item armorItem));
Assert.NotNull(armorItem);
Fixture.TestUser.Teleport("XUnit Test Realm", 10, 10);
var armor = Fixture.TestUser.World.CreateItem(armorItem);
// Check requirement: equip armor with slot restriction (requires boots), should fail
Assert.False(armor.CheckRequirements(Fixture.TestUser, out error));
var item2 = Game.World.WorldData.TryGetValueByIndex("Test Boots", out Item bootItem);
Assert.NotNull(item2);
// Now equip boots
var boots = Fixture.TestUser.World.CreateItem(bootItem);
Assert.True(boots.CheckRequirements(Fixture.TestUser, out error));
Assert.True(Fixture.TestUser.AddEquipment(boots, boots.EquipmentSlot));
// Now we should be able to equip the armor
Assert.True(armor.CheckRequirements(Fixture.TestUser, out error));
Assert.True(Fixture.TestUser.AddEquipment(armor, armor.EquipmentSlot));
// Both boots and armor are equipped
Assert.NotNull(Fixture.TestUser.Equipment.Armor);
Assert.NotNull(Fixture.TestUser.Equipment.Boots);
// Removing the boots should not be possible (we should get a system message)
Assert.False(Fixture.TestUser.RemoveEquipment((byte) ItemSlots.Foot));
Assert.Equal("Other equipment must be removed first.", Fixture.TestUser.LastSystemMessage);
Assert.NotNull(Fixture.TestUser.Equipment.Armor);
Assert.NotNull(Fixture.TestUser.Equipment.Boots);
}

[Fact]
public void ItemSlotRestrictions()
{
Fixture.ResetUserStats();
Fixture.TestUser.Class = Class.Monk;
Fixture.TestUser.Gender = Gender.Male;
string error = string.Empty;
var item = Game.World.WorldData.TryGetValueByIndex("Test Armor 1 Male Monk", out Item armorItem);
Assert.NotNull(item);
Fixture.TestUser.Teleport("XUnit Test Realm", 10, 10);
var armor = Fixture.TestUser.World.CreateItem(armorItem);
// Equip armor with slot restriction
Assert.True(armor.CheckRequirements(Fixture.TestUser, out error));
Assert.True(Fixture.TestUser.AddEquipment(armor, armor.EquipmentSlot, false));
var item2 = Game.World.WorldData.TryGetValueByIndex("Test Boots", out Item bootItem);
Assert.NotNull(item2);
var boots = Fixture.TestUser.World.CreateItem(bootItem);
// Above armor has a slot restriction on boot usage, so this should fail
Assert.False(boots.CheckRequirements(Fixture.TestUser, out error));
Assert.Equal("monk_equip_fail", error);
// Now try the other way - put the boots on first and then equip the armor
Assert.True(Fixture.TestUser.RemoveEquipment((byte) ItemSlots.Armor));
Assert.Null(Fixture.TestUser.Equipment.Armor);
Assert.Null(Fixture.TestUser.Equipment.Boots);
Assert.True(Fixture.TestUser.AddEquipment(boots, boots.EquipmentSlot, false));
Assert.False(armor.CheckRequirements(Fixture.TestUser, out error));
Assert.Equal("monk_equip_fail", error);

}
[Fact]
public void UseItemBaseStats()
{
Fixture.TestUser.Equipment.Clear();
Fixture.ResetUserStats();

var ring = Fixture.TestEquipment[EquipmentSlot.Ring].Clone();
Expand Down
273 changes: 273 additions & 0 deletions HybrasylTests/Merchant.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
using System.Diagnostics;
using System.Linq;
using Hybrasyl;
using Hybrasyl.Objects;
using Hybrasyl.Xml;
using Xunit;

namespace HybrasylTests;

[Collection("Hybrasyl")]
public class Merchants
{
public HybrasylFixture Fixture { get; set; }

public Merchants(HybrasylFixture fixture)
{
Fixture = fixture;
}

[Fact]
public void CheckOnDeposit()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Fixture.TestUser.Say("how many epee do i have on deposit");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have none of those deposited.", msg.Message);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item epee), "Couldn't find epee in test items");
var item = new ItemObject(epee, Fixture.TestUser.World.Guid);
item.Durability = item.MaximumDurability - 1;
Assert.True(Fixture.TestUser.AddItem(item), "Couldn't add item to inventory");
// Should refuse ("I don't want your junk...")
Fixture.TestUser.Say("deposit epee");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("I don't want your junk. Ask a smith to fix it.", msg.Message);
item.Durability = item.MaximumDurability;
// Should now be depositable - except we have no money
Fixture.TestUser.Stats.Gold = 0;
Fixture.TestUser.Say("deposit epee");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("I'll need 50 coins to deposit that.", msg.Message);
// Now we can deposit
Fixture.TestUser.Stats.Gold = 1000;
Fixture.TestUser.Say("deposit epee");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("Epee, that'll be 50 coins.", msg.Message);
// Now we should have exactly one epee
Fixture.TestUser.Say("how many epee do i have on deposit");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have 1 of those deposited.", msg.Message);
}

[Fact]
public void CheckGoldOnDeposit()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Fixture.TestUser.Say("how much gold do i have on deposit");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have no coins on deposit.", msg.Message);
// Now with gold
Fixture.TestUser.Stats.Gold = 100000;
Fixture.TestUser.Say("deposit 30000 gold");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("I'll take your 30000 coins.", msg.Message);
// How much we got
Fixture.TestUser.Say("how much gold do i have on deposit");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have 30000 coins on deposit.", msg.Message);
// Take it out, check again
Fixture.TestUser.Say("withdraw 29999 coins");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("Here are your 29999 coins.", msg.Message);
Fixture.TestUser.Say("how much gold do i have on deposit");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have 1 coin on deposit.", msg.Message);
}

[Fact]
public void BuyAllCategory()
{
Fixture.ResetUserStats();
var before = Fixture.TestUser.Stats.Gold;
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Prayer Book", out Item junk), "Couldn't find prayer book in test items");
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
item.Count = item.MaximumStack;
Fixture.TestUser.AddItem(item);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Bent Needle", out Item junk2), "Couldn't find bent needle in test items");
var item2 = new ItemObject(junk, Fixture.TestUser.World.Guid);
item2.Count = item2.MaximumStack;
Fixture.TestUser.AddItem(item2);
Fixture.TestUser.Say("Buy all of my junk");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
var coins = item.Value * item.Count + item2.Value * item2.Count;
Assert.Equal($"Certainly. That will be {coins} coins, TestUser.", msg.Message);
Assert.Equal(Fixture.TestUser.Stats.Gold, before + coins);
Assert.False(Fixture.TestUser.Inventory.ContainsName("Prayer Book"));
}

[Fact]
public void BuyItem()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item junk), "Couldn't find epee in test items");
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.AddItem(item);
var before = Fixture.TestUser.Stats.Gold;
Fixture.TestUser.Say("Buy 1 of my epee");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal($"Certainly. I will buy 1 of those for {item.Value} coins, {Fixture.TestUser.Name}.", msg.Message);
Assert.Equal(Fixture.TestUser.Stats.Gold, before + item.Value);
Assert.False(Fixture.TestUser.Inventory.ContainsName("Epee"));
}

[Fact]
public void RepairAll()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item junk), "Couldn't find epee in test items");
var before = Fixture.TestUser.Stats.Gold;
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.AddItem(item);
var item2 = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.AddItem(item2);
item.Durability /= 2;
item2.Durability /= 2;
Fixture.TestUser.Stats.Gold = 1;
Fixture.TestUser.Say("repair all");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal($"You'll need 250 more gold to repair all of it, I'm afraid.", msg.Message);
Fixture.TestUser.Stats.Gold = 10000;
Fixture.TestUser.Say("repair all");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.True(item.Durability == item.MaximumDurability);
Assert.True(item2.Durability == item2.MaximumDurability);
Assert.Equal($"I repaired it all for 1000 coins.", msg.Message);
}

[Fact]
public void RepairItem()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item junk), "Couldn't find epee in very test items");
var before = Fixture.TestUser.Stats.Gold;
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.AddItem(item);
item.Durability /= 2;
Fixture.TestUser.Stats.Gold = 1;
Fixture.TestUser.Say("repair my epee");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal($"You'll need 250 more gold to repair that, I'm afraid.", msg.Message);
Fixture.TestUser.Stats.Gold = 10000;
Fixture.TestUser.Say("repair my epee");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.True(item.Durability == item.MaximumDurability);
Assert.Equal($"I repaired your Epee for 250 coins.", msg.Message);
}

[Fact]
public void DepositGold()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Fixture.TestUser.Say("how much gold do i have on deposit");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have no coins on deposit.", msg.Message);
// Not enough gold
Fixture.TestUser.Say("deposit 30000 gold");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You don't have that much.", msg.Message);
Fixture.TestUser.Stats.Gold = 100000;
Fixture.TestUser.Say("deposit 30000 gold");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("I'll take your 30000 coins.", msg.Message);
// How much we got
Fixture.TestUser.Say("how much gold do i have on deposit");
msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("You have 30000 coins on deposit.", msg.Message);
Assert.Equal(Fixture.TestUser.Stats.Gold, (uint) 70000);
}

[Fact]
public void DepositItem()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item junk), "Couldn't find prayer book in test items");
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
item.Durability = item.MaximumDurability;
Fixture.TestUser.AddItem(item);
Fixture.TestUser.Say("deposit epee");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("Epee, that'll be 50 coins.", msg.Message);
Assert.False(Fixture.TestUser.Inventory.ContainsName("Epee"));
Assert.True(Fixture.TestUser.Vault.Items.ContainsKey("Epee"));
Assert.Equal(Fixture.TestUser.Vault.Items["Epee"], (uint) 1);

}

[Fact]
public void WithdrawGold()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
var before = Fixture.TestUser.Stats.Gold;
Fixture.TestUser.Vault.AddGold(30000);
Fixture.TestUser.Say("withdraw 30000 coins");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("Here are your 30000 coins.", msg.Message);
Assert.Equal(Fixture.TestUser.Vault.CurrentGold, (uint) 0);
Assert.Equal(Fixture.TestUser.Stats.Gold, before + 30000);
}

[Fact]
public void WithdrawItem()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Epee", out Item junk), "Couldn't find epee in test items");
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.AddItem(item);
Fixture.TestUser.Vault.AddItem(item.Name);

}

[Fact]
public void WithdrawStackableItem()
{
Fixture.ResetUserStats();
Fixture.TestUser.Teleport("XUnit Test Realm", 8, 8);
Assert.True(Game.World.WorldData.TryGetValueByIndex("Bent Needle", out Item junk), "Couldn't find bent needle in test items");
var item = new ItemObject(junk, Fixture.TestUser.World.Guid);
item.Count = item.MaximumStack - 1;
Fixture.TestUser.AddItem(item);
var item2 = new ItemObject(junk, Fixture.TestUser.World.Guid);
Fixture.TestUser.Vault.AddItem(item2.Name, (ushort) item2.Count);
Fixture.TestUser.Say("withdraw bent needle");
var msg = Fixture.TestUser.MessagesReceived.Last();
Assert.Equal("Maria", msg.Speaker.Name);
Assert.Equal("Here's your Bent Needle back.", msg.Message);
Assert.Equal(item.Count, item.MaximumStack);
}

}



12 changes: 3 additions & 9 deletions HybrasylTests/Monster.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Hybrasyl;
using Hybrasyl;
using Hybrasyl.Objects;
using Hybrasyl.Xml;
using Microsoft.VisualBasic;
using Xunit;
using Creature = Hybrasyl.Xml.Creature;

Expand Down Expand Up @@ -139,7 +133,7 @@ public void MonsterAssailRotation()
[Fact]
public void MonsterThresholdRotations()
{
// We need our gabbaghoulidk may
// We need our gabbaghoul
Assert.True(Game.World.WorldData.TryGetValue<Creature>("Gabbaghoul", out var monsterXml),
"Gabbaghoul test monster not found");
var monster = new Monster(monsterXml, SpawnFlags.AiDisabled, 99);
Expand All @@ -154,7 +148,7 @@ public void MonsterThresholdRotations()
entry2.Use();
var maxHp = monster.Stats.MaximumHp;
monster.Damage(monster.Stats.MaximumHp - 50);
Assert.True(monster.Stats.Hp == maxHp - 50);
Assert.True(monster.Stats.Hp == 50, $"hp should be 50 but is {monster.Stats.Hp}");
entry2 = monster.CastableController.GetNextCastable();
// This should be a threshold cast, but can be any of three spells at random
Assert.NotNull(entry2);
Expand Down

0 comments on commit bd00850

Please sign in to comment.