Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions src/OpenRpg.Genres/Builders/CharacterBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,14 @@ protected virtual RaceData ProcessRace()

protected virtual void PreProcessCharacter() {}
protected virtual void PostProcessCharacter(Character character) {}

/// <summary>
/// Allows you to override the creation of the character instance
/// </summary>
/// <remarks>This is useful for creating a character with a custom inherited type</remarks>
/// <returns></returns>
protected virtual Character CreateCharacterInstance()
{ return new Character() { }; }

public virtual Character CreateCharacter()
{
Expand All @@ -160,14 +168,12 @@ public virtual Character CreateCharacter()
_variables.Inventory(ProcessInventory());
_variables.Gender(_genderId);

var character = new Character()
{
UniqueId = Guid.NewGuid(),
NameLocaleId = _name,
DescriptionLocaleId = _description,
Variables = _variables,
State = new EntityStateVariables(_state)
};
var character = CreateCharacterInstance();
character.UniqueId = Guid.NewGuid();
character.NameLocaleId = _name;
character.DescriptionLocaleId = _description;
character.Variables = _variables;
character.State = new EntityStateVariables(_state);

var needsStateRefresh = _state.Count == 0;
CharacterPopulator.Populate(character, needsStateRefresh);
Expand Down
8 changes: 2 additions & 6 deletions src/OpenRpg.Items/Extensions/EquipmentExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
using System.Collections.Generic;
using System.Linq;
using OpenRpg.Core.Templates;
using OpenRpg.Entities.Effects;
using OpenRpg.Items.Equippables;
using OpenRpg.Items.Equippables.Slots;
using OpenRpg.Items.Templates;
Expand Down Expand Up @@ -38,8 +34,8 @@ public static ItemData AttemptUnequipSlot(this Equipment equipment, int slotType
public static bool AttemptEquipSlot(this Equipment equipment, IEquipmentSlotValidator slotValidator, int slotType, ItemData itemData, ItemTemplate template)
{
if(!equipment.HasSlot(slotType)) { return false; }
if(!equipment.HasItemEquipped(slotType)) { return false; }
if(slotValidator.CanEquipItemType(slotType, template.ItemType)) { return false; }
if(equipment.HasItemEquipped(slotType)) { return false; }
if(!slotValidator.CanEquipItemType(slotType, template.ItemType)) { return false; }
equipment.Slots[slotType] = itemData;
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using Moq;
using OpenRpg.Items.Equippables;
using OpenRpg.Items.Equippables.Slots;
using OpenRpg.Items.Extensions;
using OpenRpg.Items.Templates;
using Xunit;

namespace OpenRpg.UnitTests.Items.Equippables
{
public class EquipmentExtensionsTests
{
[Fact]
public void should_equip_item_when_all_criteria_met()
{
var equipmentSlot = 1;
var equipment = new Equipment();
equipment.Slots[equipmentSlot] = null;

var item = new ItemData();
var itemTemplate = new ItemTemplate();

var mockEquipmentValidator = new Mock<IEquipmentSlotValidator>();
mockEquipmentValidator
.Setup(x => x.CanEquipItemType(It.IsAny<int>(), It.IsAny<int>()))
.Returns(true);

var result = equipment.AttemptEquipSlot(mockEquipmentValidator.Object, equipmentSlot, item, itemTemplate);

Assert.True(result);
Assert.Equal(equipment.Slots[equipmentSlot], item);
}

[Fact]
public void should_not_equip_item_when_slot_doesnt_exist()
{
var equipmentSlot = 1;
var equipment = new Equipment();

var item = new ItemData();
var itemTemplate = new ItemTemplate();

var mockEquipmentValidator = new Mock<IEquipmentSlotValidator>();
mockEquipmentValidator
.Setup(x => x.CanEquipItemType(It.IsAny<int>(), It.IsAny<int>()))
.Returns(true);

var result = equipment.AttemptEquipSlot(mockEquipmentValidator.Object, equipmentSlot, item, itemTemplate);

Assert.False(result);
Assert.Empty(equipment.Slots);
}

[Fact]
public void should_not_equip_item_when_slot_exists_but_validation_fails()
{
var equipmentSlot = 1;
var equipment = new Equipment();
equipment.Slots[equipmentSlot] = null;

var item = new ItemData();
var itemTemplate = new ItemTemplate();

var mockEquipmentValidator = new Mock<IEquipmentSlotValidator>();
mockEquipmentValidator
.Setup(x => x.CanEquipItemType(It.IsAny<int>(), It.IsAny<int>()))
.Returns(false);

var result = equipment.AttemptEquipSlot(mockEquipmentValidator.Object, equipmentSlot, item, itemTemplate);

Assert.False(result);
Assert.Null(equipment.Slots[equipmentSlot]);
}
}
}
Loading