コード例 #1
0
ファイル: Inventory.cs プロジェクト: GunnerJnr/lib9c
        public bool HasNotification(int level, long blockIndex)
        {
            var availableSlots = UnlockHelper.GetAvailableEquipmentSlots(level);

            foreach (var(type, slotCount) in availableSlots)
            {
                var equipments = Equipments.Where(e =>
                                                  e.ItemSubType == type &&
                                                  e.RequiredBlockIndex <= blockIndex);
                var current = equipments.Where(e => e.equipped);
                // When an equipment slot is empty.
                if (current.Count() < Math.Min(equipments.Count(), slotCount))
                {
                    return(true);
                }

                // When any other equipments are stronger than current one.
                foreach (var equipment in equipments)
                {
                    if (equipment.equipped)
                    {
                        continue;
                    }

                    var cp = CPHelper.GetCP(equipment);
                    if (current.Any(i => CPHelper.GetCP(i) < cp))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
コード例 #2
0
        private void UpdateSlotView(AvatarState avatarState)
        {
            var game        = Game.Game.instance;
            var playerModel = game.Stage.GetPlayer().Model;

            nicknameText.text = string.Format(
                NicknameTextFormat,
                avatarState.level,
                avatarState.NameWithHash);

            var title = avatarState.inventory.Costumes.FirstOrDefault(costume =>
                                                                      costume.ItemSubType == ItemSubType.Title &&
                                                                      costume.equipped);

            titleText.text = title is null
                ? ""
                : title.GetLocalizedName();

            cpText.text = CPHelper
                          .GetCPV2(avatarState, game.TableSheets.CharacterSheet, game.TableSheets.CostumeStatSheet)
                          .ToString();

            costumeSlots.SetPlayerCostumes(playerModel, ShowTooltip, null);
            equipmentSlots.SetPlayerEquipments(playerModel, ShowTooltip, null);
        }
コード例 #3
0
        public override OrderDigest Digest2(AvatarState avatarState, CostumeStatSheet costumeStatSheet)
        {
            if (avatarState.inventory.TryGetTradableItem(TradableId, ExpiredBlockIndex, ItemCount,
                                                         out Inventory.Item inventoryItem))
            {
                ItemBase item  = inventoryItem.item;
                int      cp    = CPHelper.GetCP((ITradableItem)item, costumeStatSheet);
                int      level = item is Equipment equipment ? equipment.level : 0;
                return(new OrderDigest(
                           SellerAgentAddress,
                           StartedBlockIndex,
                           ExpiredBlockIndex,
                           OrderId,
                           TradableId,
                           Price,
                           cp,
                           level,
                           item.Id,
                           ItemCount
                           ));
            }

            throw new ItemDoesNotExistException(
                      $"Aborted because the tradable item({TradableId}) was failed to load from avatar's inventory.");
        }
コード例 #4
0
        private static int GetTypeValue(ItemBase item, SortType type)
        {
            switch (type)
            {
            case SortType.Grade:
                return(item.Grade);

            case SortType.Cp:
                switch (item)
                {
                case ItemUsable itemUsable:
                    return(CPHelper.GetCP(itemUsable));

                case Costume costume:
                {
                    var costumeSheet = Game.Game.instance.TableSheets.CostumeStatSheet;
                    return(CPHelper.GetCP(costume, costumeSheet));
                }
                }
                break;

            case SortType.None:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }
            throw new ArgumentOutOfRangeException(nameof(type), type, null);
        }
コード例 #5
0
ファイル: ArenaRankCell.cs プロジェクト: hunj/NineChronicles
        private void Awake()
        {
            avatarInfoButton.OnClickAsObservable()
            .ThrottleFirst(new TimeSpan(0, 0, 1))
            .Subscribe(_ =>
            {
                AudioController.PlayClick();
                Context.OnClickAvatarInfo.OnNext(this);
                _onClickAvatarInfo.OnNext(this);
            })
            .AddTo(gameObject);

            challengeButton.OnSubmitClick
            .ThrottleFirst(new TimeSpan(0, 0, 1))
            .Subscribe(_ =>
            {
                AudioController.PlayClick();
                Context.OnClickChallenge.OnNext(this);
                _onClickChallenge.OnNext(this);
            })
            .AddTo(gameObject);

            Game.Event.OnUpdatePlayerEquip
            .Where(_ => _isCurrentUser)
            .Subscribe(player =>
            {
                characterView.SetByPlayer(player);
                cpText.text = CPHelper.GetCPV2(
                    States.Instance.CurrentAvatarState,
                    Game.Game.instance.TableSheets.CharacterSheet,
                    Game.Game.instance.TableSheets.CostumeStatSheet).ToString();
            })
            .AddTo(gameObject);
        }
コード例 #6
0
        public void EquipItems()
        {
            var avatarAddress = _agentAddress.Derive("avatar_1");
            var avatarState   = new AvatarState(
                avatarAddress,
                _agentAddress,
                0,
                _tableSheets.GetAvatarSheets(),
                new GameConfigState(),
                default
                );

            avatarState.level = GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing1;
            var equipmentList = new List <Guid>();

            avatarState.EquipEquipments(equipmentList);

            var inventory       = avatarState.inventory;
            var hasNotification = inventory.HasNotification(avatarState.level);

            // When inventory is empty.
            Assert.False(hasNotification);

            foreach (var type in _itemSubTypesForEquipments)
            {
                var rows = _tableSheets.EquipmentItemSheet.Values
                           .Where(r => r.ItemSubType == type && r.Grade == 1);
                foreach (var row in rows)
                {
                    var guid      = Guid.NewGuid();
                    var equipment = (Equipment)ItemFactory.CreateItemUsable(row, guid, 0, 0);
                    inventory.AddItem(equipment);
                }

                hasNotification = inventory.HasNotification(avatarState.level);
                // When all of the items are unequipped.
                Assert.True(hasNotification);

                var ordered = inventory.Equipments
                              .Where(i => i.ItemSubType == type)
                              .OrderBy(i => CPHelper.GetCP(i));

                var weakest = ordered.First();
                equipmentList.Add(weakest.ItemId);
                avatarState.EquipEquipments(equipmentList);
                hasNotification = inventory.HasNotification(avatarState.level);
                // When weakest item is equipped.
                Assert.True(hasNotification);

                equipmentList.Remove(weakest.ItemId);

                var strongest = ordered.Last();
                equipmentList.Add(strongest.ItemId);
                avatarState.EquipEquipments(equipmentList);
                hasNotification = inventory.HasNotification(avatarState.level);
                // When strongest item is equipped.
                Assert.False(hasNotification);
            }
        }
コード例 #7
0
        public void EquipTwoRings()
        {
            var avatarAddress = _agentAddress.Derive("avatar_2");
            var avatarState   = new AvatarState(
                avatarAddress,
                _agentAddress,
                0,
                _tableSheets.GetAvatarSheets(),
                new GameConfigState(),
                default
                );

            avatarState.level = GameConfig.RequireCharacterLevel.CharacterEquipmentSlotRing2;
            var equipmentList = new List <Guid>();

            avatarState.EquipEquipments(equipmentList);

            var inventory       = avatarState.inventory;
            var hasNotification = inventory.HasNotification(avatarState.level);

            // When inventory is empty.
            Assert.False(hasNotification);

            var rows = _tableSheets.EquipmentItemSheet.Values
                       .Where(r => r.ItemSubType == ItemSubType.Ring && r.Grade == 1);

            foreach (var row in rows)
            {
                var guid      = Guid.NewGuid();
                var equipment = (Equipment)ItemFactory.CreateItemUsable(row, guid, 0, 0);
                inventory.AddItem(equipment);
            }

            hasNotification = inventory.HasNotification(avatarState.level);
            // When all of the items are unequipped.
            Assert.True(hasNotification);

            var ordered = inventory.Equipments.OrderBy(i => CPHelper.GetCP(i));

            var strongest = ordered.Last();

            equipmentList.Add(strongest.ItemId);
            avatarState.EquipEquipments(equipmentList);
            hasNotification = inventory.HasNotification(avatarState.level);
            // When one strongest ring is equipped.
            Assert.True(hasNotification);

            equipmentList.Clear();

            var strongests = ordered.TakeLast(2).Select(i => i.ItemId);

            equipmentList.AddRange(strongests);
            avatarState.EquipEquipments(equipmentList);
            hasNotification = inventory.HasNotification(avatarState.level);
            // When the 1st strongest, the 2nd strongest items are equipped.
            Assert.False(hasNotification);
        }
コード例 #8
0
        public ArenaInfo(AvatarState avatarState, CharacterSheet characterSheet, bool active)
        {
            AvatarAddress = avatarState.address;
            AgentAddress  = avatarState.agentAddress;
            AvatarName    = avatarState.NameWithHash;
            ArenaRecord   = new Record();
            Level         = avatarState.level;
            var armor = avatarState.inventory.Items.Select(i => i.item).OfType <Armor>().FirstOrDefault(e => e.equipped);

            ArmorId             = armor?.Id ?? GameConfig.DefaultAvatarArmorId;
            CombatPoint         = CPHelper.GetCP(avatarState, characterSheet);
            Active              = active;
            DailyChallengeCount = GameConfig.ArenaChallengeCountMax;
            Score = GameConfig.ArenaScoreDefault;
        }
コード例 #9
0
        private void UpdateSlotView(AvatarState avatarState)
        {
            var game = Game.Game.instance;
            // var playerModel = game.Stage.GetPlayer().Model;
            var playerModel = _player.Model;

            nicknameText.text = string.Format(
                NicknameTextFormat,
                avatarState.level,
                avatarState.NameWithHash);

            var title = avatarState.inventory.Costumes.FirstOrDefault(costume =>
                                                                      costume.ItemSubType == ItemSubType.Title &&
                                                                      costume.equipped);

            titleText.text = title is null
                ? ""
                : title.GetLocalizedName();

            costumeSlots.SetPlayerCostumes(playerModel, ShowTooltip, Unequip);
            equipmentSlots.SetPlayerEquipments(playerModel, ShowTooltip, Unequip);

            var currentAvatarState = game.States.CurrentAvatarState;

            if (avatarState.Equals(currentAvatarState))
            {
                // 인벤토리 아이템의 장착 여부를 `equipmentSlots`의 상태를 바탕으로 설정하기 때문에 `equipmentSlots.SetPlayer()`를 호출한 이후에 인벤토리 아이템의 장착 상태를 재설정한다.
                // 또한 인벤토리는 기본적으로 `OnEnable()` 단계에서 `OnResetItems` 이벤트를 일으키기 때문에 `equipmentSlots.SetPlayer()`와 호출 순서 커플링이 생기게 된다.
                // 따라서 강제로 상태를 설정한다.
                inventory.gameObject.SetActive(true);
                SubscribeInventoryResetItems(inventory);

                var currentPlayer = game.Stage.selectedPlayer;
                cpText.text = CPHelper.GetCP(currentPlayer.Model, game.TableSheets.CostumeStatSheet)
                              .ToString();
            }
            else
            {
                inventory.gameObject.SetActive(false);
                cpText.text = CPHelper.GetCPV2(avatarState, game.TableSheets.CharacterSheet, game.TableSheets.CostumeStatSheet)
                              .ToString();
            }

            UpdateUIPlayer();
        }
コード例 #10
0
        private void ProcessEquipmentData(
            Address agentAddress,
            Address avatarAddress,
            Equipment equipment,
            string avatarName)
        {
            MySqlStore.StoreAgent(agentAddress);
            MySqlStore.StoreAvatar(
                avatarAddress,
                agentAddress,
                avatarName);
            var cp = CPHelper.GetCP(equipment);

            MySqlStore.ProcessEquipment(
                equipment.ItemId,
                agentAddress,
                avatarAddress,
                equipment.Id,
                cp,
                equipment.level,
                equipment.ItemSubType);
        }
コード例 #11
0
        public bool HasNotification()
        {
            foreach (var subType in new [] { ItemSubType.Weapon, ItemSubType.Armor, ItemSubType.Belt, ItemSubType.Necklace, ItemSubType.Ring })
            {
                var equipments = Equipments.Where(e => e.ItemSubType == subType).ToList();
                var current    = equipments.FirstOrDefault(e => e.equipped);
                //현재 장착안한 슬롯에 장착 가능한 장비가 있는 경우
                if (current is null && equipments.Any())
                {
                    return(true);
                }

                var hasNotification = equipments.Any(e => CPHelper.GetCP(e) > CPHelper.GetCP(current));
                // 현재장착한 장비보다 강한 장비가 있는 경우
                if (hasNotification)
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #12
0
 public void UpdateV2(AvatarState state, CharacterSheet characterSheet, CostumeStatSheet costumeStatSheet)
 {
     ArmorId     = state.GetArmorId();
     Level       = state.level;
     CombatPoint = CPHelper.GetCPV2(state, characterSheet, costumeStatSheet);
 }
コード例 #13
0
 public void UpdateV1(AvatarState state, CharacterSheet characterSheet)
 {
     ArmorId     = state.GetArmorId();
     Level       = state.level;
     CombatPoint = CPHelper.GetCP(state, characterSheet);
 }
コード例 #14
0
        private void UpdateStatsArea()
        {
            if (Model?.item.Value is null)
            {
                statsArea.root.gameObject.SetActive(false);

                return;
            }

            foreach (var stat in statsArea.stats)
            {
                stat.Hide();
            }

            var statCount = 0;

            if (Model.item.Value.ItemBase.Value is Equipment equipment)
            {
                descriptionArea.commonGameObject.SetActive(false);
                descriptionArea.dividerImageGameObject.SetActive(false);
                descriptionArea.levelLimitGameObject.SetActive(false);
                descriptionArea.combatPowerObject.SetActive(true);
                descriptionArea.combatPowerText.text = CPHelper.GetCP(equipment).ToString();

                var uniqueStatType = equipment.UniqueStatType;
                foreach (var statMapEx in equipment.StatsMap.GetStats())
                {
                    if (!statMapEx.StatType.Equals(uniqueStatType))
                    {
                        continue;
                    }

                    AddStat(statMapEx, true);
                    statCount++;
                }

                foreach (var statMapEx in equipment.StatsMap.GetStats())
                {
                    if (statMapEx.StatType.Equals(uniqueStatType))
                    {
                        continue;
                    }

                    AddStat(statMapEx);
                    statCount++;
                }
            }
            else if (Model.item.Value.ItemBase.Value is ItemUsable itemUsable)
            {
                descriptionArea.commonGameObject.SetActive(false);
                descriptionArea.dividerImageGameObject.SetActive(false);
                descriptionArea.levelLimitGameObject.SetActive(false);
                descriptionArea.combatPowerObject.SetActive(false);

                foreach (var statMapEx in itemUsable.StatsMap.GetStats())
                {
                    AddStat(statMapEx);
                    statCount++;
                }
            }
            else if (Model.item.Value.ItemBase.Value is Costume costume)
            {
                var costumeSheet = Game.Game.instance.TableSheets.CostumeStatSheet;
                descriptionArea.commonGameObject.SetActive(false);
                descriptionArea.dividerImageGameObject.SetActive(false);
                descriptionArea.levelLimitGameObject.SetActive(false);
                var statsMap = new StatsMap();
                foreach (var row in costumeSheet.OrderedList.Where(r => r.CostumeId == costume.Id))
                {
                    statsMap.AddStatValue(row.StatType, row.Stat);
                }

                foreach (var statMapEx in statsMap.GetStats())
                {
                    AddStat(statMapEx);
                    statCount++;
                }

                var cpEnable = statCount > 0;
                descriptionArea.combatPowerObject.SetActive(cpEnable);
                if (cpEnable)
                {
                    descriptionArea.combatPowerText.text = CPHelper.GetCP(costume, costumeSheet).ToString();
                }
            }
            else
            {
                descriptionArea.levelLimitGameObject.SetActive(false);
                descriptionArea.combatPowerObject.SetActive(false);
                descriptionArea.commonGameObject.SetActive(false);
                descriptionArea.dividerImageGameObject.SetActive(false);
            }

            if (statCount <= 0)
            {
                statsArea.root.gameObject.SetActive(false);

                return;
            }

            statsArea.root.gameObject.SetActive(true);
        }
コード例 #15
0
        public void UpdateEquipmentNotification(List <ElementalType> elementalTypes = null)
        {
            var currentAvatarState = Game.Game.instance.States.CurrentAvatarState;

            if (currentAvatarState is null)
            {
                return;
            }

            if (State.Value != ItemType.Equipment)
            {
                return;
            }

            var equipments = Equipments;

            foreach (var item in equipments)
            {
                item.HasNotification.Value = false;
            }

            var level          = currentAvatarState.level;
            var availableSlots = UnlockHelper.GetAvailableEquipmentSlots(level);

            foreach (var(type, slotCount) in availableSlots)
            {
                var matchedEquipments = Equipments
                                        .Where(e => e.ItemBase.Value.ItemSubType == type);

                if (elementalTypes != null)
                {
                    matchedEquipments = matchedEquipments.Where(e =>
                                                                elementalTypes.Exists(x => x == e.ItemBase.Value.ElementalType));
                }
                var equippedEquipments =
                    matchedEquipments.Where(e => e.EquippedEnabled.Value);
                var unequippedEquipments =
                    matchedEquipments.Where(e => !e.EquippedEnabled.Value)
                    .OrderByDescending(i => CPHelper.GetCP(i.ItemBase.Value as Equipment));

                var equippedCount = equippedEquipments.Count();

                if (equippedCount < slotCount)
                {
                    var itemsToNotify = unequippedEquipments.Take(slotCount - equippedCount);

                    foreach (var item in itemsToNotify)
                    {
                        item.HasNotification.Value = true;
                    }
                }
                else
                {
                    var itemsToNotify =
                        unequippedEquipments.Where(e =>
                    {
                        var cp = CPHelper.GetCP(e.ItemBase.Value as Equipment);
                        return(equippedEquipments.Any(i => CPHelper.GetCP(i.ItemBase.Value as Equipment) < cp));
                    }).Take(slotCount);
                    foreach (var item in itemsToNotify)
                    {
                        item.HasNotification.Value = true;
                    }
                }
            }
        }
コード例 #16
0
        private void Equip(CountableItem countableItem)
        {
            if (Game.Game.instance.Stage.IsInStage ||
                !(countableItem is InventoryItem inventoryItem))
            {
                return;
            }

            var itemBase = inventoryItem.ItemBase.Value;

            // 이미 장착중인 아이템이라면 해제한다.
            if (TryToFindSlotAlreadyEquip(itemBase, out var slot))
            {
                Unequip(slot);
                return;
            }

            // 아이템을 장착할 슬롯을 찾는다.
            if (!TryToFindSlotToEquip(itemBase, out slot))
            {
                return;
            }

            var currentAvatarState = Game.Game.instance.States.CurrentAvatarState;
            var characterSheet     = Game.Game.instance.TableSheets.CharacterSheet;
            var costumeStatSheet   = Game.Game.instance.TableSheets.CostumeStatSheet;
            var prevCp             = CPHelper.GetCPV2(currentAvatarState, characterSheet, costumeStatSheet);

            // 이미 슬롯에 아이템이 있다면 해제한다.
            if (!slot.IsEmpty)
            {
                Unequip(slot, true);
            }

            slot.Set(itemBase, ShowTooltip, Unequip);
            LocalStateItemEquipModify(slot.Item, true);

            if (!(_disableCpTween is null))
            {
                StopCoroutine(_disableCpTween);
            }
            additionalCpArea.gameObject.SetActive(false);

            var currentCp = CPHelper.GetCPV2(currentAvatarState, characterSheet, costumeStatSheet);
            var tweener   = cpTextValueTweener.Play(prevCp, currentCp);

            if (prevCp < currentCp)
            {
                additionalCpArea.gameObject.SetActive(true);
                additionalCpText.text = (currentCp - prevCp).ToString();
                _disableCpTween       = StartCoroutine(CoDisableIncreasedCP());
            }

            var player = Game.Game.instance.Stage.GetPlayer();

            switch (itemBase)
            {
            default:
                return;

            case Costume costume:
            {
                inventoryItem.EquippedEnabled.Value = true;
                player.EquipCostume(costume);
                UpdateStatViews();
                if (costume.ItemSubType == ItemSubType.Title)
                {
                    titleText.text = costume.GetLocalizedName();
                }

                break;
            }

            case Equipment _:
            {
                inventoryItem.EquippedEnabled.Value = true;
                UpdateStatViews();
                switch (slot.ItemSubType)
                {
                case ItemSubType.Armor:
                {
                    var armor  = (Armor)_armorSlot.Item;
                    var weapon = (Weapon)_weaponSlot.Item;
                    player.EquipEquipmentsAndUpdateCustomize(armor, weapon);
                    break;
                }

                case ItemSubType.Weapon:
                    player.EquipWeapon((Weapon)slot.Item);
                    break;
                }

                break;
            }
            }

            Game.Event.OnUpdatePlayerEquip.OnNext(player);
            PostEquipOrUnequip(slot);
        }
コード例 #17
0
        public void Show(int beforeLevel, int afterLevel, bool ignoreShowAnimation = false)
        {
            var gameInstance = Game.Game.instance;

            _model = gameInstance.Stage.selectedPlayer.Model;
            var characterSheet   = gameInstance.TableSheets.CharacterSheet;
            var characterId      = _model.CharacterId;
            var costumeStatSheet = gameInstance.TableSheets.CostumeStatSheet;

            if (!characterSheet.TryGetValue(characterId, out var row))
            {
                throw new System.Exception($"CharacterId{characterId} is invaild.");
            }
            _model.Level = beforeLevel;
            var previousCP = CPHelper.GetCP(_model, costumeStatSheet);

            cpTextTweener.startValue = previousCP;
            _model.Level             = afterLevel;
            var currentCP = CPHelper.GetCP(_model, costumeStatSheet);

            cpTextTweener.endValue = currentCP;

            levelText.text       = afterLevel.ToString();
            increasedCpText.text = (currentCP - previousCP).ToString();
            var beforeStat = row.ToStats(beforeLevel);
            var afterStat  = row.ToStats(afterLevel);

            using (var enumerator = ((IEnumerable <StatType>)Enum.GetValues(typeof(StatType))).GetEnumerator())
            {
                // StatType.None 스킵
                enumerator.MoveNext();
                foreach (var view in statViews)
                {
                    if (!enumerator.MoveNext())
                    {
                        view.gameObject.SetActive(false);
                        continue;
                    }

                    var type = enumerator.Current;

                    view.Show(type,
                              beforeStat.GetStat(type, true),
                              afterStat.GetStat(type, true));
                    view.gameObject.SetActive(true);
                }
            }

            base.Show(ignoreShowAnimation);

            var position = ActionCamera.instance.transform.position;

            _levelUpVFX = VFXController.instance.CreateAndChaseCam <LevelUpVFX>(position, new Vector3(0f, 0.7f));
            _levelUpVFX.Play();
            _levelUpVFX.OnFinished = () => Close();

            var stage = Game.Game.instance.Stage;

            stage.ReleaseWhiteList.Add(_levelUpVFX.gameObject);
            base.Show(ignoreShowAnimation);
        }
コード例 #18
0
 public ArenaInfo(AvatarState avatarState, CharacterSheet characterSheet, CostumeStatSheet costumeStatSheet, bool active)
     : this(avatarState, characterSheet, active)
 {
     CombatPoint = CPHelper.GetCPV2(avatarState, characterSheet, costumeStatSheet);
 }
コード例 #19
0
        private void Unequip(EquipmentSlot slot, bool considerInventoryOnly)
        {
            if (Game.Game.instance.Stage.IsInStage)
            {
                return;
            }

            Find <ItemInformationTooltip>().Close();

            if (slot.IsEmpty)
            {
                foreach (var item in inventory.SharedModel.Equipments)
                {
                    item.GlowEnabled.Value =
                        item.ItemBase.Value.ItemSubType == slot.ItemSubType;
                }

                return;
            }

            var currentAvatarState = Game.Game.instance.States.CurrentAvatarState;
            var characterSheet     = Game.Game.instance.TableSheets.CharacterSheet;
            var costumeStatSheet   = Game.Game.instance.TableSheets.CostumeStatSheet;
            var prevCp             = CPHelper.GetCPV2(currentAvatarState, characterSheet, costumeStatSheet);

            var slotItem = slot.Item;

            slot.Clear();
            LocalStateItemEquipModify(slotItem, false);

            var currentCp = CPHelper.GetCPV2(currentAvatarState, characterSheet, costumeStatSheet);

            cpTextValueTweener.Play(prevCp, currentCp);

            var player = considerInventoryOnly
                ? null
                : Game.Game.instance.Stage.GetPlayer();

            switch (slotItem)
            {
            default:
                return;

            case Costume costume:
            {
                if (!inventory.SharedModel.TryGetCostume(costume, out var inventoryItem))
                {
                    return;
                }

                inventoryItem.EquippedEnabled.Value = false;

                if (considerInventoryOnly)
                {
                    break;
                }

                UpdateStatViews();

                var armor  = (Armor)_armorSlot.Item;
                var weapon = (Weapon)_weaponSlot.Item;
                player.UnequipCostume(costume, true);
                player.EquipEquipmentsAndUpdateCustomize(armor, weapon);
                Game.Event.OnUpdatePlayerEquip.OnNext(player);

                if (costume.ItemSubType == ItemSubType.Title)
                {
                    titleText.text = "";
                }

                break;
            }

            case Equipment equipment:
            {
                if (!inventory.SharedModel.TryGetEquipment(equipment, out var inventoryItem))
                {
                    return;
                }

                inventoryItem.EquippedEnabled.Value = false;

                if (considerInventoryOnly)
                {
                    break;
                }

                UpdateStatViews();

                switch (slot.ItemSubType)
                {
                case ItemSubType.Armor:
                {
                    var armor  = (Armor)_armorSlot.Item;
                    var weapon = (Weapon)_weaponSlot.Item;
                    player.EquipEquipmentsAndUpdateCustomize(armor, weapon);
                    break;
                }

                case ItemSubType.Weapon:
                    player.EquipWeapon((Weapon)_weaponSlot.Item);
                    break;
                }

                Game.Event.OnUpdatePlayerEquip.OnNext(player);
                break;
            }
            }

            PostEquipOrUnequip(slot);
        }
コード例 #20
0
        public void Execute(int avatarLevel, int worldId, int stageId, bool contains)
        {
            Assert.True(_tableSheets.WorldSheet.TryGetValue(worldId, out var worldRow));
            Assert.True(stageId >= worldRow.StageBegin);
            Assert.True(stageId <= worldRow.StageEnd);
            Assert.True(_tableSheets.StageSheet.TryGetValue(stageId, out _));

            var previousAvatarState = _initialState.GetAvatarState(_avatarAddress);

            previousAvatarState.level            = avatarLevel;
            previousAvatarState.worldInformation = new WorldInformation(
                0,
                _tableSheets.WorldSheet,
                Math.Max(_tableSheets.StageSheet.First?.Id ?? 1, stageId - 1));

            var costumeId = _tableSheets
                            .CostumeItemSheet
                            .Values
                            .First(r => r.ItemSubType == ItemSubType.FullCostume)
                            .Id;
            var costume =
                ItemFactory.CreateItem(_tableSheets.ItemSheet[costumeId], new ItemEnhancementTest.TestRandom());

            previousAvatarState.inventory.AddItem(costume);

            var state = _initialState.SetState(_avatarAddress, previousAvatarState.Serialize());

            var action = new HackAndSlash2()
            {
                costumes = new List <int> {
                    costumeId
                },
                equipments         = new List <Guid>(),
                foods              = new List <Guid>(),
                worldId            = worldId,
                stageId            = stageId,
                avatarAddress      = _avatarAddress,
                WeeklyArenaAddress = _weeklyArenaState.address,
                RankingMapAddress  = _rankingMapAddress,
            };

            Assert.Null(action.Result);

            var nextState = action.Execute(new ActionContext()
            {
                PreviousStates = state,
                Signer         = _agentAddress,
                Random         = new ItemEnhancementTest.TestRandom(),
                Rehearsal      = false,
            });

            var nextAvatarState = nextState.GetAvatarState(_avatarAddress);
            var newWeeklyState  = nextState.GetWeeklyArenaState(0);

            Assert.NotNull(action.Result);

            Assert.NotEmpty(action.Result.OfType <GetReward>());
            Assert.Equal(BattleLog.Result.Win, action.Result.result);
            Assert.Equal(contains, newWeeklyState.ContainsKey(_avatarAddress));
            Assert.True(nextAvatarState.worldInformation.IsStageCleared(stageId));
            if (contains)
            {
                Assert.True(
                    newWeeklyState[_avatarAddress].CombatPoint >
                    CPHelper.GetCP(nextAvatarState, _tableSheets.CharacterSheet)
                    );
            }

            var value = nextState.GetState(_rankingMapAddress);

            var rankingMapState = new RankingMapState((Dictionary)value);
            var info            = rankingMapState.GetRankingInfos(null).First();

            Assert.Equal(info.AgentAddress, _agentAddress);
            Assert.Equal(info.AvatarAddress, _avatarAddress);
        }
コード例 #21
0
        private void UpdateView()
        {
            if (Model is null)
            {
                itemNameText.text = L10nManager.Localize("UI_COMBINATION_ERROR");
                itemInformation.gameObject.SetActive(false);
                return;
            }

            var item        = Model.itemInformation.Value.item.Value.ItemBase.Value;
            var isEquipment = item is Equipment;

            if (Model.isSuccess)
            {
                itemNameText.text = item.GetLocalizedName();
                itemInformation.gameObject.SetActive(true);
                AudioController.instance.PlaySfx(AudioController.SfxCode.Success);
            }
            else
            {
                itemNameText.text = L10nManager.Localize("UI_COMBINATION_FAIL");
                itemInformation.gameObject.SetActive(false);
                AudioController.instance.PlaySfx(AudioController.SfxCode.Failed);
            }

            if (Model.materialItems.Any())
            {
                materialText.gameObject.SetActive(true);
                materialView.SetActive(true);
                using (var e = Model.materialItems.GetEnumerator())
                {
                    foreach (var material in materialItems)
                    {
                        e.MoveNext();
                        if (e.Current is null)
                        {
                            material.Clear();
                            material.gameObject.SetActive(false);
                        }
                        else
                        {
                            var data = e.Current;
                            material.SetData(data);
                            material.gameObject.SetActive(true);
                        }
                    }
                }
            }
            else
            {
                materialText.gameObject.SetActive(false);
                materialView.SetActive(false);
            }

            consumableHeader.gameObject.SetActive(!isEquipment);
            equipmentHeader.gameObject.SetActive(isEquipment);
            if (isEquipment)
            {
                cpText.text = CPHelper.GetCP((Equipment)item).ToString();
            }
            cpText.transform.parent.gameObject.SetActive(isEquipment);
        }