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)); }
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); }
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); }
/// <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); }
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; }
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); }
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; }
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); }
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); }
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(); }
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); }
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(); } }