private void DrawChest(IEquipmentModule equipmentModule)
        {
            var humanParts   = _humanBodyParts;
            var chestTexture = humanParts.Single(x => x.Type == BodyPartType.Chest).Texture;

            AddChild(CreateChestSprite(chestTexture));

            // This slot is body.
            var bodyEquipment = equipmentModule[1];

            if (bodyEquipment != null)
            {
                var bodyEquipmentSid = bodyEquipment.Scheme.Sid;
                if (bodyEquipmentSid != null)
                {
                    var equipmentChestParts   = _personVisualizationContentStorage.GetBodyParts(bodyEquipmentSid);
                    var equipmentChestTexture = equipmentChestParts.Single(x => x.Type == BodyPartType.Chest).Texture;

                    AddChild(CreateChestSprite(equipmentChestTexture));
                }
                else
                {
                    Debug.Fail("There are no schemes without SID. Looks like some kind of error.");
                }
            }
        }
 public PropModalInventoryContextualMenu(Point position, IEquipmentModule equipmentModule,
                                         IUiContentStorage uiContentStorage,
                                         IServiceProvider serviceProvider) : base(position, uiContentStorage)
 {
     _equipmentModule = equipmentModule;
     _serviceProvider = serviceProvider;
 }
        private static Equipment GetEquipedTool(IEquipmentModule equipmentModule, string[] requiredToolTags)
        {
            if (!requiredToolTags.Any())
            {
                // В этом методе предполагается, что наличие тегов проверено до вызова.
                throw new ArgumentException("Требуется не пустой набор тегов.", nameof(requiredToolTags));
            }

            foreach (var equipment in equipmentModule)
            {
                if (equipment is null)
                {
                    // Если для добычи указаны какие-либо теги, а ничего не экипировано,
                    // то такая экипировака не подходит.
                    continue;
                }

                var hasAllTags = EquipmentHelper.HasAllTags(equipment.Scheme.Tags, requiredToolTags);
                if (hasAllTags)
                {
                    // This equipment has all required tags.
                    return(equipment);
                }
            }

            return(null);
        }
        public static bool CanBeEquiped(IEquipmentModule equipmentCarrier, int slotIndex, Equipment equipment)
        {
            if (equipmentCarrier is null)
            {
                throw new System.ArgumentNullException(nameof(equipmentCarrier));
            }

            if (equipment is null)
            {
                throw new System.ArgumentNullException(nameof(equipment));
            }

            var slot = equipmentCarrier.Slots[slotIndex];

            if (!CheckSlotCompability(equipment, slot))
            {
                return(false);
            }

            if (!CheckDualCompability(equipmentCarrier, equipment, slotIndex))
            {
                return(false);
            }

            if (!CheckShieldCompability(equipmentCarrier, equipment, slotIndex))
            {
                return(false);
            }

            return(true);
        }
 private static bool CanBeEquiped(
     IEquipmentModule equipmentModule,
     int slotIndex,
     Equipment equipment)
 {
     return(EquipmentCarrierHelper.CanBeEquiped(equipmentModule, slotIndex, equipment));
 }
Beispiel #6
0
        private void EquipFromInventory(IEquipmentModule equipmentModule, Equipment targetEquipment,
                                        Equipment?currentEquipment, IPropEquipSubScheme equipScheme)
        {
            // (и)
            if (IsTargetSlotAHand(equipmentModule, _slotIndex))
            {
                // Follow to logic of one/two hand equipment
                var equipRestrictions = equipScheme.EquipRestrictions;
                if (equipRestrictions is null || equipRestrictions.PropHandUsage is null)
                {
                    // (i)
                    // Equip one-handed item in a specified hand.

                    EquipOneSlotEquipmentFromInventory(equipmentModule, targetEquipment, currentEquipment);
                }
                else if (equipRestrictions.PropHandUsage.GetValueOrDefault().HasFlag(PropHandUsage.TwoHanded))
                {
                    // (I)
                    // Equip two handed weapon/tool in 2 of all slots.

                    EquipTwoSlotEquipmentFromInventory(equipmentModule, targetEquipment, currentEquipment);
                }
                else
                {
                    //Do nothings beacause this state is unknown.
                    Debug.Fail("Unknown state");
                }
            }
        protected static void AddEquipment(IEquipmentModule equipmentModule, int slotIndex, Equipment equipment)
        {
            if (equipmentModule is null)
            {
                throw new ArgumentNullException(nameof(equipmentModule));
            }

            equipmentModule[slotIndex] = equipment;
        }
        public HumanoidSprite(IEquipmentModule equipmentModule,
                              IPersonVisualizationContentStorage personVisualizationContentStorage,
                              IEnumerable <BodyPart> humanBodyParts)
        {
            _equipmentModule = equipmentModule;

            _personVisualizationContentStorage = personVisualizationContentStorage;
            _humanBodyParts = humanBodyParts;
            CreateSpriteHierarchy(equipmentModule);
        }
Beispiel #9
0
        public CombatStatsModule(IEvolutionModule evolutionModule, IEquipmentModule equipmentModule)
        {
            DefenceStats = new PersonDefenceStats(Array.Empty <PersonDefenceItem>(), Array.Empty <PersonArmorItem>());
            IsActive     = true;

            _evolutionModule = evolutionModule ?? throw new ArgumentNullException(nameof(evolutionModule));
            _equipmentModule = equipmentModule ?? throw new ArgumentNullException(nameof(equipmentModule));

            _equipmentModule.EquipmentChanged += EquipmentModule_EquipmentChanged;
        }
        public HumanoidGraphics(IEquipmentModule equipmentModule,
                                IPersonVisualizationContentStorage personVisualizationContentStorage)
        {
            _equipmentModule = equipmentModule;

            _personVisualizationContentStorage = personVisualizationContentStorage;

            CreateSpriteHierarchy(equipmentModule);

            equipmentModule.EquipmentChanged += EquipmentModule_EquipmentChanged;
        }
        private void DrawLeftHand(IEquipmentModule equipmentModule)
        {
            // Slot 2 is right hand
            var rightEquipment = equipmentModule[2];

            if (rightEquipment?.Scheme?.Equip?.EquipRestrictions?.PropHandUsage == PropHandUsage.TwoHanded)
            {
                // If the person has two handed weapon in right hand there is no reason draw left (second) hand as one handed.

                AddLeftTwoHandedArmHierarchy();
            }
            else
            {
                // Slot 3 according the person scheme is second/left hand.
                var equipment = equipmentModule[3];
                if (equipment != null)
                {
                    var equipmentTags = equipment.Scheme.Tags;
                    if (equipmentTags is null)
                    {
                        // Now a person can equiped only weapons or tools.
                        // All weapons or tools has corresponding tags.
                        Debug.Fail("There is no scenario then equipment has no tags.");

                        AddLeftArmHierarchy();
                    }
                    else if (equipmentTags.Contains(PropTags.Equipment.Weapon))
                    {
                        AddLeftArmHierarchy();

                        AddLeftWeaponHierarchy(equipment);
                    }
                    else if (equipmentTags.Contains(PropTags.Equipment.Shield))
                    {
                        // For a shield in this hand draw shield back sprite first.
                        // So it will looks like the person bear shield by inner side.

                        AddLeftShieldHierarchy(equipment);

                        AddLeftArmHierarchy();
                    }
                    else
                    {
                        Debug.Fail("Unknown tag in the equipment.");

                        AddLeftArmHierarchy();
                    }
                }
                else
                {
                    AddLeftArmHierarchy();
                }
            }
        }
        private void CreateSpriteHierarchy(IEquipmentModule equipmentModule)
        {
            DrawLeftHand(equipmentModule);

            DrawLegs();

            DrawChest(equipmentModule);

            DrawHead();

            DrawRightHand(equipmentModule);
        }
Beispiel #13
0
        /// <summary>
        /// Ищем предмет в уже экипированных.
        /// </summary>
        /// <param name="equipment"> Целевой предмет. </param>
        /// <param name="equipmentModule"> Объект для хранения экипировки. </param>
        /// <returns> Возвращает индекс слота, в котором находится указанный предмет. Или null, если предмет не найден. </returns>
        private static int?FindPropInEquiped(Equipment equipment, IEquipmentModule equipmentModule)
        {
            for (var i = 0; i < equipmentModule.Count(); i++)
            {
                if (equipmentModule[i] == equipment)
                {
                    return(i);
                }
            }

            return(null);
        }
Beispiel #14
0
        public CombatActModule(
            IEnumerable <ITacticalActScheme> defaultActSchemes,
            IEquipmentModule equipmentModule,
            IConditionsModule сonditionsModule,
            IEvolutionModule evolutionModule)
        {
            IsActive = true;

            _defaultActSchemes = defaultActSchemes;
            _equipmentModule   = equipmentModule;
            _сonditionsModule  = сonditionsModule;
            _evolutionModule   = evolutionModule;
        }
        public CombatActModule(
            ITacticalActScheme defaultActScheme,
            IEquipmentModule equipmentModule,
            IConditionsModule сonditionsModule,
            IEvolutionModule evolutionModule)
        {
            IsActive = true;

            _defaultActScheme = defaultActScheme;
            _equipmentModule  = equipmentModule;
            _сonditionsModule = сonditionsModule;
            _evolutionModule  = evolutionModule;
        }
        public CombatActModule(
            ITacticalActScheme defaultActScheme,
            IEquipmentModule equipmentModule,
            IEffectsModule effectsModule,
            IEvolutionModule evolutionModule)
        {
            IsActive = true;

            _defaultActScheme = defaultActScheme;
            _equipmentModule  = equipmentModule;
            _effectsModule    = effectsModule;
            _evolutionModule  = evolutionModule;
        }
Beispiel #17
0
        private void CreateSpriteHierarchy(IEquipmentModule equipmentModule)
        {
            var outlinedHumanoidSprite = new HumanoidSprite(equipmentModule,
                                                            _personVisualizationContentStorage,
                                                            _personVisualizationContentStorage.GetHumanOutlinedParts());

            _outlined = outlinedHumanoidSprite;
            AddChild(_outlined);

            var mainHumanoidSprite = new HumanoidSprite(equipmentModule,
                                                        _personVisualizationContentStorage,
                                                        _personVisualizationContentStorage.GetHumanParts());

            AddChild(mainHumanoidSprite);
        }
Beispiel #18
0
        public CombatActPanel(ICombatActModule combatActModule, IEquipmentModule equipmentModule,
                              IUiContentStorage uiContentStorage, ISectorUiState sectorUiState)
        {
            _combatActModule  = combatActModule;
            _equipmentModule  = equipmentModule;
            _uiContentStorage = uiContentStorage;
            _sectorUiState    = sectorUiState;

            _buttons = new List <CombatActButton>();

            _buttonGroup = new CombatActButtonGroup();

            Initialize(_buttons);

            _equipmentModule.EquipmentChanged += EquipmentModule_EquipmentChanged;
        }
Beispiel #19
0
        public BottomMenuPanel(
            IHumanActorTaskSource <ISectorTaskSourceContext> humanActorTaskSource,
            ICombatActModule combatActModule,
            IUiContentStorage uiContentStorage,
            IEquipmentModule equipmentModule,
            ISectorUiState sectorUiState,
            ICommandPool commandPool,
            ServiceProviderCommandFactory commandFactory,
            ICommandLoopContext commandLoopContext,
            IPlayerEventLogService logService)
        {
            _travelPanel = new TravelPanel(humanActorTaskSource, uiContentStorage, commandPool, commandFactory,
                                           commandLoopContext);
            _combatActPanel = new CombatActPanel(combatActModule, equipmentModule, uiContentStorage, sectorUiState);

            _travelPanel.PropButtonClicked      += PersonPropButton_OnClick;
            _travelPanel.StatButtonClicked      += PersonStatsButton_OnClick;
            _travelPanel.TraitsButtonClicked    += PersonTraitsButton_OnClick;
            _travelPanel.FastDeathButtonClicked += FastDeathButtonClicked;

            _currentModeMenu = _travelPanel;

            var combatButtonIcon = new IconData(
                uiContentStorage.GetSmallVerticalButtonIconsTexture(),
                new Rectangle(48, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT)
                );

            var idleButtonIcon = new IconData(
                uiContentStorage.GetSmallVerticalButtonIconsTexture(),
                new Rectangle(0, 32, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT)
                );

            _idleModeSwitcherButton = new IconButton(
                uiContentStorage.GetSmallVerticalButtonBackgroundTexture(),
                idleButtonIcon,
                new Rectangle(0, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT));
            _idleModeSwitcherButton.OnClick += IdleModeSwitcherButton_OnClick;
            _combatActModule          = combatActModule;
            _uiContentStorage         = uiContentStorage;
            _sectorUiState            = sectorUiState;
            _logService               = logService;
            _combatModeSwitcherButton = new IconButton(
                texture: uiContentStorage.GetSmallVerticalButtonBackgroundTexture(),
                iconData: combatButtonIcon,
                rect: new Rectangle(0, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT));
            _combatModeSwitcherButton.OnClick += CombatModeSwitcherButton_OnClick;
        }
    public void Start()
    {
        var actorVm = _playerState.ActiveActor;
        var actor   = actorVm.Actor;

        // Запоминаем объект equipmentCarrier, чтобы затем корректно отписаться от события,
        // которое навешиваем ниже. Даже если активный персонаж изменится.
        _equipmentModule = actor.Person.GetModule <IEquipmentModule>();

        _equipmentModule.EquipmentChanged += EquipmentCarrierOnEquipmentChanged;

        var acts = actor.Person.GetModule <ICombatActModule>().CalcCombatActs().ToArray();

        UpdateSelectedAct(currentAct: null, acts);

        UpdateActs(acts);
    }
Beispiel #21
0
        private List <SurvivalStatBonus> ProcessRuleAndChangeBonusList(List <SurvivalStatBonus> bonusList,
                                                                       IEquipmentModule equipmentModule, PersonRule rule)
        {
            switch (rule.Type)
            {
            case EquipCommonRuleType.Health:
                BonusToHealth(rule.Level, rule.Direction, ref bonusList);
                break;

            case EquipCommonRuleType.HealthIfNoBody:

                var requirementsCompleted = true;

                for (var slotIndex = 0; slotIndex < equipmentModule.Count(); slotIndex++)
                {
                    if ((equipmentModule.Slots[slotIndex].Types & EquipmentSlotTypes.Body) > 0 &&
                        equipmentModule[slotIndex] != null)
                    {
                        requirementsCompleted = false;
                        break;
                    }
                }

                if (requirementsCompleted)
                {
                    BonusToHealth(rule.Level, rule.Direction, ref bonusList);
                }

                break;

            case EquipCommonRuleType.HungerResistance:
                BonusToDownPass(SurvivalStatType.Satiety, rule.Level, rule.Direction, ref bonusList);
                break;

            case EquipCommonRuleType.ThristResistance:
                BonusToDownPass(SurvivalStatType.Hydration, rule.Level, rule.Direction, ref bonusList);
                break;

            default:
                throw new InvalidOperationException($"Правило {rule.Type} не обрабатывается.");
            }

            return(bonusList);
        }
Beispiel #22
0
        private static bool?Check2hOnlyInMainHandSlot(IEquipmentModule equipmentModule, Equipment targetItemToEquip,
                                                      int slotIndex)
        {
            var equipRestrictions = targetItemToEquip.Scheme?.Equip?.EquipRestrictions;

            if (equipRestrictions is null || equipRestrictions.PropHandUsage is null)
            {
                // Equiped item is one-handed or not in hand slot.
                // No special rules of can execute checking are need.
                return(true);
            }

            if (equipRestrictions.PropHandUsage == PropHandUsage.TwoHanded)
            {
                return(equipmentModule.Slots[slotIndex].IsMain);
            }

            throw new InvalidOperationException("Unknown case.");
        }
        private BodyPart?GetDressedPartAccordingBodySlot(IEquipmentModule equipmentModule, BodyPartType partType)
        {
            // Slot 1 according the person scheme is body.
            var bodyEquipment = equipmentModule[1];

            if (bodyEquipment == null)
            {
                return(null);
            }

            var bodyEquipmentSid = bodyEquipment.Scheme.Sid;

            if (bodyEquipmentSid != null)
            {
                var equipmentParts = _personVisualizationContentStorage.GetBodyParts(bodyEquipmentSid);
                return(equipmentParts.SingleOrDefault(x => x.Type == partType));
            }

            Debug.Fail("There are no schemes without SID. So this looks like some kind of error.");
            return(null);
        }
        public static bool CheckShieldCompability(IEquipmentModule equipmentCarrier, Equipment equipment, int slotIndex)
        {
            if (equipmentCarrier is null)
            {
                throw new System.ArgumentNullException(nameof(equipmentCarrier));
            }

            if (equipment is null)
            {
                throw new System.ArgumentNullException(nameof(equipment));
            }

            var equipmentTags = equipment.Scheme.Tags ?? System.Array.Empty <string>();

            var hasShieldTag = equipmentTags.Any(x => x == PropTags.Equipment.Shield);

            if (hasShieldTag)
            {
                // Проверяем наличие других щитов.
                // Если в другой руке щит уже экипирован, то выбрасываем исключение.
                // Учитываем, что предмет в целевом слоте заменяется.
                var targetSlotEquipment = equipmentCarrier[slotIndex];
                var currentEquipments   = equipmentCarrier.Where(x => x != null);
                var currentSheilds      = from currentEquipment in currentEquipments
                                          where currentEquipment != targetSlotEquipment
                                          let currentEqupmentTags =
                    currentEquipment.Scheme.Tags ?? System.Array.Empty <string>()
                    where currentEqupmentTags.Any(x => x == PropTags.Equipment.Shield)
                    select currentEquipment;

                var hasShields = currentSheilds.Any();
                if (hasShields)
                {
                    return(false);
                }
            }

            return(true);
        }
        public HumanSurvivalModule([NotNull] IPersonScheme personScheme,
                                   [NotNull] ISurvivalRandomSource randomSource,
                                   [NotNull] IAttributesModule attributesModule,
                                   IEffectsModule effectsModule,
                                   IEvolutionModule evolutionModule,
                                   IEquipmentModule equipmentModule) : base(GetStats(personScheme, attributesModule))
        {
            _personScheme     = personScheme ?? throw new ArgumentNullException(nameof(personScheme));
            _randomSource     = randomSource ?? throw new ArgumentNullException(nameof(randomSource));
            _attributesModule = attributesModule ?? throw new ArgumentNullException(nameof(attributesModule));
            _effectsModule    = effectsModule;
            _evolutionModule  = evolutionModule;
            _equipmentModule  = equipmentModule;

            RegisterModuleEventHandlers();

            foreach (var stat in Stats)
            {
                stat.Changed += Stat_Changed;
            }

            CalcSurvivalStats();
        }
Beispiel #26
0
        public BottomMenuPanel(
            IHumanActorTaskSource <ISectorTaskSourceContext> humanActorTaskSource,
            ICombatActModule combatActModule,
            IUiContentStorage uiContentStorage,
            IEquipmentModule equipmentModule,
            ISectorUiState sectorUiState)
        {
            _travelPanel    = new TravelPanel(humanActorTaskSource, uiContentStorage);
            _combatActPanel = new CombatActPanel(combatActModule, equipmentModule, uiContentStorage, sectorUiState);

            _travelPanel.PropButtonClicked += PersonPropButton_OnClick;
            _travelPanel.StatButtonClicked += PersonStatsButton_OnClick;

            _currentModeMenu = _travelPanel;

            var idleButtonIcon = new IconData(
                uiContentStorage.GetSmallVerticalButtonIconsTexture(),
                new Rectangle(48, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT)
                );

            var combatButtonIcon = new IconData(
                uiContentStorage.GetSmallVerticalButtonIconsTexture(),
                new Rectangle(0, 32, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT)
                );

            _idleModeSwitcherButton = new IconButton(uiContentStorage.GetSmallVerticalButtonBackgroundTexture(),
                                                     combatButtonIcon,
                                                     new Rectangle(0, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT));
            _idleModeSwitcherButton.OnClick += IdleModeSwitcherButton_OnClick;
            _combatActModule          = combatActModule;
            _uiContentStorage         = uiContentStorage;
            _combatModeSwitcherButton = new IconButton(
                texture: uiContentStorage.GetSmallVerticalButtonBackgroundTexture(),
                iconData: idleButtonIcon,
                rect: new Rectangle(0, 0, SWITCHER_MODE_BUTTON_WIDTH, SWITCHER_MODE_BUTTON_HEIGHT));
            _combatModeSwitcherButton.OnClick += CombatModeSwitcherButton_OnClick;
        }
        public static bool CheckDualCompability(IEquipmentModule equipmentModule, Equipment equipment, int slotIndex)
        {
            if (equipmentModule is null)
            {
                throw new System.ArgumentNullException(nameof(equipmentModule));
            }

            if (equipment is null)
            {
                throw new System.ArgumentNullException(nameof(equipment));
            }

            var equipmentTags = equipment.Scheme.Tags ?? System.Array.Empty <string>();
            var hasRangedTag  = equipmentTags.Any(x => x == PropTags.Equipment.Ranged);
            var hasWeaponTag  = equipmentTags.Any(x => x == PropTags.Equipment.Weapon);

            if (hasRangedTag && hasWeaponTag)
            {
                // Проверяем наличие любого экипированного оружия.
                // Если находим, то выбрасываем исключение.
                // Учитываем, что предмет в целевом слоте заменяется.
                var targetSlotEquipment = equipmentModule[slotIndex];
                var currentEquipments   = equipmentModule.Where(x => x != null);
                var currentWeapons      = from currentEquipment in currentEquipments
                                          where currentEquipment != targetSlotEquipment
                                          let currentEqupmentTags = currentEquipment.Scheme.Tags ?? System.Array.Empty <string>()
                                                                    where currentEqupmentTags.Any(x => x == PropTags.Equipment.Weapon)
                                                                    select currentEquipment;

                var hasWeapon = currentWeapons.Any();

                if (hasWeapon)
                {
                    return(false);
                }
            }

            if (hasWeaponTag)
            {
                // проверяем наличие стрелкового оружия.
                // Если находим, то выбрасываем исключение.
                // Учитываем, что предмет в целевом слоте заменяется.
                var targetSlotEquipment = equipmentModule[slotIndex];
                var currentEquipments   = equipmentModule.Where(x => x != null);
                var currentWeapons      = from currentEquipment in currentEquipments
                                          where currentEquipment != targetSlotEquipment
                                          let currentEqupmentTags = currentEquipment.Scheme.Tags ?? System.Array.Empty <string>()
                                                                    let currentEqupmentHasWeapon = currentEqupmentTags.Any(x => x == PropTags.Equipment.Weapon)
                                                                                                   let currentEqupmentHasRanged = currentEqupmentTags.Any(x => x == PropTags.Equipment.Ranged)
                                                                                                                                  where currentEqupmentHasWeapon && currentEqupmentHasRanged
                                                                                                                                  select currentEquipment;

                var hasWeapon = currentWeapons.Any();

                if (hasWeapon)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #28
0
 private static void AddEquipment(IEquipmentModule equipmentModule, int slotIndex, Equipment equipment)
 {
     equipmentModule[slotIndex] = equipment;
 }
        private void DrawRightHand(IEquipmentModule equipmentModule)
        {
            // Slot 2 according the person scheme is main hand.
            var weaponEquipment = equipmentModule[2];

            if (weaponEquipment == null)
            {
                // There is nothing in right hand.
                // This is normal situation. So just draw arm unequiped.

                AddRightArmHierarchy();

                return;
            }

            var equipmentTags = weaponEquipment.Scheme.Tags;

            if (equipmentTags is null)
            {
                // Now a person can equiped only weapons or tools.
                // All weapons or tools has corresponding tags.
                Debug.Fail("There is no scenario then equipment has no tags.");

                AddRightArmHierarchy();
            }
            else if (equipmentTags.Contains(PropTags.Equipment.Weapon))
            {
                AddRightWeaponHierarchy(weaponEquipment);

                var equipScheme = weaponEquipment.Scheme.Equip;
                if (equipScheme is null)
                {
                    // A person can equip only a prop with assigned PropEquipScheme.
                    Debug.Fail("This is not possible to draw weapon without equip scheme.");
                }
                else
                {
                    var propHandUsage = equipScheme.EquipRestrictions?.PropHandUsage;
                    switch (propHandUsage)
                    {
                    case null:
                        // This means the prop has no hand restrictions.
                        // Draw simple right hand.
                        AddRightArmHierarchy();
                        break;

                    case PropHandUsage.TwoHanded:

                        AddLeftFistHierarchy();

                        AddRightTwoHandedArmHierarchy();
                        break;

                    default:
                        throw new InvalidOperationException($"Unknown hand usage: {propHandUsage}.");
                    }
                }
            }
            else if (equipmentTags.Contains(PropTags.Equipment.Shield))
            {
                // For shield draw arm first because the base of the sheild
                // should be cover the arm.

                AddRightArmHierarchy();

                AddRightShieldHierarchy(weaponEquipment);
            }
            else
            {
                Debug.Fail("Unknown tag of thing in hand. Do not visualize it.");

                AddRightArmHierarchy();
            }
        }