コード例 #1
0
 void SetMode(ISetInventoryModeEvent e)
 {
     _mode = e.Mode;
     // TODO: Verify that the party member is currently in the party
     _activeCharacter = e.Member;
     Rebuild();
 }
コード例 #2
0
        public InventoryOffensiveLabel(PartyCharacterId activeCharacter)
        {
            On <InventoryChangedEvent>(e => _version++);
            On <BlurEvent>(e => Raise(new HoverTextEvent(null)));
            On <HoverEvent>(Hover);

            _activeCharacter = activeCharacter;
            var source = new DynamicText(() =>
            {
                var player = Resolve <IParty>()[_activeCharacter];
                var damage = player?.Apparent.DisplayDamage ?? 0;
                return(new[] { new TextBlock($"{damage}") });
            }, x => _version);

            AttachChild(
                new ButtonFrame(
                    new FixedSize(27, 8,
                                  new HorizontalStack(
                                      new FixedSize(8, 8,
                                                    new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiOffensiveValue)),
                                      new Spacing(1, 0),
                                      new UiText(new LiteralText(":")),
                                      new UiText(source)
                                      )
                                  ))
            {
                State   = ButtonState.Pressed,
                Padding = 0
            }
                );
        }
コード例 #3
0
        public InventoryCharacterPane(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
        {
            _getPage = getPage;
            var page = _getPage();

            _summaryButton = new Button(SummaryButtonId, "I")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Summary
            };
            _statsButton = new Button(StatsButtonId, "II")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Stats
            };
            _miscButton = new Button(MiscButtonId, "III")
            {
                DoubleFrame = true, IsPressed = page == InventoryPage.Misc
            };
            var buttonStack = new HorizontalStack(
                new Padding(84, 0),
                new FixedSize(16, 15, _summaryButton),
                new FixedSize(16, 15, _statsButton),
                new FixedSize(16, 15, _miscButton));

            var stack = new VerticalStack(
                new InventoryActivePageSelector(activeCharacter, getPage),
                new Padding(0, 4),
                buttonStack
                );

            Children.Add(stack);
        }
コード例 #4
0
        public InventoryDefensiveLabel(PartyCharacterId activeCharacter) : base(Handlers)
        {
            _activeCharacter = activeCharacter;

            var source = new DynamicText(() =>
            {
                var player     = Resolve <IParty>()[_activeCharacter];
                var protection = player?.Apparent.Combat.Protection ?? 0;
                return(new[] { new TextBlock($": {protection}") });
            }, x => _version);

            Children.Add(
                new ButtonFrame(
                    new HorizontalStack(
                        new FixedSize(8, 8,
                                      new UiSprite <CoreSpriteId>(CoreSpriteId.UiDefensiveValue)
            {
                Highlighted = true
            }),
                        new Text(source)
                        )
                    )
            {
                State   = ButtonState.Pressed,
                Padding = 0
            }
                );
        }
コード例 #5
0
 public Player(PartyCharacterId id, CharacterSheet sheet) : base(Handlers)
 {
     Id                = id;
     _base             = sheet;
     _inventoryManager = new PlayerInventoryManager(id, _base);
     Children.Add(_inventoryManager);
 }
コード例 #6
0
        // 70 * 128, 4 * 6

        // Tiles are 16x20 => 64x120
        // 1 pix grid between and around, double thick on right and bottom
        // 1 + 16 + 1 + 16 + 1 + 16 + 1 + 16 + 2
        // = 4*1 + 4*16 + 2 = 70
        // Height = 6 * (1+20) + 2 = 128

        // Button Frame @ (0,0): (70,128) border 1
        // Item0: (0,0):(16,20) border 1
        // Item1: (16,0):(16,20) border 1
        // Item5: (0,20):(16,20) border 1
        // ItemIJ: (16i, 20j):(16,20) border 1

        public InventoryBackpackSlot(PartyCharacterId activeCharacter, int slotNumber)
            : base(activeCharacter, BackpackHandlers)
        {
            _slotNumber = slotNumber;
            _sprite     = new UiItemSprite(ItemSpriteId.Nothing);

            var amountSource = new DynamicText(() =>
            {
                GetSlot(out var slotInfo, out _);
                return(slotInfo == null || slotInfo.Amount < 2
                    ? new TextBlock[0]
                    : new[] { new TextBlock(slotInfo.Amount.ToString())
                              {
                                  Alignment = TextAlignment.Right
                              } });
            }, x => _version);

            var text = new Text(amountSource);

            Frame = new ButtonFrame(new FixedPositionStack()
                                    .Add(_sprite, 0, 0, 16, 16)
                                    .Add(text, 0, 20 - 9, 16, 9)
                                    )
            {
                Padding = -1,
                Theme   = new InventorySlotTheme(),
                State   = ButtonState.Pressed
            };

            Children.Add(Frame);
        }
コード例 #7
0
        public InventoryCharacterPane(PartyCharacterId activeCharacter, Func <InventoryPage> getPage, Action <InventoryPage> setPage)
        {
            _getPage = getPage;
            var page = _getPage();

            _summaryButton = new Button("I")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Summary
            }.OnClick(() => setPage(InventoryPage.Summary));

            _statsButton = new Button("II")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Stats
            }.OnClick(() => setPage(InventoryPage.Stats));

            _miscButton = new Button("III")
            {
                DoubleFrame = true,
                IsPressed   = page == InventoryPage.Misc
            }.OnClick(() => setPage(InventoryPage.Misc));

            var buttonStack =
                new FixedPosition(
                    new Rectangle(84, 174, 50, 15),
                    new HorizontalStack(
                        new FixedSize(16, 15, _summaryButton),
                        new FixedSize(16, 15, _statsButton),
                        new FixedSize(16, 15, _miscButton)
                        ));

            AttachChild(buttonStack);
            AttachChild(new InventoryActivePageSelector(activeCharacter, getPage));
        }
コード例 #8
0
        public InventoryScreen(
            ISetInventoryModeEvent modeEvent,
            PartyCharacterId activeCharacter,
            Func <InventoryPage> getPage,
            Action <InventoryPage> setPage) : base(DialogPositioning.TopLeft)
        {
            var leftPane =
                modeEvent.Mode switch
            {
                InventoryMode.Character => (IUiElement) new InventoryCharacterPane(activeCharacter, getPage, setPage),
                InventoryMode.Merchant => new InventoryMerchantPane((MerchantId)modeEvent.Submode),
                InventoryMode.Chest => new InventoryChestPane((ChestId)modeEvent.Submode),
                InventoryMode.LockedChest => new InventoryLockPane((ILockedInventoryEvent)modeEvent),
                InventoryMode.LockedDoor => new InventoryLockPane((ILockedInventoryEvent)modeEvent),
                _ => throw new InvalidOperationException($"Unexpected inventory mode {modeEvent.Mode}")
            };

            var middlePane = new InventoryMidPane(activeCharacter);
            var rightPane  = new InventoryRightPane(
                activeCharacter,
                modeEvent.Mode == InventoryMode.Merchant);

            // var frameDivider = new FrameDivider(135, 0, 4, 192);

            AttachChild(new UiFixedPositionElement <SlabId>(SlabId.SLAB, UiConstants.UiExtents));
            AttachChild(new FixedPosition(new Rectangle(0, 0, 135, UiConstants.ActiveAreaExtents.Height), leftPane));
            AttachChild(new FixedPosition(new Rectangle(142, 0, 134, UiConstants.ActiveAreaExtents.Height), middlePane));
            AttachChild(new FixedPosition(new Rectangle(280, 0, 71, UiConstants.ActiveAreaExtents.Height), rightPane));
        }
    }
コード例 #9
0
 void OpenInventory(PartyCharacterId memberId)
 {
     if (ActiveSceneId != SceneId.Inventory)
     {
         Raise(new PushSceneEvent(SceneId.Inventory));
     }
     Raise(new SetInventoryModeEvent(memberId));
 }
コード例 #10
0
        public Conversation(PartyCharacterId partyMemberId, ICharacterSheet npc)
        {
            On <EndDialogueEvent>(_ => Close());
            On <UnloadMapEvent>(_ => Close());
            On <DataChangeEvent>(OnDataChange);

            _partyMemberId = partyMemberId;
            _npc           = npc ?? throw new ArgumentNullException(nameof(npc));
        }
コード例 #11
0
 public InventoryActivePageSelector(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
 {
     _getPage = getPage;
     _summary = new InventorySummaryPage(activeCharacter);
     _stats   = new InventoryStatsPage(activeCharacter);
     _misc    = new InventoryMiscPage(activeCharacter);
     Children.Add(_summary);
     Children.Add(_stats);
     Children.Add(_misc);
 }
コード例 #12
0
 // Inner area 16x16 w/ 1-pixel button frame
 public InventoryBodyPart(PartyCharacterId activeCharacter, ItemSlotId itemSlotId)
     : base(activeCharacter, SlotHandlers)
 {
     SlotId  = itemSlotId;
     _sprite = new UiItemSprite(ItemSpriteId.Nothing);
     Frame   = new ButtonFrame(new FixedSize(16, 16, _sprite))
     {
         Padding = -1
     };
     Children.Add(Frame);
 }
コード例 #13
0
        public InventoryMidPane(PartyCharacterId activeCharacter, InventoryConfig.PlayerInventory config)
        {
            var background = new FixedPositionStack();

            background.Add(new UiSprite <FullBodyPictureId>((FullBodyPictureId)activeCharacter), 1, -3);
            Children.Add(background);

            var bodyStack = new FixedPositionStack();

            foreach (var bodyPart in config)
            {
                var itemSlotId = bodyPart.Key;
                var position   = bodyPart.Value;
                bodyStack.Add(new InventoryBodyPart(activeCharacter, itemSlotId), (int)position.X, (int)position.Y);
            }

            var frame = new ButtonFrame(bodyStack)
            {
                Theme = new FrameTheme()
            };
            var labelStack = new HorizontalStack(
                new InventoryOffensiveLabel(activeCharacter),
                new InventoryWeightLabel(activeCharacter),
                new InventoryDefensiveLabel(activeCharacter)
                );

            var mainStack = new VerticalStack(
                new Header(new DynamicText(() =>
            {
                var member   = Resolve <IParty>()[activeCharacter];
                var settings = Resolve <ISettings>();
                if (member == null)
                {
                    return(new TextBlock[0]);
                }

                var name = member.Apparent.GetName(settings.Gameplay.Language);
                return(new[] { new TextBlock(name)
                               {
                                   Alignment = TextAlignment.Center
                               } });
            })),
                new HorizontalStack(
                    new Padding(3, 0),
                    frame,
                    new Padding(3, 0)),
                labelStack
                );

            Children.Add(mainStack);
        }
コード例 #14
0
ファイル: Player.cs プロジェクト: Metibor/ualbion
        public Player(PartyCharacterId id, CharacterSheet sheet)
        {
            On <InventoryChangedEvent>(InventoryChanged);
            On <EngineUpdateEvent>(EngineUpdate);
            On <SetPlayerStatusUiPositionEvent>(e => { if (id == e.Id)
                                                       {
                                                           StatusBarUiPosition = new Vector2(e.CentreX, e.CentreY);
                                                       }
                                                });

            Id       = id;
            _base    = sheet ?? throw new ArgumentNullException(nameof(sheet));
            Apparent = new InterpolatedCharacterSheet(() => _lastEffective, () => Effective, () => _lerp);
        }
コード例 #15
0
        public InventoryMiscPage(PartyCharacterId activeCharacter)
        {
            StringId S(SystemTextId id) => new StringId(AssetType.SystemText, 0, (int)id);

            var stack = new VerticalStack(
                new Header(S(SystemTextId.Inv3_Conditions)),
                new Padding(0, 64),
                new Header(S(SystemTextId.Inv3_Languages)),
                new Padding(0, 23),
                new Header(S(SystemTextId.Inv3_TemporarySpells)),
                new Padding(0, 45),
                new Button(CombatPositionButtonId, S(SystemTextId.Inv3_CombatPositions))
                );

            Children.Add(stack);
        }
コード例 #16
0
        public InventoryWeightLabel(PartyCharacterId activeCharacter) : base(Handlers)
        {
            _activeCharacter = activeCharacter;

            _hoverSource = new DynamicText(() =>
            {
                var assets   = Resolve <IAssetManager>();
                var settings = Resolve <ISettings>();
                var player   = Resolve <IParty>()[_activeCharacter];
                if (player == null)
                {
                    return(new TextBlock[0]);
                }

                // Carried Weight : %ld of %ld g
                var template = assets.LoadString(SystemTextId.Inv_CarriedWeightNdOfNdG, settings.Gameplay.Language);
                var(text, _) = new TextFormatter(assets, settings.Gameplay.Language).Format(template, player.Apparent.TotalWeight, player.Apparent.MaxWeight);
                return(text);
            }, x => _version);

            var source = new DynamicText(() =>
            {
                var assets   = Resolve <IAssetManager>();
                var settings = Resolve <ISettings>();
                var player   = Resolve <IParty>()[_activeCharacter];
                if (player == null)
                {
                    return(new TextBlock[0]);
                }

                int weight   = player.Apparent.TotalWeight / 1000;
                var template = assets.LoadString(SystemTextId.Inv_WeightNKg, settings.Gameplay.Language); // Weight : %d Kg
                return(new
                       TextFormatter(assets, settings.Gameplay.Language)
                       .NoWrap()
                       .Centre()
                       .Format(template, weight)
                       .Item1);
            }, x => _version);

            Children.Add(new ButtonFrame(new Text(source))
            {
                State   = ButtonState.Pressed,
                Padding = 0
            });
        }
コード例 #17
0
        void SetDisplayedPartyMember(PartyCharacterId?member)
        {
            if (Resolve <ISceneManager>().ActiveSceneId != SceneId.Inventory)
            {
                Raise(new PushSceneEvent(SceneId.Inventory));
            }

            var party = Resolve <IParty>();

            member ??= party.Leader;
            if (party.WalkOrder.All(x => x.Id != member.Value))
            {
                member = party.Leader;
            }

            _activeCharacter = member.Value;

            Raise(new SetContextEvent(ContextType.Inventory, AssetType.PartyMember, (int)member.Value));
            Rebuild();
        }
コード例 #18
0
        public InventorySummaryPage(PartyCharacterId activeMember)
        {
            _activeMember = activeMember;
            var background = new FixedPosition(
                new Rectangle(0, 26, 135, 144),
                new UiSprite <SmallPortraitId>((SmallPortraitId)(int)activeMember));

            var summarySource       = new DynamicText(BuildSummary);
            var pointsSource        = new DynamicText(BuildPoints);
            var pointsHeadingSource = new DynamicText(BuildPointsHeadings);

            var frameTheme = new FrameTheme();
            var stack      =
                new HorizontalStack(
                    new Padding(4, 0),
                    new VerticalStack(
                        new Padding(0, 4),
                        new ButtonFrame(new FixedSize(125, 41, new Text(summarySource)))
            {
                Theme = frameTheme, State = ButtonState.Pressed
            },
                        new Padding(0, 80),
                        new ButtonFrame(
                            new FixedSize(125, 41,
                                          new HorizontalStack(
                                              new Text(pointsHeadingSource),
                                              new Padding(5, 0),
                                              new FixedSize(41, 41,
                                                            new Text(pointsSource)
                                                            ))))
            {
                Theme = frameTheme, State = ButtonState.Pressed
            }
                        ),
                    new Padding(4, 0)
                    );

            Children.Add(background);
            Children.Add(stack);
        }
コード例 #19
0
        public InventorySummaryPage(PartyCharacterId activeMember)
        {
            _activeMember = activeMember;

            var summarySource       = new DynamicText(BuildSummary);
            var pointsSource        = new DynamicText(BuildPoints);
            var pointsHeadingSource = new DynamicText(BuildPointsHeadings);

            var stack =
                new HorizontalStack(
                    new Spacing(4, 0),
                    new VerticalStack(
                        new Spacing(0, 4),
                        new GroupingFrame(new FixedSize(125, 41, new UiText(summarySource))),
                        new Spacing(0, 80),
                        new GroupingFrame(
                            new FixedSize(125, 41,
                                          new HorizontalStack(
                                              new UiText(pointsHeadingSource),
                                              new Spacing(5, 0),
                                              new FixedSize(41, 41,
                                                            new UiText(pointsSource)
                                                            ))))
                        ),
                    new Spacing(4, 0)
                    );

            AttachChild(new LayerStack(
                            new FixedPosition(
                                new Rectangle(0, 25, 135, 145),
                                new UiSpriteElement <SmallPortraitId>((SmallPortraitId)(int)activeMember)
            {
                Flags = SpriteFlags.GradientPixels
            }),
                            stack));
        }
コード例 #20
0
 public InventoryActivePageSelector(PartyCharacterId activeCharacter, Func <InventoryPage> getPage)
 {
     _activeCharacter = activeCharacter;
     _getPage         = getPage;
 }
コード例 #21
0
 public SetInventoryMerchantModeEvent(MerchantId merchantId, PartyCharacterId member)
 {
     MerchantId = merchantId;
     Member     = member;
 }
コード例 #22
0
 public IPlayer this[PartyCharacterId id] => _statusBarOrder.FirstOrDefault(x => x.Id == id);
コード例 #23
0
 protected InventorySlot(PartyCharacterId activeCharacter, IDictionary <Type, Handler> handlers)
     : base(handlers)
 {
     ActiveCharacter = activeCharacter;
 }
コード例 #24
0
 public InventoryGiveItemEvent(PartyCharacterId memberId)
 {
     MemberId = memberId;
 }
コード例 #25
0
 public SetPartyLeaderEvent(PartyCharacterId id)
 {
     PartyMemberId = id;
 }
コード例 #26
0
 public ISetInventoryModeEvent CloneForMember(PartyCharacterId member) => new MerchantEvent(MerchantId, member);
コード例 #27
0
        public InventoryRightPane(PartyCharacterId activeCharacter, string exitButtonId, bool showTotalPartyGold)
            : base(Handlers)
        {
            var header = new Header(new StringId(AssetType.SystemText, 0, (int)SystemTextId.Inv_Backpack));

            var slotSpans = new IUiElement[InventoryHeight];

            for (int j = 0; j < InventoryHeight; j++)
            {
                var slotsInRow = new IUiElement[InventoryWidth];
                for (int i = 0; i < InventoryWidth; i++)
                {
                    int index = j * InventoryWidth + i;
                    slotsInRow[i] = new InventoryBackpackSlot(activeCharacter, index);
                }
                slotSpans[j] = new HorizontalStack(slotsInRow);
            }

            var slotStack = new VerticalStack(slotSpans);
            //var slotFrame = new ButtonFrame(slotStack) { State = ButtonState.Pressed, Theme = new FrameTheme() };

            HorizontalStack moneyAndFoodStack;

            if (showTotalPartyGold)
            {
                var money = new Button(GoldSummaryButtonId,
                                       new VerticalStack(
                                           new Padding(64, 0),
                                           new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiGold)
                {
                    Highlighted = true
                },
                                           new Text("Total party gold $10.0")
                                           )
                {
                    Greedy = false
                }
                                       )
                {
                    IsPressed = true
                };
                moneyAndFoodStack = new HorizontalStack(money);
            }
            else
            {
                var goldSource = new DynamicText(() =>
                {
                    var player = Resolve <IParty>()[activeCharacter];
                    var gold   = player?.Apparent.Inventory.Gold ?? 0;
                    return(new[] { new TextBlock($"{gold / 10}.{gold % 10}") });
                }, x => _version);

                var goldButton = new Button(GoldButtonId,
                                            new VerticalStack(
                                                new Padding(31, 0),
                                                new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiGold),
                                                new Text(goldSource)
                                                )
                {
                    Greedy = false
                });

                var foodSource = new DynamicText(() =>
                {
                    var player = Resolve <IParty>()[activeCharacter];
                    var food   = player?.Apparent.Inventory.Rations ?? 0;
                    return(new[] { new TextBlock(food.ToString()) });
                }, x => _version);

                var foodButton = new Button(FoodButtonId,
                                            new VerticalStack(
                                                new Padding(31, 0),
                                                new UiSpriteElement <CoreSpriteId>(CoreSpriteId.UiFood),
                                                new Text(foodSource)
                                                )
                {
                    Greedy = false
                });
                moneyAndFoodStack = new HorizontalStack(goldButton, foodButton);
            }

            var stack = new VerticalStack(
                header,
                slotStack, // slotFrame,
                new Padding(0, 2),
                moneyAndFoodStack,
                new Padding(0, 9),
                new InventoryExitButton(exitButtonId)
                )
            {
                Greedy = false
            };

            Children.Add(stack);
        }
コード例 #28
0
 public PlayerInventoryManager(PartyCharacterId id, CharacterSheet sheet) : base(Handlers)
 {
     _id      = id;
     _base    = sheet;
     Apparent = new InterpolatedCharacterSheet(() => _lastEffective, () => _effective, () => _lerp);
 }
コード例 #29
0
 public SetActiveMemberEvent(PartyCharacterId memberId)
 {
     MemberId = memberId;
 }
コード例 #30
0
ファイル: AssetIdExtensions.cs プロジェクト: Metibor/ualbion
 public static SmallPortraitId ToPortraitId(this PartyCharacterId partyCharacterId) =>
 partyCharacterId switch
 {